feat: enhance admin ui with responsive design and ux improvements
- add podcast sidebar navigation - add podcast dashboard with latest episodes - add pagination to podcast episodes - add components helper to reuse ui components (button, data_table, etc.) - enhance podcast and episode forms by splitting them into form sections - add hint tooltips to podcast and episode forms - transform radio inputs as buttons for better ux - replace explicit field by parental_advisory - replace author field by publisher - add podcasts_categories table to set multiple categories - use choices.js to enhance multiselect fields - update Language files - update js dependencies to latest versions closes #31, #9
|
|
@ -17,9 +17,9 @@ Javascript dependencies:
|
||||||
|
|
||||||
- [rollup](https://rollupjs.org/) ([MIT License](https://github.com/rollup/rollup/blob/master/LICENSE.md))
|
- [rollup](https://rollupjs.org/) ([MIT License](https://github.com/rollup/rollup/blob/master/LICENSE.md))
|
||||||
- [tailwindcss](https://tailwindcss.com/) ([MIT License](https://github.com/tailwindcss/tailwindcss/blob/master/LICENSE))
|
- [tailwindcss](https://tailwindcss.com/) ([MIT License](https://github.com/tailwindcss/tailwindcss/blob/master/LICENSE))
|
||||||
- [CodeMirror](https://github.com/codemirror/CodeMirror) ([MIT License](https://github.com/codemirror/CodeMirror/blob/master/LICENSE))
|
|
||||||
- [ProseMirror](https://prosemirror.net/) ([MIT License](https://github.com/ProseMirror/prosemirror/blob/master/LICENSE))
|
- [ProseMirror](https://prosemirror.net/) ([MIT License](https://github.com/ProseMirror/prosemirror/blob/master/LICENSE))
|
||||||
- [D3: Data-Driven Documents](https://d3js.org) ([BSD 3-Clause "New" or "Revised" License](https://github.com/d3/d3/blob/master/LICENSE))
|
- [D3: Data-Driven Documents](https://d3js.org) ([BSD 3-Clause "New" or "Revised" License](https://github.com/d3/d3/blob/master/LICENSE))
|
||||||
|
- [Choices.js](https://joshuajohnson.co.uk/Choices/) ([MIT License](https://github.com/jshjohnson/Choices/blob/master/LICENSE))
|
||||||
|
|
||||||
Other:
|
Other:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ class Pager extends BaseConfig
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
public $templates = [
|
public $templates = [
|
||||||
'default_full' => 'CodeIgniter\Pager\Views\default_full',
|
'default_full' => 'App\Views\pager\default_full',
|
||||||
'default_simple' => 'CodeIgniter\Pager\Views\default_simple',
|
'default_simple' => 'CodeIgniter\Pager\Views\default_simple',
|
||||||
'default_head' => 'CodeIgniter\Pager\Views\default_head',
|
'default_head' => 'CodeIgniter\Pager\Views\default_head',
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ class BaseController extends Controller
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $helpers = ['auth', 'breadcrumb', 'svg'];
|
protected $helpers = ['auth', 'breadcrumb', 'svg', 'components'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
|
|
|
||||||
|
|
@ -166,7 +166,7 @@ class Contributor extends BaseController
|
||||||
|
|
||||||
public function remove()
|
public function remove()
|
||||||
{
|
{
|
||||||
if ($this->podcast->owner_id == $this->user->id) {
|
if ($this->podcast->created_by == $this->user->id) {
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->with('errors', [
|
->with('errors', [
|
||||||
|
|
|
||||||
|
|
@ -45,8 +45,14 @@ class Episode extends BaseController
|
||||||
|
|
||||||
public function list()
|
public function list()
|
||||||
{
|
{
|
||||||
|
$episodes = (new EpisodeModel())
|
||||||
|
->where('podcast_id', $this->podcast->id)
|
||||||
|
->orderBy('created_at', 'desc');
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'podcast' => $this->podcast,
|
'podcast' => $this->podcast,
|
||||||
|
'episodes' => $episodes->paginate(10),
|
||||||
|
'pager' => $episodes->pager,
|
||||||
];
|
];
|
||||||
|
|
||||||
replace_breadcrumb_params([
|
replace_breadcrumb_params([
|
||||||
|
|
@ -57,7 +63,10 @@ class Episode extends BaseController
|
||||||
|
|
||||||
public function view()
|
public function view()
|
||||||
{
|
{
|
||||||
$data = ['episode' => $this->episode];
|
$data = [
|
||||||
|
'podcast' => $this->podcast,
|
||||||
|
'episode' => $this->episode,
|
||||||
|
];
|
||||||
|
|
||||||
replace_breadcrumb_params([
|
replace_breadcrumb_params([
|
||||||
0 => $this->podcast->title,
|
0 => $this->podcast->title,
|
||||||
|
|
@ -105,7 +114,10 @@ class Episode extends BaseController
|
||||||
'enclosure' => $this->request->getFile('enclosure'),
|
'enclosure' => $this->request->getFile('enclosure'),
|
||||||
'description' => $this->request->getPost('description'),
|
'description' => $this->request->getPost('description'),
|
||||||
'image' => $this->request->getFile('image'),
|
'image' => $this->request->getFile('image'),
|
||||||
'explicit' => $this->request->getPost('explicit') == 'yes',
|
'parental_advisory' =>
|
||||||
|
$this->request->getPost('parental_advisory') !== 'undefined'
|
||||||
|
? $this->request->getPost('parental_advisory')
|
||||||
|
: null,
|
||||||
'number' => $this->request->getPost('episode_number'),
|
'number' => $this->request->getPost('episode_number'),
|
||||||
'season_number' => $this->request->getPost('season_number'),
|
'season_number' => $this->request->getPost('season_number'),
|
||||||
'type' => $this->request->getPost('type'),
|
'type' => $this->request->getPost('type'),
|
||||||
|
|
@ -120,14 +132,33 @@ class Episode extends BaseController
|
||||||
|
|
||||||
$episodeModel = new EpisodeModel();
|
$episodeModel = new EpisodeModel();
|
||||||
|
|
||||||
if (!$episodeModel->save($newEpisode)) {
|
if (!($newEpisodeId = $episodeModel->insert($newEpisode, true))) {
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->withInput()
|
->withInput()
|
||||||
->with('errors', $episodeModel->errors());
|
->with('errors', $episodeModel->errors());
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('episode-list', [$this->podcast->id]);
|
// update podcast's episode_description_footer if changed
|
||||||
|
$podcastModel = new PodcastModel();
|
||||||
|
|
||||||
|
if ($this->podcast->hasChanged('episode_description_footer')) {
|
||||||
|
$this->podcast->episode_description_footer = $this->request->getPost(
|
||||||
|
'description_footer'
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!$podcastModel->update($this->podcast->id, $this->podcast)) {
|
||||||
|
return redirect()
|
||||||
|
->back()
|
||||||
|
->withInput()
|
||||||
|
->with('errors', $podcastModel->errors());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->route('episode-view', [
|
||||||
|
$this->podcast->id,
|
||||||
|
$newEpisodeId,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit()
|
public function edit()
|
||||||
|
|
@ -135,6 +166,7 @@ class Episode extends BaseController
|
||||||
helper(['form']);
|
helper(['form']);
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
|
'podcast' => $this->podcast,
|
||||||
'episode' => $this->episode,
|
'episode' => $this->episode,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -167,7 +199,10 @@ class Episode extends BaseController
|
||||||
$this->episode->title = $this->request->getPost('title');
|
$this->episode->title = $this->request->getPost('title');
|
||||||
$this->episode->slug = $this->request->getPost('slug');
|
$this->episode->slug = $this->request->getPost('slug');
|
||||||
$this->episode->description = $this->request->getPost('description');
|
$this->episode->description = $this->request->getPost('description');
|
||||||
$this->episode->explicit = $this->request->getPost('explicit') == 'yes';
|
$this->episode->parental_advisory =
|
||||||
|
$this->request->getPost('parental_advisory') !== 'undefined'
|
||||||
|
? $this->request->getPost('parental_advisory')
|
||||||
|
: null;
|
||||||
$this->episode->number = $this->request->getPost('episode_number');
|
$this->episode->number = $this->request->getPost('episode_number');
|
||||||
$this->episode->season_number = $this->request->getPost('season_number')
|
$this->episode->season_number = $this->request->getPost('season_number')
|
||||||
? $this->request->getPost('season_number')
|
? $this->request->getPost('season_number')
|
||||||
|
|
@ -191,14 +226,32 @@ class Episode extends BaseController
|
||||||
|
|
||||||
$episodeModel = new EpisodeModel();
|
$episodeModel = new EpisodeModel();
|
||||||
|
|
||||||
if (!$episodeModel->save($this->episode)) {
|
if (!$episodeModel->update($this->episode->id, $this->episode)) {
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->withInput()
|
->withInput()
|
||||||
->with('errors', $episodeModel->errors());
|
->with('errors', $episodeModel->errors());
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('episode-list', [$this->podcast->id]);
|
// update podcast's episode_description_footer if changed
|
||||||
|
$this->podcast->episode_description_footer = $this->request->getPost(
|
||||||
|
'description_footer'
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($this->podcast->hasChanged('episode_description_footer')) {
|
||||||
|
$podcastModel = new PodcastModel();
|
||||||
|
if (!$podcastModel->update($this->podcast->id, $this->podcast)) {
|
||||||
|
return redirect()
|
||||||
|
->back()
|
||||||
|
->withInput()
|
||||||
|
->with('errors', $podcastModel->errors());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->route('episode-view', [
|
||||||
|
$this->podcast->id,
|
||||||
|
$this->episode->id,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete()
|
public function delete()
|
||||||
|
|
|
||||||
|
|
@ -57,9 +57,8 @@ class MyAccount extends BaseController
|
||||||
}
|
}
|
||||||
|
|
||||||
user()->password = $this->request->getPost('new_password');
|
user()->password = $this->request->getPost('new_password');
|
||||||
$userModel->save(user());
|
|
||||||
|
|
||||||
if (!$userModel->save(user())) {
|
if (!$userModel->update(user()->id, user())) {
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->withInput()
|
->withInput()
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ class Page extends BaseController
|
||||||
|
|
||||||
$pageModel = new PageModel();
|
$pageModel = new PageModel();
|
||||||
|
|
||||||
if (!$pageModel->save($page)) {
|
if (!$pageModel->insert($page)) {
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->withInput()
|
->withInput()
|
||||||
|
|
@ -92,7 +92,7 @@ class Page extends BaseController
|
||||||
|
|
||||||
$pageModel = new PageModel();
|
$pageModel = new PageModel();
|
||||||
|
|
||||||
if (!$pageModel->save($this->page)) {
|
if (!$pageModel->update($this->page->id, $this->page)) {
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->withInput()
|
->withInput()
|
||||||
|
|
|
||||||
|
|
@ -94,21 +94,20 @@ class Podcast extends BaseController
|
||||||
'title' => $this->request->getPost('title'),
|
'title' => $this->request->getPost('title'),
|
||||||
'name' => $this->request->getPost('name'),
|
'name' => $this->request->getPost('name'),
|
||||||
'description' => $this->request->getPost('description'),
|
'description' => $this->request->getPost('description'),
|
||||||
'episode_description_footer' => $this->request->getPost(
|
|
||||||
'episode_description_footer'
|
|
||||||
),
|
|
||||||
'image' => $this->request->getFile('image'),
|
'image' => $this->request->getFile('image'),
|
||||||
'language' => $this->request->getPost('language'),
|
'language' => $this->request->getPost('language'),
|
||||||
'category_id' => $this->request->getPost('category'),
|
'category_id' => $this->request->getPost('category'),
|
||||||
'explicit' => $this->request->getPost('explicit') == 'yes',
|
'parental_advisory' =>
|
||||||
'author' => $this->request->getPost('author'),
|
$this->request->getPost('parental_advisory') !== 'undefined'
|
||||||
|
? $this->request->getPost('parental_advisory')
|
||||||
|
: null,
|
||||||
'owner_name' => $this->request->getPost('owner_name'),
|
'owner_name' => $this->request->getPost('owner_name'),
|
||||||
'owner_email' => $this->request->getPost('owner_email'),
|
'owner_email' => $this->request->getPost('owner_email'),
|
||||||
|
'publisher' => $this->request->getPost('publisher'),
|
||||||
'type' => $this->request->getPost('type'),
|
'type' => $this->request->getPost('type'),
|
||||||
'copyright' => $this->request->getPost('copyright'),
|
'copyright' => $this->request->getPost('copyright'),
|
||||||
'block' => $this->request->getPost('block') == 'yes',
|
'block' => $this->request->getPost('block') === 'yes',
|
||||||
'complete' => $this->request->getPost('complete') == 'yes',
|
'complete' => $this->request->getPost('complete') === 'yes',
|
||||||
'custom_html_head' => $this->request->getPost('custom_html_head'),
|
|
||||||
'created_by' => user(),
|
'created_by' => user(),
|
||||||
'updated_by' => user(),
|
'updated_by' => user(),
|
||||||
]);
|
]);
|
||||||
|
|
@ -119,7 +118,7 @@ class Podcast extends BaseController
|
||||||
$db->transStart();
|
$db->transStart();
|
||||||
|
|
||||||
if (!($newPodcastId = $podcastModel->insert($podcast, true))) {
|
if (!($newPodcastId = $podcastModel->insert($podcast, true))) {
|
||||||
$db->transComplete();
|
$db->transRollback();
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->withInput()
|
->withInput()
|
||||||
|
|
@ -135,6 +134,12 @@ class Podcast extends BaseController
|
||||||
$podcastAdminGroup->id
|
$podcastAdminGroup->id
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// set Podcast categories
|
||||||
|
(new CategoryModel())->setPodcastCategories(
|
||||||
|
$newPodcastId,
|
||||||
|
$this->request->getPost('other_categories')
|
||||||
|
);
|
||||||
|
|
||||||
$db->transComplete();
|
$db->transComplete();
|
||||||
|
|
||||||
return redirect()->route('podcast-view', [$newPodcastId]);
|
return redirect()->route('podcast-view', [$newPodcastId]);
|
||||||
|
|
@ -205,20 +210,22 @@ class Podcast extends BaseController
|
||||||
'image' => download_file($nsItunes->image->attributes()),
|
'image' => download_file($nsItunes->image->attributes()),
|
||||||
'language' => $this->request->getPost('language'),
|
'language' => $this->request->getPost('language'),
|
||||||
'category_id' => $this->request->getPost('category'),
|
'category_id' => $this->request->getPost('category'),
|
||||||
'explicit' => empty($nsItunes->explicit)
|
'parental_advisory' => empty($nsItunes->explicit)
|
||||||
? false
|
? null
|
||||||
: $nsItunes->explicit == 'yes',
|
: (in_array($nsItunes->explicit, ['yes', 'true'])
|
||||||
'author' => $nsItunes->author,
|
? 'explicit'
|
||||||
|
: null),
|
||||||
'owner_name' => $nsItunes->owner->name,
|
'owner_name' => $nsItunes->owner->name,
|
||||||
'owner_email' => $nsItunes->owner->email,
|
'owner_email' => $nsItunes->owner->email,
|
||||||
|
'publisher' => $nsItunes->author,
|
||||||
'type' => empty($nsItunes->type) ? 'episodic' : $nsItunes->type,
|
'type' => empty($nsItunes->type) ? 'episodic' : $nsItunes->type,
|
||||||
'copyright' => $feed->channel[0]->copyright,
|
'copyright' => $feed->channel[0]->copyright,
|
||||||
'block' => empty($nsItunes->block)
|
'block' => empty($nsItunes->block)
|
||||||
? false
|
? false
|
||||||
: $nsItunes->block == 'yes',
|
: $nsItunes->block === 'yes',
|
||||||
'complete' => empty($nsItunes->complete)
|
'complete' => empty($nsItunes->complete)
|
||||||
? false
|
? false
|
||||||
: $nsItunes->complete == 'yes',
|
: $nsItunes->complete === 'yes',
|
||||||
'created_by' => user(),
|
'created_by' => user(),
|
||||||
'updated_by' => user(),
|
'updated_by' => user(),
|
||||||
]);
|
]);
|
||||||
|
|
@ -229,7 +236,7 @@ class Podcast extends BaseController
|
||||||
$db->transStart();
|
$db->transStart();
|
||||||
|
|
||||||
if (!($newPodcastId = $podcastModel->insert($podcast, true))) {
|
if (!($newPodcastId = $podcastModel->insert($podcast, true))) {
|
||||||
$db->transComplete();
|
$db->transRollback();
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->withInput()
|
->withInput()
|
||||||
|
|
@ -265,7 +272,7 @@ class Podcast extends BaseController
|
||||||
);
|
);
|
||||||
|
|
||||||
$slug = slugify(
|
$slug = slugify(
|
||||||
$this->request->getPost('slug_field') == 'title'
|
$this->request->getPost('slug_field') === 'title'
|
||||||
? $item->title
|
? $item->title
|
||||||
: basename($item->link)
|
: basename($item->link)
|
||||||
);
|
);
|
||||||
|
|
@ -285,22 +292,23 @@ class Podcast extends BaseController
|
||||||
'slug' => $slug,
|
'slug' => $slug,
|
||||||
'enclosure' => download_file($item->enclosure->attributes()),
|
'enclosure' => download_file($item->enclosure->attributes()),
|
||||||
'description' => $converter->convert(
|
'description' => $converter->convert(
|
||||||
$this->request->getPost('description_field') == 'summary'
|
$this->request->getPost('description_field') === 'summary'
|
||||||
? $nsItunes->summary
|
? $nsItunes->summary
|
||||||
: ($this->request->getPost('description_field') ==
|
: ($this->request->getPost('description_field') ===
|
||||||
'subtitle_summary'
|
'subtitle_summary'
|
||||||
? '<h3>' .
|
? $nsItunes->subtitle . "\n" . $nsItunes->summary
|
||||||
$nsItunes->subtitle .
|
|
||||||
"</h3>\n" .
|
|
||||||
$nsItunes->summary
|
|
||||||
: $item->description)
|
: $item->description)
|
||||||
),
|
),
|
||||||
'image' => empty($nsItunes->image->attributes())
|
'image' => empty($nsItunes->image->attributes())
|
||||||
? null
|
? null
|
||||||
: download_file($nsItunes->image->attributes()),
|
: download_file($nsItunes->image->attributes()),
|
||||||
'explicit' => $nsItunes->explicit == 'yes',
|
'explicit' => $nsItunes->explicit
|
||||||
|
? (in_array($nsItunes->explicit, ['yes', 'true'])
|
||||||
|
? 'explicit'
|
||||||
|
: null)
|
||||||
|
: null,
|
||||||
'number' =>
|
'number' =>
|
||||||
$this->request->getPost('force_renumber') == 'yes'
|
$this->request->getPost('force_renumber') === 'yes'
|
||||||
? $itemNumber
|
? $itemNumber
|
||||||
: $nsItunes->episode,
|
: $nsItunes->episode,
|
||||||
'season_number' => empty(
|
'season_number' => empty(
|
||||||
|
|
@ -313,7 +321,7 @@ class Podcast extends BaseController
|
||||||
: $nsItunes->episodeType,
|
: $nsItunes->episodeType,
|
||||||
'block' => empty($nsItunes->block)
|
'block' => empty($nsItunes->block)
|
||||||
? false
|
? false
|
||||||
: $nsItunes->block == 'yes',
|
: $nsItunes->block === 'yes',
|
||||||
'created_by' => user(),
|
'created_by' => user(),
|
||||||
'updated_by' => user(),
|
'updated_by' => user(),
|
||||||
]);
|
]);
|
||||||
|
|
@ -324,8 +332,8 @@ class Podcast extends BaseController
|
||||||
|
|
||||||
$episodeModel = new EpisodeModel();
|
$episodeModel = new EpisodeModel();
|
||||||
|
|
||||||
if (!$episodeModel->save($newEpisode)) {
|
if (!$episodeModel->insert($newEpisode)) {
|
||||||
// FIX: What shall we do?
|
// FIXME: What shall we do?
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->withInput()
|
->withInput()
|
||||||
|
|
@ -335,7 +343,7 @@ class Podcast extends BaseController
|
||||||
|
|
||||||
$db->transComplete();
|
$db->transComplete();
|
||||||
|
|
||||||
return redirect()->route('podcast-list');
|
return redirect()->route('podcast-view', [$newPodcastId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit()
|
public function edit()
|
||||||
|
|
@ -372,9 +380,6 @@ class Podcast extends BaseController
|
||||||
$this->podcast->title = $this->request->getPost('title');
|
$this->podcast->title = $this->request->getPost('title');
|
||||||
$this->podcast->name = $this->request->getPost('name');
|
$this->podcast->name = $this->request->getPost('name');
|
||||||
$this->podcast->description = $this->request->getPost('description');
|
$this->podcast->description = $this->request->getPost('description');
|
||||||
$this->podcast->episode_description_footer = $this->request->getPost(
|
|
||||||
'episode_description_footer'
|
|
||||||
);
|
|
||||||
|
|
||||||
$image = $this->request->getFile('image');
|
$image = $this->request->getFile('image');
|
||||||
if ($image->isValid()) {
|
if ($image->isValid()) {
|
||||||
|
|
@ -382,29 +387,50 @@ class Podcast extends BaseController
|
||||||
}
|
}
|
||||||
$this->podcast->language = $this->request->getPost('language');
|
$this->podcast->language = $this->request->getPost('language');
|
||||||
$this->podcast->category_id = $this->request->getPost('category');
|
$this->podcast->category_id = $this->request->getPost('category');
|
||||||
$this->podcast->explicit = $this->request->getPost('explicit') == 'yes';
|
$this->podcast->parental_advisory =
|
||||||
$this->podcast->author = $this->request->getPost('author');
|
$this->request->getPost('parental_advisory') !== 'undefined'
|
||||||
|
? $this->request->getPost('parental_advisory')
|
||||||
|
: null;
|
||||||
|
$this->podcast->publisher = $this->request->getPost('publisher');
|
||||||
$this->podcast->owner_name = $this->request->getPost('owner_name');
|
$this->podcast->owner_name = $this->request->getPost('owner_name');
|
||||||
$this->podcast->owner_email = $this->request->getPost('owner_email');
|
$this->podcast->owner_email = $this->request->getPost('owner_email');
|
||||||
$this->podcast->type = $this->request->getPost('type');
|
$this->podcast->type = $this->request->getPost('type');
|
||||||
$this->podcast->copyright = $this->request->getPost('copyright');
|
$this->podcast->copyright = $this->request->getPost('copyright');
|
||||||
$this->podcast->block = $this->request->getPost('block') == 'yes';
|
$this->podcast->block = $this->request->getPost('block') === 'yes';
|
||||||
$this->podcast->complete = $this->request->getPost('complete') == 'yes';
|
$this->podcast->complete =
|
||||||
$this->podcast->custom_html_head = $this->request->getPost(
|
$this->request->getPost('complete') === 'yes';
|
||||||
'custom_html_head'
|
|
||||||
);
|
|
||||||
$this->updated_by = user();
|
$this->updated_by = user();
|
||||||
|
|
||||||
$podcastModel = new PodcastModel();
|
$db = \Config\Database::connect();
|
||||||
|
$db->transStart();
|
||||||
|
|
||||||
if (!$podcastModel->save($this->podcast)) {
|
$podcastModel = new PodcastModel();
|
||||||
|
if (!$podcastModel->update($this->podcast->id, $this->podcast)) {
|
||||||
|
$db->transRollback();
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->withInput()
|
->withInput()
|
||||||
->with('errors', $podcastModel->errors());
|
->with('errors', $podcastModel->errors());
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('podcast-list');
|
// set Podcast categories
|
||||||
|
(new CategoryModel())->setPodcastCategories(
|
||||||
|
$this->podcast->id,
|
||||||
|
$this->request->getPost('other_categories')
|
||||||
|
);
|
||||||
|
|
||||||
|
$db->transComplete();
|
||||||
|
|
||||||
|
return redirect()->route('podcast-view', [$this->podcast->id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function latestEpisodes(int $limit)
|
||||||
|
{
|
||||||
|
$episodes = (new EpisodeModel())
|
||||||
|
->orderBy('created_at', 'desc')
|
||||||
|
->findAll($limit);
|
||||||
|
|
||||||
|
return view('admin/podcast/latest_episodes', ['episodes' => $episodes]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete()
|
public function delete()
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ class User extends BaseController
|
||||||
// Force user to reset his password on first connection
|
// Force user to reset his password on first connection
|
||||||
$user->forcePasswordReset();
|
$user->forcePasswordReset();
|
||||||
|
|
||||||
if (!$userModel->save($user)) {
|
if (!$userModel->insert($user)) {
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->withInput()
|
->withInput()
|
||||||
|
|
@ -150,7 +150,7 @@ class User extends BaseController
|
||||||
$userModel = new UserModel();
|
$userModel = new UserModel();
|
||||||
$this->user->forcePasswordReset();
|
$this->user->forcePasswordReset();
|
||||||
|
|
||||||
if (!$userModel->save($this->user)) {
|
if (!$userModel->update($this->user->id, $this->user)) {
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->with('errors', $userModel->errors());
|
->with('errors', $userModel->errors());
|
||||||
|
|
@ -184,7 +184,7 @@ class User extends BaseController
|
||||||
// TODO: add ban reason?
|
// TODO: add ban reason?
|
||||||
$this->user->ban('');
|
$this->user->ban('');
|
||||||
|
|
||||||
if (!$userModel->save($this->user)) {
|
if (!$userModel->update($this->user->id, $this->user)) {
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->with('errors', $userModel->errors());
|
->with('errors', $userModel->errors());
|
||||||
|
|
@ -205,7 +205,7 @@ class User extends BaseController
|
||||||
$userModel = new UserModel();
|
$userModel = new UserModel();
|
||||||
$this->user->unBan();
|
$this->user->unBan();
|
||||||
|
|
||||||
if (!$userModel->save($this->user)) {
|
if (!$userModel->update($this->user->id, $this->user)) {
|
||||||
return redirect()
|
return redirect()
|
||||||
->back()
|
->back()
|
||||||
->with('errors', $userModel->errors());
|
->with('errors', $userModel->errors());
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,14 @@ use App\Entities\User;
|
||||||
|
|
||||||
class Auth extends \Myth\Auth\Controllers\AuthController
|
class Auth extends \Myth\Auth\Controllers\AuthController
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* An array of helpers to be automatically loaded
|
||||||
|
* upon class instantiation.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $helpers = ['components'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempt to register a new user.
|
* Attempt to register a new user.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ class BaseController extends Controller
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $helpers = ['analytics', 'svg'];
|
protected $helpers = ['analytics', 'svg', 'components'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ class Episode extends BaseController
|
||||||
$data = [
|
$data = [
|
||||||
'previousEpisode' => $previousNextEpisodes['previous'],
|
'previousEpisode' => $previousNextEpisodes['previous'],
|
||||||
'nextEpisode' => $previousNextEpisodes['next'],
|
'nextEpisode' => $previousNextEpisodes['next'],
|
||||||
|
'podcast' => $this->podcast,
|
||||||
'episode' => $this->episode,
|
'episode' => $this->episode,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,10 +50,11 @@ class AddPodcasts extends Migration
|
||||||
'unsigned' => true,
|
'unsigned' => true,
|
||||||
'default' => 0,
|
'default' => 0,
|
||||||
],
|
],
|
||||||
'explicit' => [
|
'parental_advisory' => [
|
||||||
'type' => 'TINYINT',
|
'type' => 'ENUM',
|
||||||
'constraint' => 1,
|
'constraint' => ['clean', 'explicit'],
|
||||||
'default' => 0,
|
'null' => true,
|
||||||
|
'default' => null,
|
||||||
],
|
],
|
||||||
'owner_name' => [
|
'owner_name' => [
|
||||||
'type' => 'VARCHAR',
|
'type' => 'VARCHAR',
|
||||||
|
|
@ -63,7 +64,7 @@ class AddPodcasts extends Migration
|
||||||
'type' => 'VARCHAR',
|
'type' => 'VARCHAR',
|
||||||
'constraint' => 1024,
|
'constraint' => 1024,
|
||||||
],
|
],
|
||||||
'author' => [
|
'publisher' => [
|
||||||
'type' => 'VARCHAR',
|
'type' => 'VARCHAR',
|
||||||
'constraint' => 1024,
|
'constraint' => 1024,
|
||||||
'null' => true,
|
'null' => true,
|
||||||
|
|
@ -92,10 +93,6 @@ class AddPodcasts extends Migration
|
||||||
'type' => 'TEXT',
|
'type' => 'TEXT',
|
||||||
'null' => true,
|
'null' => true,
|
||||||
],
|
],
|
||||||
'custom_html_head' => [
|
|
||||||
'type' => 'TEXT',
|
|
||||||
'null' => true,
|
|
||||||
],
|
|
||||||
'created_by' => [
|
'created_by' => [
|
||||||
'type' => 'INT',
|
'type' => 'INT',
|
||||||
'constraint' => 11,
|
'constraint' => 11,
|
||||||
|
|
|
||||||
|
|
@ -70,10 +70,11 @@ class AddEpisodes extends Migration
|
||||||
'constraint' => 1024,
|
'constraint' => 1024,
|
||||||
'null' => true,
|
'null' => true,
|
||||||
],
|
],
|
||||||
'explicit' => [
|
'parental_advisory' => [
|
||||||
'type' => 'TINYINT',
|
'type' => 'ENUM',
|
||||||
'constraint' => 1,
|
'constraint' => ['clean', 'explicit'],
|
||||||
'default' => 0,
|
'null' => true,
|
||||||
|
'default' => null,
|
||||||
],
|
],
|
||||||
'number' => [
|
'number' => [
|
||||||
'type' => 'INT',
|
'type' => 'INT',
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class AddPodcastsCategories
|
||||||
|
* Creates podcasts_categories table in database
|
||||||
|
*
|
||||||
|
* @copyright 2020 Podlibre
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Database\Migrations;
|
||||||
|
|
||||||
|
use CodeIgniter\Database\Migration;
|
||||||
|
|
||||||
|
class AddPodcastsCategories extends Migration
|
||||||
|
{
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
$this->forge->addField([
|
||||||
|
'podcast_id' => [
|
||||||
|
'type' => 'BIGINT',
|
||||||
|
'constraint' => 20,
|
||||||
|
'unsigned' => true,
|
||||||
|
],
|
||||||
|
'category_id' => [
|
||||||
|
'type' => 'INT',
|
||||||
|
'constraint' => 10,
|
||||||
|
'unsigned' => true,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
$this->forge->addPrimaryKey(['podcast_id', 'category_id']);
|
||||||
|
$this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
|
||||||
|
$this->forge->addForeignKey('category_id', 'categories', 'id');
|
||||||
|
$this->forge->createTable('podcasts_categories');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
$this->forge->dropTable('podcasts_categories');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -66,7 +66,7 @@ class Episode extends Entity
|
||||||
'enclosure_filesize' => 'integer',
|
'enclosure_filesize' => 'integer',
|
||||||
'description' => 'string',
|
'description' => 'string',
|
||||||
'image_uri' => '?string',
|
'image_uri' => '?string',
|
||||||
'explicit' => 'boolean',
|
'parental_advisory' => '?string',
|
||||||
'number' => '?integer',
|
'number' => '?integer',
|
||||||
'season_number' => '?integer',
|
'season_number' => '?integer',
|
||||||
'type' => 'string',
|
'type' => 'string',
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,16 @@ class Podcast extends Entity
|
||||||
*/
|
*/
|
||||||
protected $category;
|
protected $category;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \App\Entities\Category[]
|
||||||
|
*/
|
||||||
|
protected $other_categories;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var integer[]
|
||||||
|
*/
|
||||||
|
protected $other_categories_ids;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \App\Entities\User[]
|
* @var \App\Entities\User[]
|
||||||
*/
|
*/
|
||||||
|
|
@ -60,8 +70,8 @@ class Podcast extends Entity
|
||||||
'image_uri' => 'string',
|
'image_uri' => 'string',
|
||||||
'language' => 'string',
|
'language' => 'string',
|
||||||
'category_id' => 'integer',
|
'category_id' => 'integer',
|
||||||
'explicit' => 'boolean',
|
'parental_advisory' => '?string',
|
||||||
'author' => '?string',
|
'publisher' => '?string',
|
||||||
'owner_name' => '?string',
|
'owner_name' => '?string',
|
||||||
'owner_email' => '?string',
|
'owner_email' => '?string',
|
||||||
'type' => 'string',
|
'type' => 'string',
|
||||||
|
|
@ -69,7 +79,6 @@ class Podcast extends Entity
|
||||||
'block' => 'boolean',
|
'block' => 'boolean',
|
||||||
'complete' => 'boolean',
|
'complete' => 'boolean',
|
||||||
'episode_description_footer' => '?string',
|
'episode_description_footer' => '?string',
|
||||||
'custom_html_head' => '?string',
|
|
||||||
'created_by' => 'integer',
|
'created_by' => 'integer',
|
||||||
'updated_by' => 'integer',
|
'updated_by' => 'integer',
|
||||||
'imported_feed_url' => '?string',
|
'imported_feed_url' => '?string',
|
||||||
|
|
@ -225,4 +234,33 @@ class Podcast extends Entity
|
||||||
|
|
||||||
return $this->platforms;
|
return $this->platforms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getOtherCategories()
|
||||||
|
{
|
||||||
|
if (empty($this->id)) {
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'Podcast must be created before getting other categories.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($this->other_categories)) {
|
||||||
|
$this->other_categories = (new CategoryModel())->getPodcastCategories(
|
||||||
|
$this->id
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->other_categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getOtherCategoriesIds()
|
||||||
|
{
|
||||||
|
if (empty($this->other_categories_ids)) {
|
||||||
|
$this->other_categories_ids = array_column(
|
||||||
|
$this->getOtherCategories(),
|
||||||
|
'id'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->other_categories_ids;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Podlibre
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
namespace App\Entities;
|
namespace App\Entities;
|
||||||
|
|
||||||
use App\Models\PodcastModel;
|
use App\Models\PodcastModel;
|
||||||
|
|
|
||||||
|
|
@ -9,16 +9,15 @@
|
||||||
use Config\Services;
|
use Config\Services;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the inline svg icon
|
* Renders the breadcrumb navigation through the Breadcrumb service
|
||||||
*
|
*
|
||||||
* @param string $name name of the icon file without the .svg extension
|
* @param string $class to be added to the breadcrumb nav
|
||||||
* @param string $class to be added to the svg string
|
|
||||||
* @return string html breadcrumb
|
* @return string html breadcrumb
|
||||||
*/
|
*/
|
||||||
function render_breadcrumb()
|
function render_breadcrumb($class = null)
|
||||||
{
|
{
|
||||||
$breadcrumb = Services::breadcrumb();
|
$breadcrumb = Services::breadcrumb();
|
||||||
return $breadcrumb->render();
|
return $breadcrumb->render($class);
|
||||||
}
|
}
|
||||||
|
|
||||||
function replace_breadcrumb_params($newParams)
|
function replace_breadcrumb_params($newParams)
|
||||||
|
|
|
||||||
258
app/Helpers/components_helper.php
Normal file
|
|
@ -0,0 +1,258 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Podlibre
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!function_exists('button')) {
|
||||||
|
/**
|
||||||
|
* Button component
|
||||||
|
*
|
||||||
|
* Creates a stylized button or button like anchor tag if the URL is defined.
|
||||||
|
*
|
||||||
|
* @param string $label The button label
|
||||||
|
* @param mixed|null $uri URI string or array of URI segments
|
||||||
|
* @param array $customOptions button options: variant, size, iconLeft, iconRight
|
||||||
|
* @param array $customAttributes Additional attributes
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function button(
|
||||||
|
string $label = '',
|
||||||
|
$uri = null,
|
||||||
|
$customOptions = [],
|
||||||
|
$customAttributes = []
|
||||||
|
): string {
|
||||||
|
$defaultOptions = [
|
||||||
|
'variant' => 'default',
|
||||||
|
'size' => 'base',
|
||||||
|
'iconLeft' => null,
|
||||||
|
'iconRight' => null,
|
||||||
|
'isRoundedFull' => false,
|
||||||
|
'isSquared' => false,
|
||||||
|
];
|
||||||
|
$options = array_merge($defaultOptions, $customOptions);
|
||||||
|
|
||||||
|
$baseClass =
|
||||||
|
'inline-flex items-center shadow-xs outline-none focus:shadow-outline';
|
||||||
|
|
||||||
|
$variantClass = [
|
||||||
|
'default' => 'bg-gray-300 hover:bg-gray-400',
|
||||||
|
'primary' => 'text-white bg-green-500 hover:bg-green-600',
|
||||||
|
'secondary' => 'text-white bg-gray-700 hover:bg-gray-800',
|
||||||
|
'success' => 'text-white bg-green-600 hover:bg-green-700',
|
||||||
|
'danger' => 'text-white bg-red-600 hover:bg-red-700',
|
||||||
|
'warning' => 'text-black bg-yellow-500 hover:bg-yellow-600',
|
||||||
|
'info' => 'text-white bg-teal-500 hover:bg-teal-600',
|
||||||
|
];
|
||||||
|
|
||||||
|
$sizeClass = [
|
||||||
|
'small' => 'text-xs md:text-sm ',
|
||||||
|
'base' => 'text-sm md:text-base',
|
||||||
|
'large' => 'text-lg md:text-xl',
|
||||||
|
];
|
||||||
|
|
||||||
|
$basePaddings = [
|
||||||
|
'small' => 'px-1 md:px-2 md:py-1',
|
||||||
|
'base' => 'px-2 py-1 md:px-3 md:py-2',
|
||||||
|
'large' => 'px-3 py-2 md:px-4 md:py-2',
|
||||||
|
];
|
||||||
|
|
||||||
|
$squaredPaddings = [
|
||||||
|
'small' => 'p-1',
|
||||||
|
'base' => 'p-2',
|
||||||
|
'large' => 'p-3',
|
||||||
|
];
|
||||||
|
|
||||||
|
$roundedClass = [
|
||||||
|
'full' => 'rounded-full',
|
||||||
|
'small' => 'rounded-sm md:rounded',
|
||||||
|
'base' => 'rounded md:rounded-md',
|
||||||
|
'large' => 'rounded-md md:rounded-lg',
|
||||||
|
];
|
||||||
|
|
||||||
|
$buttonClass =
|
||||||
|
$baseClass .
|
||||||
|
' ' .
|
||||||
|
($options['isRoundedFull']
|
||||||
|
? $roundedClass['full']
|
||||||
|
: $roundedClass[$options['size']]) .
|
||||||
|
' ' .
|
||||||
|
($options['isSquared']
|
||||||
|
? $squaredPaddings[$options['size']]
|
||||||
|
: $basePaddings[$options['size']]) .
|
||||||
|
' ' .
|
||||||
|
$sizeClass[$options['size']] .
|
||||||
|
' ' .
|
||||||
|
$variantClass[$options['variant']];
|
||||||
|
|
||||||
|
if (!empty($customAttributes['class'])) {
|
||||||
|
$buttonClass .= ' ' . $customAttributes['class'];
|
||||||
|
unset($customAttributes['class']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($options['iconLeft']) {
|
||||||
|
$label = icon($options['iconLeft'], 'mr-2') . $label;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($options['iconRight']) {
|
||||||
|
$label .= icon($options['iconRight'], 'ml-2');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($uri) {
|
||||||
|
return anchor(
|
||||||
|
$uri,
|
||||||
|
$label,
|
||||||
|
array_merge(
|
||||||
|
[
|
||||||
|
'class' => $buttonClass,
|
||||||
|
],
|
||||||
|
$customAttributes
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$defaultButtonAttributes = [
|
||||||
|
'type' => 'button',
|
||||||
|
];
|
||||||
|
$attributes = array_merge($defaultButtonAttributes, $customAttributes);
|
||||||
|
|
||||||
|
return '<button class="' .
|
||||||
|
$buttonClass .
|
||||||
|
'"' .
|
||||||
|
stringify_attributes($attributes) .
|
||||||
|
'>' .
|
||||||
|
$label .
|
||||||
|
'</button>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (!function_exists('icon_button')) {
|
||||||
|
/**
|
||||||
|
* Icon Button component
|
||||||
|
*
|
||||||
|
* Abstracts the `button()` helper to create a stylized icon button
|
||||||
|
*
|
||||||
|
* @param string $label The button label
|
||||||
|
* @param mixed|null $uri URI string or array of URI segments
|
||||||
|
* @param array $customOptions button options: variant, size, iconLeft, iconRight
|
||||||
|
* @param array $customAttributes Additional attributes
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function icon_button(
|
||||||
|
string $icon,
|
||||||
|
string $title,
|
||||||
|
$uri = null,
|
||||||
|
$customOptions = [],
|
||||||
|
$customAttributes = []
|
||||||
|
): string {
|
||||||
|
$defaultOptions = [
|
||||||
|
'isRoundedFull' => true,
|
||||||
|
'isSquared' => true,
|
||||||
|
];
|
||||||
|
$options = array_merge($defaultOptions, $customOptions);
|
||||||
|
|
||||||
|
$defaultAttributes = [
|
||||||
|
'title' => $title,
|
||||||
|
'data-toggle' => 'tooltip',
|
||||||
|
'data-placement' => 'bottom',
|
||||||
|
];
|
||||||
|
$attributes = array_merge($defaultAttributes, $customAttributes);
|
||||||
|
|
||||||
|
return button(icon($icon), $uri, $options, $attributes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (!function_exists('hint_tooltip')) {
|
||||||
|
/**
|
||||||
|
* Hint component
|
||||||
|
*
|
||||||
|
* Used to produce tooltip with a question mark icon for hint texts
|
||||||
|
*
|
||||||
|
* @param string $hintText The hint text
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function hint_tooltip(string $hintText = '', string $class = ''): string
|
||||||
|
{
|
||||||
|
$tooltip =
|
||||||
|
'<span data-toggle="tooltip" data-placement="bottom" tabindex="0" title="' .
|
||||||
|
$hintText .
|
||||||
|
'" class="inline-block align-middle outline-none focus:shadow-outline';
|
||||||
|
|
||||||
|
if ($class !== '') {
|
||||||
|
$tooltip .= ' ' . $class;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tooltip . '">' . icon('question') . '</span>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (!function_exists('data_table')) {
|
||||||
|
/**
|
||||||
|
* Data table component
|
||||||
|
*
|
||||||
|
* Creates a stylized table.
|
||||||
|
*
|
||||||
|
* @param array $columns array of associate arrays with `header` and `cell` keys where `cell` is a function with a row of $data as parameter
|
||||||
|
* @param array $data data to loop through and display in rows
|
||||||
|
* @param array ...$rest Any other argument to pass to the `cell` function
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function data_table($columns, $data = [], ...$rest): string
|
||||||
|
{
|
||||||
|
$table = new \CodeIgniter\View\Table();
|
||||||
|
|
||||||
|
$template = [
|
||||||
|
'table_open' => '<table class="w-full whitespace-no-wrap">',
|
||||||
|
|
||||||
|
'thead_open' =>
|
||||||
|
'<thead class="text-xs font-semibold text-left text-gray-500 uppercase border-b">',
|
||||||
|
|
||||||
|
'heading_cell_start' => '<th class="px-4 py-2">',
|
||||||
|
'cell_start' => '<td class="px-4 py-2">',
|
||||||
|
'cell_alt_start' => '<td class="px-4 py-2">',
|
||||||
|
|
||||||
|
'row_start' => '<tr class="bg-gray-100 hover:bg-green-100">',
|
||||||
|
'row_alt_start' => '<tr class="hover:bg-green-100">',
|
||||||
|
];
|
||||||
|
|
||||||
|
$table->setTemplate($template);
|
||||||
|
|
||||||
|
$tableHeaders = [];
|
||||||
|
foreach ($columns as $column) {
|
||||||
|
array_push($tableHeaders, $column['header']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$table->setHeading($tableHeaders);
|
||||||
|
|
||||||
|
if ($dataCount = count($data)) {
|
||||||
|
for ($i = 0; $i < $dataCount; $i++) {
|
||||||
|
$row = $data[$i];
|
||||||
|
$rowData = [];
|
||||||
|
foreach ($columns as $column) {
|
||||||
|
array_push($rowData, $column['cell']($row, ...$rest));
|
||||||
|
}
|
||||||
|
$table->addRow($rowData);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return lang('Common.no_data');
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<div class="overflow-x-auto bg-white rounded-lg shadow" >' .
|
||||||
|
$table->generate() .
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
187
app/Helpers/form_helper.php
Normal file
|
|
@ -0,0 +1,187 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Podlibre
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!function_exists('form_section')) {
|
||||||
|
/**
|
||||||
|
* Form section
|
||||||
|
*
|
||||||
|
* Used to produce a responsive form section with a title and subtitle. To close section,
|
||||||
|
* use form_section_close()
|
||||||
|
*
|
||||||
|
* @param string $title The section title
|
||||||
|
* @param string $subtitle The section subtitle
|
||||||
|
* @param array $attributes Additional attributes
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function form_section(
|
||||||
|
string $title = '',
|
||||||
|
string $subtitle = '',
|
||||||
|
array $attributes = []
|
||||||
|
): string {
|
||||||
|
$section =
|
||||||
|
'<div class="flex flex-wrap w-full gap-6 mb-8"' .
|
||||||
|
stringify_attributes($attributes) .
|
||||||
|
">\n";
|
||||||
|
|
||||||
|
$info =
|
||||||
|
'<div class="w-full max-w-xs"><h2 class="text-lg font-semibold">' .
|
||||||
|
$title .
|
||||||
|
'</h2><p class="text-sm text-gray-600">' .
|
||||||
|
$subtitle .
|
||||||
|
'</p></div>';
|
||||||
|
|
||||||
|
return $section . $info . '<div class="flex flex-col w-full max-w-lg">';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (!function_exists('form_section_close')) {
|
||||||
|
/**
|
||||||
|
* Form Section close Tag
|
||||||
|
*
|
||||||
|
* @param string $extra
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function form_section_close(string $extra = ''): string
|
||||||
|
{
|
||||||
|
return '</div></div>' . $extra;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (!function_exists('form_switch')) {
|
||||||
|
/**
|
||||||
|
* Form Checkbox Switch
|
||||||
|
*
|
||||||
|
* Abstracts form_label to stylize it as a switch toggle
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @param string $value
|
||||||
|
* @param boolean $checked
|
||||||
|
* @param mixed $extra
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function form_switch(
|
||||||
|
$label = '',
|
||||||
|
$data = '',
|
||||||
|
string $value = '',
|
||||||
|
bool $checked = false,
|
||||||
|
$class = '',
|
||||||
|
$extra = ''
|
||||||
|
): string {
|
||||||
|
$data['class'] = 'form-switch';
|
||||||
|
|
||||||
|
return '<label class="relative inline-flex items-center' .
|
||||||
|
' ' .
|
||||||
|
$class .
|
||||||
|
'">' .
|
||||||
|
form_checkbox($data, $value, $checked, $extra) .
|
||||||
|
'<span class="form-switch-slider"></span>' .
|
||||||
|
'<span class="ml-2">' .
|
||||||
|
$label .
|
||||||
|
'</span></label>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (!function_exists('form_label')) {
|
||||||
|
/**
|
||||||
|
* Form Label Tag
|
||||||
|
*
|
||||||
|
* @param string $label_text The text to appear onscreen
|
||||||
|
* @param string $id The id the label applies to
|
||||||
|
* @param array $attributes Additional attributes
|
||||||
|
* @param string $hintText Hint text to add next to the label
|
||||||
|
* @param boolean $isOptional adds an optional text if true
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function form_label(
|
||||||
|
string $label_text = '',
|
||||||
|
string $id = '',
|
||||||
|
array $attributes = [],
|
||||||
|
string $hintText = '',
|
||||||
|
bool $isOptional = false
|
||||||
|
): string {
|
||||||
|
$label = '<label';
|
||||||
|
|
||||||
|
if ($id !== '') {
|
||||||
|
$label .= ' for="' . $id . '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($attributes) && $attributes) {
|
||||||
|
foreach ($attributes as $key => $val) {
|
||||||
|
$label .= ' ' . $key . '="' . $val . '"';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$label_content = $label_text;
|
||||||
|
if ($isOptional) {
|
||||||
|
$label_content .=
|
||||||
|
'<small class="ml-1 lowercase">(' .
|
||||||
|
lang('Common.optional') .
|
||||||
|
')</small>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($hintText !== '') {
|
||||||
|
$label_content .= hint_tooltip($hintText, 'ml-1');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $label . '>' . $label_content . '</label>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
if (!function_exists('form_multiselect')) {
|
||||||
|
/**
|
||||||
|
* Multi-select menu
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @param array $options
|
||||||
|
* @param array $selected
|
||||||
|
* @param mixed $extra
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function form_multiselect(
|
||||||
|
string $name = '',
|
||||||
|
array $options = [],
|
||||||
|
array $selected = [],
|
||||||
|
$customExtra = ''
|
||||||
|
): string {
|
||||||
|
$defaultExtra = [
|
||||||
|
'data-class' => $customExtra['class'],
|
||||||
|
'data-select-text' => lang('Common.forms.multiSelect.selectText'),
|
||||||
|
'data-loading-text' => lang('Common.forms.multiSelect.loadingText'),
|
||||||
|
'data-no-results-text' => lang(
|
||||||
|
'Common.forms.multiSelect.noResultsText'
|
||||||
|
),
|
||||||
|
'data-no-choices-text' => lang(
|
||||||
|
'Common.forms.multiSelect.noChoicesText'
|
||||||
|
),
|
||||||
|
'data-max-item-text' => lang(
|
||||||
|
'Common.forms.multiSelect.maxItemText'
|
||||||
|
),
|
||||||
|
];
|
||||||
|
$extra = stringify_attributes(array_merge($defaultExtra, $customExtra));
|
||||||
|
|
||||||
|
if (stripos($extra, 'multiple') === false) {
|
||||||
|
$extra .= ' multiple="multiple"';
|
||||||
|
}
|
||||||
|
|
||||||
|
return form_dropdown($name, $options, $selected, $extra);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
@ -7,7 +7,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use App\Libraries\SimpleRSSElement;
|
use App\Libraries\SimpleRSSElement;
|
||||||
use App\Models\CategoryModel;
|
|
||||||
use CodeIgniter\I18n\Time;
|
use CodeIgniter\I18n\Time;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -18,14 +17,8 @@ use CodeIgniter\I18n\Time;
|
||||||
*/
|
*/
|
||||||
function get_rss_feed($podcast)
|
function get_rss_feed($podcast)
|
||||||
{
|
{
|
||||||
$category_model = new CategoryModel();
|
|
||||||
|
|
||||||
$episodes = $podcast->episodes;
|
$episodes = $podcast->episodes;
|
||||||
|
|
||||||
$podcast_category = $category_model
|
|
||||||
->where('id', $podcast->category_id)
|
|
||||||
->first();
|
|
||||||
|
|
||||||
$itunes_namespace = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
|
$itunes_namespace = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
|
||||||
|
|
||||||
$rss = new SimpleRSSElement(
|
$rss = new SimpleRSSElement(
|
||||||
|
|
@ -60,39 +53,20 @@ function get_rss_feed($podcast)
|
||||||
$itunes_image->addAttribute('href', $podcast->image->url);
|
$itunes_image->addAttribute('href', $podcast->image->url);
|
||||||
$channel->addChild('language', $podcast->language);
|
$channel->addChild('language', $podcast->language);
|
||||||
|
|
||||||
$itunes_category = $channel->addChild('category', null, $itunes_namespace);
|
// set main category first, then other categories as apple
|
||||||
$itunes_category->addAttribute(
|
add_category_tag($channel, $podcast->category);
|
||||||
'text',
|
foreach ($podcast->other_categories as $other_category) {
|
||||||
$podcast_category->parent
|
add_category_tag($channel, $other_category);
|
||||||
? $podcast_category->parent->apple_category
|
|
||||||
: $podcast_category->apple_category
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($podcast_category->parent) {
|
|
||||||
$itunes_category_child = $itunes_category->addChild(
|
|
||||||
'category',
|
|
||||||
null,
|
|
||||||
$itunes_namespace
|
|
||||||
);
|
|
||||||
$itunes_category_child->addAttribute(
|
|
||||||
'text',
|
|
||||||
$podcast_category->apple_category
|
|
||||||
);
|
|
||||||
$channel->addChild(
|
|
||||||
'category',
|
|
||||||
$podcast_category->parent->apple_category
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
$channel->addChild('category', $podcast_category->apple_category);
|
|
||||||
|
|
||||||
$channel->addChild(
|
$channel->addChild(
|
||||||
'explicit',
|
'explicit',
|
||||||
$podcast->explicit ? 'true' : 'false',
|
$podcast->parental_advisory === 'explicit' ? 'true' : 'false',
|
||||||
$itunes_namespace
|
$itunes_namespace
|
||||||
);
|
);
|
||||||
|
|
||||||
$podcast->author &&
|
$podcast->publisher &&
|
||||||
$channel->addChild('author', $podcast->author, $itunes_namespace);
|
$channel->addChild('author', $podcast->publisher, $itunes_namespace);
|
||||||
$channel->addChild('link', $podcast->link);
|
$channel->addChild('link', $podcast->link);
|
||||||
|
|
||||||
$owner = $channel->addChild('owner', null, $itunes_namespace);
|
$owner = $channel->addChild('owner', null, $itunes_namespace);
|
||||||
|
|
@ -137,11 +111,13 @@ function get_rss_feed($podcast)
|
||||||
$itunes_namespace
|
$itunes_namespace
|
||||||
);
|
);
|
||||||
$episode_itunes_image->addAttribute('href', $episode->image->feed_url);
|
$episode_itunes_image->addAttribute('href', $episode->image->feed_url);
|
||||||
$item->addChild(
|
|
||||||
'explicit',
|
$episode->parental_advisory &&
|
||||||
$episode->explicit ? 'true' : 'false',
|
$item->addChild(
|
||||||
$itunes_namespace
|
'explicit',
|
||||||
);
|
$episode->parental_advisory === 'explicit' ? 'true' : 'false',
|
||||||
|
$itunes_namespace
|
||||||
|
);
|
||||||
|
|
||||||
$item->addChild('episode', $episode->number, $itunes_namespace);
|
$item->addChild('episode', $episode->number, $itunes_namespace);
|
||||||
$episode->season_number &&
|
$episode->season_number &&
|
||||||
|
|
@ -157,3 +133,35 @@ function get_rss_feed($podcast)
|
||||||
|
|
||||||
return $rss->asXML();
|
return $rss->asXML();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds <itunes:category> and <category> tags to node for a given category
|
||||||
|
*
|
||||||
|
* @param \SimpleXMLElement $node
|
||||||
|
* @param \App\Entities\Category $category
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function add_category_tag($node, $category)
|
||||||
|
{
|
||||||
|
$itunes_namespace = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
|
||||||
|
|
||||||
|
$itunes_category = $node->addChild('category', null, $itunes_namespace);
|
||||||
|
$itunes_category->addAttribute(
|
||||||
|
'text',
|
||||||
|
$category->parent
|
||||||
|
? $category->parent->apple_category
|
||||||
|
: $category->apple_category
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($category->parent) {
|
||||||
|
$itunes_category_child = $itunes_category->addChild(
|
||||||
|
'category',
|
||||||
|
null,
|
||||||
|
$itunes_namespace
|
||||||
|
);
|
||||||
|
$itunes_category_child->addAttribute('text', $category->apple_category);
|
||||||
|
$node->addChild('category', $category->parent->apple_category);
|
||||||
|
}
|
||||||
|
$node->addChild('category', $category->apple_category);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,16 +13,17 @@
|
||||||
* @param string $class to be added to the svg string
|
* @param string $class to be added to the svg string
|
||||||
* @return string svg contents
|
* @return string svg contents
|
||||||
*/
|
*/
|
||||||
function icon($name, $class = null)
|
function icon(string $name, string $class = '')
|
||||||
{
|
{
|
||||||
$svg_contents = file_get_contents('assets/icons/' . $name . '.svg');
|
$svg_contents = file_get_contents('assets/icons/' . $name . '.svg');
|
||||||
if ($class) {
|
if ($class !== '') {
|
||||||
$svg_contents = str_replace(
|
$svg_contents = str_replace(
|
||||||
'<svg',
|
'<svg',
|
||||||
'<svg class="' . $class . '"',
|
'<svg class="' . $class . '"',
|
||||||
$svg_contents
|
$svg_contents
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $svg_contents;
|
return $svg_contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,17 +7,17 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
'go_to_website' => 'Go to website',
|
||||||
'dashboard' => 'Dashboard',
|
'dashboard' => 'Dashboard',
|
||||||
'podcasts' => 'Podcasts',
|
|
||||||
'users' => 'Users',
|
|
||||||
'pages' => 'Pages',
|
|
||||||
'admin' => 'Home',
|
'admin' => 'Home',
|
||||||
|
'podcasts' => 'Podcasts',
|
||||||
'podcast-list' => 'All podcasts',
|
'podcast-list' => 'All podcasts',
|
||||||
'podcast-create' => 'New podcast',
|
'podcast-create' => 'New podcast',
|
||||||
'podcast-import' => 'Import a podcast',
|
'podcast-import' => 'Import a podcast',
|
||||||
|
'users' => 'Users',
|
||||||
'user-list' => 'All users',
|
'user-list' => 'All users',
|
||||||
'user-create' => 'New user',
|
'user-create' => 'New user',
|
||||||
|
'pages' => 'Pages',
|
||||||
'page-list' => 'All pages',
|
'page-list' => 'All pages',
|
||||||
'page-create' => 'New Page',
|
'page-create' => 'New Page',
|
||||||
'go_to_website' => 'Go to website',
|
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,25 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
'yes' => 'Yes',
|
||||||
|
'no' => 'No',
|
||||||
|
'optional' => 'Optional',
|
||||||
|
'no_data' => 'No data found!',
|
||||||
'home' => 'Home',
|
'home' => 'Home',
|
||||||
'explicit' => 'Explicit',
|
'explicit' => 'Explicit',
|
||||||
'mediumDate' => '{0,date,medium}',
|
'mediumDate' => '{0,date,medium}',
|
||||||
'duration' => '{0,duration}',
|
'duration' => '{0,duration}',
|
||||||
'powered_by' => 'Powered by {castopod}.',
|
'powered_by' => 'Powered by {castopod}.',
|
||||||
|
'actions' => 'Actions',
|
||||||
|
'pageInfo' => 'Page {currentPage} out of {pageCount}',
|
||||||
'forms' => [
|
'forms' => [
|
||||||
|
'multiSelect' => [
|
||||||
|
'selectText' => 'Press to select',
|
||||||
|
'loadingText' => 'Loading...',
|
||||||
|
'noResultsText' => 'No results found',
|
||||||
|
'noChoicesText' => 'No choices to choose from',
|
||||||
|
'maxItemText' => 'Cannot add more items',
|
||||||
|
],
|
||||||
'image_size_hint' =>
|
'image_size_hint' =>
|
||||||
'Image must be squared with at least 1400px wide and tall.',
|
'Image must be squared with at least 1400px wide and tall.',
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,10 @@ return [
|
||||||
'edit_role' => 'Update role for {0}',
|
'edit_role' => 'Update role for {0}',
|
||||||
'edit' => 'Edit',
|
'edit' => 'Edit',
|
||||||
'remove' => 'Remove',
|
'remove' => 'Remove',
|
||||||
|
'list' => [
|
||||||
|
'username' => 'Username',
|
||||||
|
'role' => 'Role',
|
||||||
|
],
|
||||||
'form' => [
|
'form' => [
|
||||||
'user' => 'User',
|
'user' => 'User',
|
||||||
'role' => 'Role',
|
'role' => 'Role',
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,9 @@ return [
|
||||||
'next_season' => 'Next season',
|
'next_season' => 'Next season',
|
||||||
'season' => 'Season {seasonNumber}',
|
'season' => 'Season {seasonNumber}',
|
||||||
'number' => 'Episode {episodeNumber}',
|
'number' => 'Episode {episodeNumber}',
|
||||||
|
'number_abbr' => 'Ep. {episodeNumber}',
|
||||||
|
'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
|
||||||
|
'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}',
|
||||||
'all_podcast_episodes' => 'All podcast episodes',
|
'all_podcast_episodes' => 'All podcast episodes',
|
||||||
'back_to_podcast' => 'Go back to podcast',
|
'back_to_podcast' => 'Go back to podcast',
|
||||||
'edit' => 'Edit',
|
'edit' => 'Edit',
|
||||||
|
|
@ -20,50 +23,51 @@ return [
|
||||||
'go_to_page' => 'Go to page',
|
'go_to_page' => 'Go to page',
|
||||||
'create' => 'Add an episode',
|
'create' => 'Add an episode',
|
||||||
'form' => [
|
'form' => [
|
||||||
'enclosure' => 'Audio file',
|
'enclosure' => 'Choose an .mp3 or .m4a audio file…',
|
||||||
|
'info_section_title' => 'Episode info',
|
||||||
|
'info_section_subtitle' => '',
|
||||||
|
'image' => 'Cover image',
|
||||||
|
'image_hint' =>
|
||||||
|
'If you do not set an image, the podcast cover will be used instead.',
|
||||||
'title' => 'Title',
|
'title' => 'Title',
|
||||||
'title_help' =>
|
'title_hint' =>
|
||||||
'This episode title. It should contain a clear, concise name for your episode. Don’t specify the episode number or season number here.',
|
'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.',
|
||||||
'slug' => 'Slug',
|
'slug' => 'Slug',
|
||||||
'slug_help' =>
|
'slug_hint' => 'Used for generating the episode URL.',
|
||||||
'This episode slug. It will be used for its URL address.',
|
'season_number' => 'Season',
|
||||||
'description' => 'Description',
|
'episode_number' => 'Episode',
|
||||||
'description_help' =>
|
|
||||||
'This is where you type the episode show notes. You may add rich text, links, images…',
|
|
||||||
'image' => 'Image',
|
|
||||||
'image_help' =>
|
|
||||||
'This episode image. If an image is already in the audio file, you don’t need to add one here. If you add no image to this episode, the podcast image will be used instead.',
|
|
||||||
'explicit' => 'Explicit',
|
|
||||||
'explicit_help' =>
|
|
||||||
'The episode parental advisory information for this episode.',
|
|
||||||
'published_at' => [
|
|
||||||
'label' => 'Publication date',
|
|
||||||
'date' => 'Publication date',
|
|
||||||
'time' => 'Publication time',
|
|
||||||
],
|
|
||||||
'published_at_help' =>
|
|
||||||
'The date and time when this episode was released. It can be in the past or in the future.',
|
|
||||||
'type' => [
|
'type' => [
|
||||||
'label' => 'Type',
|
'label' => 'Type',
|
||||||
|
'hint' =>
|
||||||
|
'- <strong>full</strong>: complete content the episode.<br/>- <strong>trailer</strong>: short, promotional piece of content that represents a preview of the current show.<br/>- <strong>bonus</strong>: extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show.',
|
||||||
'full' => 'Full',
|
'full' => 'Full',
|
||||||
'full_help' =>
|
|
||||||
'Specify full when you are submitting the complete content of your episode.',
|
|
||||||
'trailer' => 'Trailer',
|
'trailer' => 'Trailer',
|
||||||
'trailer_help' =>
|
|
||||||
'Specify trailer when you are submitting a short, promotional piece of content that represents a preview of your current show.',
|
|
||||||
'bonus' => 'Bonus',
|
'bonus' => 'Bonus',
|
||||||
'bonus_help' =>
|
|
||||||
'Specify bonus when you are submitting extra content for your show (for example, behind the scenes information or interviews with the cast) or cross-promotional content for another show.',
|
|
||||||
],
|
],
|
||||||
'episode_number' => 'Episode number',
|
'show_notes_section_title' => 'Show notes',
|
||||||
'episode_number_help' =>
|
'show_notes_section_subtitle' =>
|
||||||
'The episode number is mandatory for serial podcasts but optional for episodic podcasts.',
|
'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.',
|
||||||
'season_number' => 'Season number',
|
'description' => 'Description',
|
||||||
'season_number_help' =>
|
'description_footer' => 'Description footer',
|
||||||
'Season number is a non-zero integer (1, 2, 3, etc.) representing this episode season number.',
|
'description_footer_hint' =>
|
||||||
'block' => 'Block',
|
'This text is added at the end of each episode description, it is a good place to input your social links for example.',
|
||||||
'block_help' =>
|
'publication_section_title' => 'Publication info',
|
||||||
'This episode show or hide status. If you want this episode removed from the Apple directory, use this tag.',
|
'publication_section_subtitle' => '',
|
||||||
|
'published_at' => [
|
||||||
|
'label' => 'Publication date',
|
||||||
|
'date' => 'Date',
|
||||||
|
'time' => 'Time',
|
||||||
|
],
|
||||||
|
'parental_advisory' => [
|
||||||
|
'label' => 'Parental advisory',
|
||||||
|
'hint' => 'Does the episode contain explicit content?',
|
||||||
|
'undefined' => 'undefined',
|
||||||
|
'clean' => 'Clean',
|
||||||
|
'explicit' => 'Explicit',
|
||||||
|
],
|
||||||
|
'block' => 'Episode should be hidden from all platforms',
|
||||||
|
'block_hint' =>
|
||||||
|
'The episode show or hide status. If you want this episode removed from the Apple directory, toggle this on.',
|
||||||
'submit_create' => 'Create episode',
|
'submit_create' => 'Create episode',
|
||||||
'submit_edit' => 'Save episode',
|
'submit_edit' => 'Save episode',
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
'page' => 'Page',
|
||||||
'all_pages' => 'All pages',
|
'all_pages' => 'All pages',
|
||||||
'create' => 'New page',
|
'create' => 'New page',
|
||||||
'go_to_page' => 'Go to page',
|
'go_to_page' => 'Go to page',
|
||||||
|
|
|
||||||
19
app/Language/en/Pager.php
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Podlibre
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'pageNavigation' => 'Page navigation',
|
||||||
|
'first' => 'First',
|
||||||
|
'previous' => 'Previous',
|
||||||
|
'next' => 'Next',
|
||||||
|
'last' => 'Last',
|
||||||
|
'older' => 'Older',
|
||||||
|
'newer' => 'Newer',
|
||||||
|
'invalidTemplate' => '{0} is not a valid Pager template.',
|
||||||
|
'invalidPaginationGroup' => '{0} is not a valid Pagination group.',
|
||||||
|
];
|
||||||
|
|
@ -9,8 +9,8 @@
|
||||||
return [
|
return [
|
||||||
'all_podcasts' => 'All podcasts',
|
'all_podcasts' => 'All podcasts',
|
||||||
'no_podcast' => 'No podcast found!',
|
'no_podcast' => 'No podcast found!',
|
||||||
'create' => 'Create a Podcast',
|
'create' => 'Create a podcast',
|
||||||
'import' => 'Create and Import a Podcast from an existing Feed',
|
'import' => 'Import a podcast',
|
||||||
'new_episode' => 'New Episode',
|
'new_episode' => 'New Episode',
|
||||||
'feed' => 'RSS feed',
|
'feed' => 'RSS feed',
|
||||||
'view' => 'View podcast',
|
'view' => 'View podcast',
|
||||||
|
|
@ -19,93 +19,55 @@ return [
|
||||||
'see_episodes' => 'See episodes',
|
'see_episodes' => 'See episodes',
|
||||||
'see_contributors' => 'See contributors',
|
'see_contributors' => 'See contributors',
|
||||||
'go_to_page' => 'Go to page',
|
'go_to_page' => 'Go to page',
|
||||||
|
'latest_episodes' => 'Latest episodes',
|
||||||
|
'see_all_episodes' => 'See all episodes',
|
||||||
'form' => [
|
'form' => [
|
||||||
|
'identity_section_title' => 'Podcast identity',
|
||||||
|
'identity_section_subtitle' => 'These fields allow you to get noticed.',
|
||||||
|
'image' => 'Cover image',
|
||||||
'title' => 'Title',
|
'title' => 'Title',
|
||||||
'title_help' =>
|
|
||||||
'The podcast title will be shown on all podcasts platforms (such as Apple Podcasts) and players (such as Podcast Addict).',
|
|
||||||
'name' => 'Name',
|
'name' => 'Name',
|
||||||
'name_help' =>
|
'name_hint' => 'Used for generating the podcast URL.',
|
||||||
'The podcast will be used in the URL address. It will be used as a Fediverse actor name, (for instance, it will be the podcast Mastodon’s name).',
|
|
||||||
'description' => 'Description',
|
|
||||||
'description_help' =>
|
|
||||||
'It will be shown on all podcasts platforms (such as Apple Podcasts) and players (such as Podcast Addict).',
|
|
||||||
'episode_description_footer' => 'Episode description footer',
|
|
||||||
'episode_description_footer_help' =>
|
|
||||||
'This text will be automatically added at the end of each episode description, so that you don’t have to copy/paste it a gazillion times.',
|
|
||||||
'image' => 'Image',
|
|
||||||
'image_help' =>
|
|
||||||
'This podcast image. It must be square, JPEG or PNG, minimum 1400 x 1400 pixels and maximum 3000 x 3000 pixels.',
|
|
||||||
'language' => 'Language',
|
|
||||||
'language_help' => 'The language spoken on the podcast.',
|
|
||||||
'category' => 'Category',
|
|
||||||
'category_help' =>
|
|
||||||
'This podcast category. Because no one uses subcategories, Castopod does not allow you te use one.',
|
|
||||||
'explicit' => 'Explicit',
|
|
||||||
'explicit_help' =>
|
|
||||||
'The podcast parental advisory information. Does it contain explicit content?',
|
|
||||||
'owner_name' => 'Owner name',
|
|
||||||
'owner_name_help' =>
|
|
||||||
'For administrative use only. It will not be shown on podcasts platforms (such as Apple Podcasts) nor players (such as Podcast Addict) but it is visible in the public RSS feed.',
|
|
||||||
'owner_email' => 'Owner email',
|
|
||||||
'owner_email_help' =>
|
|
||||||
'It will be used by most platforms to verify this podcast ownership. It will not be shown on podcasts platforms (such as Apple Podcasts) nor players (such as Podcast Addict) but it is visible in the public RSS feed.',
|
|
||||||
'author' => 'Author',
|
|
||||||
'author_help' =>
|
|
||||||
'The group responsible for creating the show. Show author most often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.',
|
|
||||||
'type' => [
|
'type' => [
|
||||||
'label' => 'Type',
|
'label' => 'Type',
|
||||||
|
'hint' =>
|
||||||
|
'- <strong>episodic</strong>: if episodes are intended to be consumed without any specific order. Newest episodes will be presented first.<br/>- <strong>serial</strong>: if episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.',
|
||||||
'episodic' => 'Episodic',
|
'episodic' => 'Episodic',
|
||||||
'episodic_help' =>
|
|
||||||
'Specify episodic when episodes are intended to be consumed without any specific order. The newest episodes will be presented first.',
|
|
||||||
'serial' => 'Serial',
|
'serial' => 'Serial',
|
||||||
'serial_help' =>
|
|
||||||
'Specify serial when episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.',
|
|
||||||
],
|
],
|
||||||
|
'description' => 'Description',
|
||||||
|
'classification_section_title' => 'Classification',
|
||||||
|
'classification_section_subtitle' =>
|
||||||
|
'These fields will impact your audience and competition.',
|
||||||
|
'language' => 'Language',
|
||||||
|
'category' => 'Category',
|
||||||
|
'other_categories' => 'Other categories',
|
||||||
|
'parental_advisory' => [
|
||||||
|
'label' => 'Parental advisory',
|
||||||
|
'hint' => 'Does it contain explicit content?',
|
||||||
|
'undefined' => 'undefined',
|
||||||
|
'clean' => 'Clean',
|
||||||
|
'explicit' => 'Explicit',
|
||||||
|
],
|
||||||
|
'author_section_title' => 'Author',
|
||||||
|
'author_section_subtitle' => 'Who is managing the podcast?',
|
||||||
|
'owner_name' => 'Owner name',
|
||||||
|
'owner_name_hint' =>
|
||||||
|
'For administrative use only. Visible in the public RSS feed.',
|
||||||
|
'owner_email' => 'Owner email',
|
||||||
|
'owner_email_hint' =>
|
||||||
|
'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.',
|
||||||
|
'publisher' => 'Publisher',
|
||||||
|
'publisher_hint' =>
|
||||||
|
'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.',
|
||||||
'copyright' => 'Copyright',
|
'copyright' => 'Copyright',
|
||||||
'copyright_help' =>
|
'status_section_title' => 'Status',
|
||||||
'The podcast copyright details, such as "2020 (cc)(by-nc-sa)" or "©2020".',
|
'status_section_subtitle' => 'Dead or alive?',
|
||||||
'block' => 'Block',
|
'block' => 'Podcast should be hidden from all platforms',
|
||||||
'block_help' =>
|
'complete' => 'Podcast will not be having new episodes',
|
||||||
'If you want your show removed from all platforms, use this tag.',
|
|
||||||
'complete' => 'Complete',
|
|
||||||
'complete_help' =>
|
|
||||||
'Check this if you will never publish another episode to your podcast.',
|
|
||||||
'custom_html_head' => 'Custom HTML code in <head/>',
|
|
||||||
'custom_html_head_help' =>
|
|
||||||
'Add here any HTML code that you would like to see on all this podcast pages within the <head/> tag.',
|
|
||||||
'submit_create' => 'Create podcast',
|
'submit_create' => 'Create podcast',
|
||||||
'submit_edit' => 'Save podcast',
|
'submit_edit' => 'Save podcast',
|
||||||
],
|
],
|
||||||
'form_import' => [
|
|
||||||
'name' => 'Name',
|
|
||||||
'name_help' =>
|
|
||||||
'This podcast name. It will be used in the URL address. It will be used as a Fediverse actor name, (for instance, it will be the podcast Mastodon’s name).',
|
|
||||||
'imported_feed_url' => 'Feed URL',
|
|
||||||
'imported_feed_url_help' =>
|
|
||||||
'Make sure you are legally allowed to copy that podcast.',
|
|
||||||
'force_renumber' => 'Force episodes renumbering',
|
|
||||||
'force_renumber_help' =>
|
|
||||||
'Use this if your old podcast does not have number but you want some on your new one.',
|
|
||||||
'season_number' => 'Season number',
|
|
||||||
'season_number_help' =>
|
|
||||||
'Use this if your old podcast does not have season number but you want one on your new one. Leave blank otherwise.',
|
|
||||||
'slug_field' => [
|
|
||||||
'label' => 'Which field should be used to calculate episode slug',
|
|
||||||
'link' => '<link>',
|
|
||||||
'title' => '<title>',
|
|
||||||
],
|
|
||||||
'description_field' => [
|
|
||||||
'label' => 'Source field used for episode description / show notes',
|
|
||||||
'description' => '<description>',
|
|
||||||
'summary' => '<itunes:summary>',
|
|
||||||
'subtitle_summary' =>
|
|
||||||
'<itunes:subtitle> <itunes:summary>',
|
|
||||||
],
|
|
||||||
'max_episodes' => 'Maximum number of episodes to import',
|
|
||||||
'max_episodes_helper' => 'Leave blank to import all episodes',
|
|
||||||
'submit_import' => 'Import podcast',
|
|
||||||
'submit_importing' => 'Importing podcast, this could take a while…',
|
|
||||||
],
|
|
||||||
'category_options' => [
|
'category_options' => [
|
||||||
'uncategorized' => 'uncategorized',
|
'uncategorized' => 'uncategorized',
|
||||||
'arts' => 'Arts',
|
'arts' => 'Arts',
|
||||||
|
|
@ -219,7 +181,7 @@ return [
|
||||||
'film_reviews' => 'Film Reviews',
|
'film_reviews' => 'Film Reviews',
|
||||||
'tv_reviews' => 'TV Reviews',
|
'tv_reviews' => 'TV Reviews',
|
||||||
],
|
],
|
||||||
'by' => 'By {author}',
|
'by' => 'By {publisher}',
|
||||||
'season' => 'Season {seasonNumber}',
|
'season' => 'Season {seasonNumber}',
|
||||||
'list_of_episodes_year' => '{year} episodes',
|
'list_of_episodes_year' => '{year} episodes',
|
||||||
'list_of_episodes_season' => 'Season {seasonNumber} episodes',
|
'list_of_episodes_season' => 'Season {seasonNumber} episodes',
|
||||||
|
|
|
||||||
43
app/Language/en/PodcastImport.php
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Podlibre
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'old_podcast_section_title' => 'The podcast to import',
|
||||||
|
'old_podcast_section_subtitle' => '',
|
||||||
|
'imported_feed_url' => 'Feed URL',
|
||||||
|
'imported_feed_url_hint' =>
|
||||||
|
'The feed must be in `.xml` format. Make sure you are legally allowed to copy the podcast.',
|
||||||
|
'new_podcast_section_title' => 'The new podcast',
|
||||||
|
'new_podcast_section_subtitle' => '',
|
||||||
|
'name' => 'Name',
|
||||||
|
'name_hint' => 'Used for generating the podcast URL.',
|
||||||
|
'advanced_params_section_title' => 'Advanced parameters',
|
||||||
|
'advanced_params_section_subtitle' =>
|
||||||
|
'Keep the default values if you have no idea of what the fields are for.',
|
||||||
|
'slug_field' => [
|
||||||
|
'label' => 'Which field should be used to calculate episode slug',
|
||||||
|
'link' => '<link>',
|
||||||
|
'title' => '<title>',
|
||||||
|
],
|
||||||
|
'description_field' => [
|
||||||
|
'label' => 'Source field used for episode description / show notes',
|
||||||
|
'description' => '<description>',
|
||||||
|
'summary' => '<itunes:summary>',
|
||||||
|
'subtitle_summary' =>
|
||||||
|
'<itunes:subtitle> + <itunes:summary>',
|
||||||
|
],
|
||||||
|
'force_renumber' => 'Force episodes renumbering',
|
||||||
|
'force_renumber_hint' =>
|
||||||
|
'Use this if your podcast does not have episode numbers but wish to set them during import.',
|
||||||
|
'season_number' => 'Season number',
|
||||||
|
'season_number_hint' =>
|
||||||
|
'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.',
|
||||||
|
'max_episodes' => 'Maximum number of episodes to import',
|
||||||
|
'max_episodes_hint' => 'Leave blank to import all episodes',
|
||||||
|
'submit' => 'Import podcast',
|
||||||
|
];
|
||||||
23
app/Language/en/PodcastNavigation.php
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Podlibre
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'go_to_page' => 'Go to podcast page',
|
||||||
|
'dashboard' => 'Podcast dashboard',
|
||||||
|
'podcast-view' => 'Home',
|
||||||
|
'podcast-edit' => 'Edit podcast',
|
||||||
|
'episodes' => 'Episodes',
|
||||||
|
'episode-list' => 'All episodes',
|
||||||
|
'episode-create' => 'New episode',
|
||||||
|
'analytics' => 'Analytics',
|
||||||
|
'contributors' => 'Contributors',
|
||||||
|
'contributor-list' => 'All contributors',
|
||||||
|
'contributor-add' => 'Add contributor',
|
||||||
|
'settings' => 'Settings',
|
||||||
|
'platforms' => 'Podcast platforms',
|
||||||
|
];
|
||||||
|
|
@ -12,15 +12,21 @@ return [
|
||||||
'ban' => 'Ban',
|
'ban' => 'Ban',
|
||||||
'unban' => 'Unban',
|
'unban' => 'Unban',
|
||||||
'delete' => 'Delete',
|
'delete' => 'Delete',
|
||||||
'create' => 'Create a user',
|
'create' => 'New user',
|
||||||
'view' => '{username}\'s info',
|
'view' => '{username}\'s info',
|
||||||
'all_users' => 'All users',
|
'all_users' => 'All users',
|
||||||
|
'list' => [
|
||||||
|
'user' => 'User',
|
||||||
|
'roles' => 'Roles',
|
||||||
|
'banned' => 'Banned?',
|
||||||
|
],
|
||||||
'form' => [
|
'form' => [
|
||||||
'email' => 'Email',
|
'email' => 'Email',
|
||||||
'username' => 'Username',
|
'username' => 'Username',
|
||||||
'password' => 'Password',
|
'password' => 'Password',
|
||||||
'new_password' => 'New Password',
|
'new_password' => 'New Password',
|
||||||
'roles' => 'Roles',
|
'roles' => 'Roles',
|
||||||
|
'permissions' => 'Permissions',
|
||||||
'submit_create' => 'Create user',
|
'submit_create' => 'Create user',
|
||||||
'submit_edit' => 'Save',
|
'submit_edit' => 'Save',
|
||||||
'submit_password_change' => 'Change!',
|
'submit_password_change' => 'Change!',
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ class Breadcrumb
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function render()
|
public function render($class = null)
|
||||||
{
|
{
|
||||||
$listItems = '';
|
$listItems = '';
|
||||||
$keys = array_keys($this->links);
|
$keys = array_keys($this->links);
|
||||||
|
|
@ -97,7 +97,9 @@ class Breadcrumb
|
||||||
|
|
||||||
return '<nav aria-label="' .
|
return '<nav aria-label="' .
|
||||||
lang('Breadcrumb.label') .
|
lang('Breadcrumb.label') .
|
||||||
'"><ol class="breadcrumb">' .
|
'"><ol class="breadcrumb ' .
|
||||||
|
$class .
|
||||||
|
'">' .
|
||||||
$listItems .
|
$listItems .
|
||||||
'</ol></nav>';
|
'</ol></nav>';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,4 +53,72 @@ class CategoryModel extends Model
|
||||||
|
|
||||||
return $options;
|
return $options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets categories for a given podcast
|
||||||
|
*
|
||||||
|
* @param int $podcastId
|
||||||
|
* @param array $categories
|
||||||
|
*
|
||||||
|
* @return integer|false Number of rows inserted or FALSE on failure
|
||||||
|
*/
|
||||||
|
public function setPodcastCategories($podcastId, $categories)
|
||||||
|
{
|
||||||
|
cache()->delete("podcasts{$podcastId}_categories");
|
||||||
|
|
||||||
|
// Remove already previously set categories to overwrite them
|
||||||
|
$this->db
|
||||||
|
->table('podcasts_categories')
|
||||||
|
->delete(['podcast_id' => $podcastId]);
|
||||||
|
|
||||||
|
if (!empty($categories)) {
|
||||||
|
// prepare data for `podcasts_categories` table
|
||||||
|
$data = array_reduce(
|
||||||
|
$categories,
|
||||||
|
function ($result, $categoryId) use ($podcastId) {
|
||||||
|
$result[] = [
|
||||||
|
'podcast_id' => $podcastId,
|
||||||
|
'category_id' => $categoryId,
|
||||||
|
];
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
},
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
|
// Set podcast categories
|
||||||
|
return $this->db->table('podcasts_categories')->insertBatch($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// no row has been inserted after deletion
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets all the podcast categories
|
||||||
|
*
|
||||||
|
* @param int $podcastId
|
||||||
|
*
|
||||||
|
* @return \App\Entities\Category[]
|
||||||
|
*/
|
||||||
|
public function getPodcastCategories($podcastId)
|
||||||
|
{
|
||||||
|
if (!($categories = cache("podcasts{$podcastId}_categories"))) {
|
||||||
|
$categories = $this->select('categories.*')
|
||||||
|
->join(
|
||||||
|
'podcasts_categories',
|
||||||
|
'podcasts_categories.category_id = categories.id'
|
||||||
|
)
|
||||||
|
->where('podcasts_categories.podcast_id', $podcastId)
|
||||||
|
->findAll();
|
||||||
|
|
||||||
|
cache()->save(
|
||||||
|
"podcasts{$podcastId}_categories",
|
||||||
|
$categories,
|
||||||
|
DECADE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $categories;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ class EpisodeModel extends Model
|
||||||
'enclosure_filesize',
|
'enclosure_filesize',
|
||||||
'description',
|
'description',
|
||||||
'image_uri',
|
'image_uri',
|
||||||
'explicit',
|
'parental_advisory',
|
||||||
'number',
|
'number',
|
||||||
'season_number',
|
'season_number',
|
||||||
'type',
|
'type',
|
||||||
|
|
@ -47,7 +47,6 @@ class EpisodeModel extends Model
|
||||||
'slug' => 'required|regex_match[/^[a-zA-Z0-9\-]{1,191}$/]',
|
'slug' => 'required|regex_match[/^[a-zA-Z0-9\-]{1,191}$/]',
|
||||||
'enclosure_uri' => 'required',
|
'enclosure_uri' => 'required',
|
||||||
'description' => 'required',
|
'description' => 'required',
|
||||||
'image_uri' => 'required',
|
|
||||||
'number' => 'is_natural_no_zero|permit_empty',
|
'number' => 'is_natural_no_zero|permit_empty',
|
||||||
'season_number' => 'is_natural_no_zero|permit_empty',
|
'season_number' => 'is_natural_no_zero|permit_empty',
|
||||||
'type' => 'required',
|
'type' => 'required',
|
||||||
|
|
|
||||||
|
|
@ -24,15 +24,14 @@ class PodcastModel extends Model
|
||||||
'image_uri',
|
'image_uri',
|
||||||
'language',
|
'language',
|
||||||
'category_id',
|
'category_id',
|
||||||
'explicit',
|
'parental_advisory',
|
||||||
'owner_name',
|
'owner_name',
|
||||||
'owner_email',
|
'owner_email',
|
||||||
'author',
|
'publisher',
|
||||||
'type',
|
'type',
|
||||||
'copyright',
|
'copyright',
|
||||||
'block',
|
'block',
|
||||||
'complete',
|
'complete',
|
||||||
'custom_html_head',
|
|
||||||
'created_by',
|
'created_by',
|
||||||
'updated_by',
|
'updated_by',
|
||||||
'imported_feed_url',
|
'imported_feed_url',
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,15 @@
|
||||||
import Dropdown from "./modules/Dropdown";
|
import Dropdown from "./modules/Dropdown";
|
||||||
import HTMLEditor from "./modules/HTMLEditor";
|
import EnclosureInput from "./modules/EnclosureInput";
|
||||||
import MarkdownEditor from "./modules/MarkdownEditor";
|
import MarkdownEditor from "./modules/MarkdownEditor";
|
||||||
|
import MultiSelect from "./modules/MultiSelect";
|
||||||
|
import SidebarToggler from "./modules/SidebarToggler";
|
||||||
import Slugify from "./modules/Slugify";
|
import Slugify from "./modules/Slugify";
|
||||||
import Tooltip from "./modules/Tooltip";
|
import Tooltip from "./modules/Tooltip";
|
||||||
|
|
||||||
Dropdown();
|
Dropdown();
|
||||||
Tooltip();
|
Tooltip();
|
||||||
MarkdownEditor();
|
MarkdownEditor();
|
||||||
HTMLEditor();
|
MultiSelect();
|
||||||
Slugify();
|
Slugify();
|
||||||
|
SidebarToggler();
|
||||||
|
EnclosureInput();
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
<g>
|
<g>
|
||||||
<path fill="none" d="M0 0h24v24H0z"/>
|
<path fill="none" d="M0 0h24v24H0z"/>
|
||||||
<path d="M10.828 12l4.95 4.95-1.414 1.414L8 12l6.364-6.364 1.414 1.414z"/>
|
<path d="M7.828 11H20v2H7.828l5.364 5.364-1.414 1.414L4 12l7.778-7.778 1.414 1.414z"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 214 B After Width: | Height: | Size: 226 B |
6
app/Views/_assets/icons/caret-right.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
|
<g>
|
||||||
|
<path fill="none" d="M0 0h24v24H0z"/>
|
||||||
|
<path d="M14 12l-4 4V8z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 166 B |
6
app/Views/_assets/icons/chevron-left.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
|
<g>
|
||||||
|
<path fill="none" d="M0 0h24v24H0z"/>
|
||||||
|
<path d="M10.828 12l4.95 4.95-1.414 1.414L8 12l6.364-6.364 1.414 1.414z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 214 B |
|
Before Width: | Height: | Size: 217 B After Width: | Height: | Size: 217 B |
6
app/Views/_assets/icons/download.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
|
<g>
|
||||||
|
<path fill="none" d="M0 0h24v24H0z"/>
|
||||||
|
<path d="M13 10h5l-6 6-6-6h5V3h2v7zm-9 9h16v-7h2v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-8h2v7z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 231 B |
6
app/Views/_assets/icons/line-chart.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
|
<g>
|
||||||
|
<path fill="none" d="M0 0H24V24H0z"/>
|
||||||
|
<path d="M5 3v16h16v2H3V3h2zm15.293 3.293l1.414 1.414L16 13.414l-3-2.999-4.293 4.292-1.414-1.414L13 7.586l3 2.999 4.293-4.292z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 269 B |
6
app/Views/_assets/icons/menu.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
|
<g>
|
||||||
|
<path fill="none" d="M0 0h24v24H0z"/>
|
||||||
|
<path d="M3 4h18v2H3V4zm0 7h12v2H3v-2zm0 7h18v2H3v-2z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 196 B |
6
app/Views/_assets/icons/question.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
|
<g>
|
||||||
|
<path fill="none" d="M0 0h24v24H0z"/>
|
||||||
|
<path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16zm-1-5h2v2h-2v-2zm2-1.645V14h-2v-1.5a1 1 0 0 1 1-1 1.5 1.5 0 1 0-1.471-1.794l-1.962-.393A3.501 3.501 0 1 1 13 13.355z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 376 B |
6
app/Views/_assets/icons/settings.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
|
<g>
|
||||||
|
<path fill="none" d="M0 0h24v24H0z"/>
|
||||||
|
<path d="M2 12c0-.865.11-1.703.316-2.504A3 3 0 0 0 4.99 4.867a9.99 9.99 0 0 1 4.335-2.505 3 3 0 0 0 5.348 0 9.99 9.99 0 0 1 4.335 2.505 3 3 0 0 0 2.675 4.63c.206.8.316 1.638.316 2.503 0 .865-.11 1.703-.316 2.504a3 3 0 0 0-2.675 4.629 9.99 9.99 0 0 1-4.335 2.505 3 3 0 0 0-5.348 0 9.99 9.99 0 0 1-4.335-2.505 3 3 0 0 0-2.675-4.63C2.11 13.704 2 12.866 2 12zm4.804 3c.63 1.091.81 2.346.564 3.524.408.29.842.541 1.297.75A4.993 4.993 0 0 1 12 18c1.26 0 2.438.471 3.335 1.274.455-.209.889-.46 1.297-.75A4.993 4.993 0 0 1 17.196 15a4.993 4.993 0 0 1 2.77-2.25 8.126 8.126 0 0 0 0-1.5A4.993 4.993 0 0 1 17.195 9a4.993 4.993 0 0 1-.564-3.524 7.989 7.989 0 0 0-1.297-.75A4.993 4.993 0 0 1 12 6a4.993 4.993 0 0 1-3.335-1.274 7.99 7.99 0 0 0-1.297.75A4.993 4.993 0 0 1 6.804 9a4.993 4.993 0 0 1-2.77 2.25 8.126 8.126 0 0 0 0 1.5A4.993 4.993 0 0 1 6.805 15zM12 15a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0-2a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1 KiB |
6
app/Views/_assets/icons/user-add.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
|
<g>
|
||||||
|
<path fill="none" d="M0 0h24v24H0z"/>
|
||||||
|
<path d="M14 14.252v2.09A6 6 0 0 0 6 22l-2-.001a8 8 0 0 1 10-7.748zM12 13c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm6 6v-3h2v3h3v2h-3v3h-2v-3h-3v-2h3z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 366 B |
6
app/Views/_assets/icons/user.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||||
|
<g>
|
||||||
|
<path fill="none" d="M0 0h24v24H0z"/>
|
||||||
|
<path d="M4 22a8 8 0 1 1 16 0h-2a6 6 0 1 0-12 0H4zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 312 B |
24
app/Views/_assets/modules/EnclosureInput.ts
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
const EnclosureInput = (): void => {
|
||||||
|
const enclosureInput = document.querySelector(
|
||||||
|
".form-enclosure-input"
|
||||||
|
) as HTMLInputElement;
|
||||||
|
|
||||||
|
if (enclosureInput) {
|
||||||
|
const label = enclosureInput?.nextElementSibling?.querySelector(
|
||||||
|
"span"
|
||||||
|
) as HTMLSpanElement;
|
||||||
|
const labelVal = label.innerHTML;
|
||||||
|
|
||||||
|
enclosureInput.addEventListener("change", (e: Event) => {
|
||||||
|
const fileName = (e.target as HTMLInputElement).value.split("\\").pop();
|
||||||
|
|
||||||
|
if (fileName) {
|
||||||
|
label.innerHTML = fileName;
|
||||||
|
} else {
|
||||||
|
label.innerHTML = labelVal;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default EnclosureInput;
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
import CodeMirror from "codemirror";
|
|
||||||
import "codemirror/lib/codemirror.css";
|
|
||||||
|
|
||||||
const HTMLEditor = (): void => {
|
|
||||||
const allHTMLEditors: NodeListOf<HTMLTextAreaElement> = document.querySelectorAll(
|
|
||||||
"textarea[data-editor='html']"
|
|
||||||
);
|
|
||||||
|
|
||||||
for (let j = 0; j < allHTMLEditors.length; j++) {
|
|
||||||
const textarea = allHTMLEditors[j];
|
|
||||||
|
|
||||||
CodeMirror.fromTextArea(textarea, {
|
|
||||||
lineNumbers: true,
|
|
||||||
mode: { name: "xml", htmlMode: true },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export default HTMLEditor;
|
|
||||||
|
|
@ -59,7 +59,7 @@ class ProseMirrorView {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
attributes: {
|
attributes: {
|
||||||
class: "prose-sm px-3 py-2 overflow-y-auto",
|
class: "prose-sm px-3 py-2 overflow-y-auto focus:shadow-outline",
|
||||||
style: "min-height: 200px; max-height: 500px",
|
style: "min-height: 200px; max-height: 500px",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
@ -95,12 +95,22 @@ const MarkdownEditor = (): void => {
|
||||||
"px-2",
|
"px-2",
|
||||||
"bg-white",
|
"bg-white",
|
||||||
"border",
|
"border",
|
||||||
"text-xs"
|
"text-xs",
|
||||||
|
"outline-none",
|
||||||
|
"focus:shadow-outline"
|
||||||
);
|
);
|
||||||
wysiwygBtn.setAttribute("type", "button");
|
wysiwygBtn.setAttribute("type", "button");
|
||||||
wysiwygBtn.innerHTML = "Wysiwyg";
|
wysiwygBtn.innerHTML = "Wysiwyg";
|
||||||
const markdownBtn = document.createElement("button");
|
const markdownBtn = document.createElement("button");
|
||||||
markdownBtn.classList.add("py-1", "px-2", "bg-white", "border", "text-xs");
|
markdownBtn.classList.add(
|
||||||
|
"py-1",
|
||||||
|
"px-2",
|
||||||
|
"bg-white",
|
||||||
|
"border",
|
||||||
|
"text-xs",
|
||||||
|
"outline-none",
|
||||||
|
"focus:shadow-outline"
|
||||||
|
);
|
||||||
markdownBtn.setAttribute("type", "button");
|
markdownBtn.setAttribute("type", "button");
|
||||||
markdownBtn.innerHTML = "Markdown";
|
markdownBtn.innerHTML = "Markdown";
|
||||||
|
|
||||||
|
|
|
||||||
40
app/Views/_assets/modules/MultiSelect.ts
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
import Choices from "choices.js";
|
||||||
|
|
||||||
|
const MultiSelect = (): void => {
|
||||||
|
// Pass single element
|
||||||
|
const multiSelects: NodeListOf<HTMLSelectElement> = document.querySelectorAll(
|
||||||
|
"select[multiple]"
|
||||||
|
);
|
||||||
|
|
||||||
|
for (let i = 0; i < multiSelects.length; i++) {
|
||||||
|
const multiSelect = multiSelects[i];
|
||||||
|
|
||||||
|
new Choices(multiSelect, {
|
||||||
|
maxItemCount: parseInt(multiSelect.dataset.maxItemCount || "-1"),
|
||||||
|
itemSelectText: multiSelect.dataset.selectText,
|
||||||
|
maxItemText: multiSelect.dataset.maxItemText,
|
||||||
|
removeItemButton: true,
|
||||||
|
classNames: {
|
||||||
|
containerOuter:
|
||||||
|
"multiselect" +
|
||||||
|
(multiSelect.dataset.class ? ` ${multiSelect.dataset.class}` : ""),
|
||||||
|
containerInner: "multiselect__inner",
|
||||||
|
input: "multiselect__input",
|
||||||
|
inputCloned: "multiselect__input--cloned",
|
||||||
|
list: "multiselect__list",
|
||||||
|
listItems: "multiselect__list--multiple",
|
||||||
|
listDropdown: "multiselect__list--dropdown",
|
||||||
|
item: "multiselect__item",
|
||||||
|
itemSelectable: "multiselect__item--selectable",
|
||||||
|
itemDisabled: "multiselect__item--disabled",
|
||||||
|
itemChoice: "multiselect__item--choice",
|
||||||
|
placeholder: "multiselect__placeholder",
|
||||||
|
group: "multiselect__group",
|
||||||
|
groupHeading: "multiselect__heading",
|
||||||
|
button: "multiselect__button",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default MultiSelect;
|
||||||
62
app/Views/_assets/modules/SidebarToggler.ts
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
const SidebarToggler = (): void => {
|
||||||
|
const sidebar = document.querySelector(
|
||||||
|
"aside[id='admin-sidebar']"
|
||||||
|
) as HTMLElement;
|
||||||
|
const toggler = document.querySelector(
|
||||||
|
"button[id='sidebar-toggler']"
|
||||||
|
) as HTMLButtonElement;
|
||||||
|
const sidebarBackdrop = document.querySelector(
|
||||||
|
"div[id='sidebar-backdrop']"
|
||||||
|
) as HTMLElement;
|
||||||
|
|
||||||
|
const setAriaExpanded = (isExpanded: "true" | "false") => {
|
||||||
|
toggler.setAttribute("aria-expanded", isExpanded);
|
||||||
|
sidebarBackdrop.setAttribute("aria-expanded", isExpanded);
|
||||||
|
};
|
||||||
|
|
||||||
|
const hideSidebar = () => {
|
||||||
|
setAriaExpanded("false");
|
||||||
|
sidebar.classList.add("-translate-x-full");
|
||||||
|
sidebarBackdrop.classList.add("hidden");
|
||||||
|
toggler.style.transform = "translateX(0px)";
|
||||||
|
};
|
||||||
|
|
||||||
|
const showSidebar = () => {
|
||||||
|
setAriaExpanded("true");
|
||||||
|
sidebar.classList.remove("-translate-x-full");
|
||||||
|
sidebarBackdrop.classList.remove("hidden");
|
||||||
|
toggler.style.transform =
|
||||||
|
"translateX(" + sidebar.getBoundingClientRect().width + "px)";
|
||||||
|
};
|
||||||
|
|
||||||
|
toggler.addEventListener("click", () => {
|
||||||
|
if (sidebar.classList.contains("-translate-x-full")) {
|
||||||
|
showSidebar();
|
||||||
|
} else {
|
||||||
|
hideSidebar();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
sidebarBackdrop.addEventListener("click", () => {
|
||||||
|
if (!sidebar.classList.contains("-translate-x-full")) {
|
||||||
|
hideSidebar();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const setAriaExpandedOnWindowEvent = () => {
|
||||||
|
const isExpanded =
|
||||||
|
!sidebar.classList.contains("-translate-x-full") ||
|
||||||
|
window.innerWidth >= 768;
|
||||||
|
const ariaExpanded = toggler.getAttribute("aria-expanded");
|
||||||
|
if (isExpanded && (!ariaExpanded || ariaExpanded === "false")) {
|
||||||
|
setAriaExpanded("true");
|
||||||
|
} else if (!isExpanded && (!ariaExpanded || ariaExpanded === "true")) {
|
||||||
|
setAriaExpanded("false");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener("load", setAriaExpandedOnWindowEvent);
|
||||||
|
window.addEventListener("resize", setAriaExpandedOnWindowEvent);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SidebarToggler;
|
||||||
|
|
@ -10,10 +10,10 @@ const Tooltip = (): void => {
|
||||||
const tooltipContent = tooltipReference.title;
|
const tooltipContent = tooltipReference.title;
|
||||||
|
|
||||||
const tooltip = document.createElement("div");
|
const tooltip = document.createElement("div");
|
||||||
tooltip.setAttribute("id", "tooltip");
|
tooltip.setAttribute("id", "tooltip" + i);
|
||||||
tooltip.setAttribute(
|
tooltip.setAttribute(
|
||||||
"class",
|
"class",
|
||||||
"px-2 py-1 text-sm bg-gray-900 text-white rounded"
|
"px-2 py-1 text-sm bg-gray-900 text-white rounded max-w-xs z-50"
|
||||||
);
|
);
|
||||||
tooltip.innerHTML = tooltipContent;
|
tooltip.innerHTML = tooltipContent;
|
||||||
|
|
||||||
|
|
@ -31,13 +31,13 @@ const Tooltip = (): void => {
|
||||||
|
|
||||||
const show = () => {
|
const show = () => {
|
||||||
tooltipReference.removeAttribute("title");
|
tooltipReference.removeAttribute("title");
|
||||||
tooltipReference.setAttribute("aria-describedby", "tooltip");
|
tooltipReference.setAttribute("aria-describedby", "tooltip" + i);
|
||||||
document.body.appendChild(tooltip);
|
document.body.appendChild(tooltip);
|
||||||
popper.update();
|
popper.update();
|
||||||
};
|
};
|
||||||
|
|
||||||
const hide = () => {
|
const hide = () => {
|
||||||
const element = document.getElementById("tooltip");
|
const element = document.getElementById("tooltip" + i);
|
||||||
tooltipReference.removeAttribute("aria-describedby");
|
tooltipReference.removeAttribute("aria-describedby");
|
||||||
tooltipReference.setAttribute("title", tooltipContent);
|
tooltipReference.setAttribute("title", tooltipContent);
|
||||||
if (element) {
|
if (element) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
.breadcrumb {
|
.breadcrumb {
|
||||||
@apply inline-flex flex-wrap px-1 py-2 text-sm text-gray-800;
|
@apply inline-flex flex-wrap px-1 py-2 text-sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
.breadcrumb-item + .breadcrumb-item::before {
|
.breadcrumb-item + .breadcrumb-item::before {
|
||||||
|
|
|
||||||
16
app/Views/_assets/styles/enclosureInput.css
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
.form-enclosure-input {
|
||||||
|
@apply absolute w-0 h-0 opacity-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-enclosure-input + label {
|
||||||
|
@apply inline-flex items-center justify-center w-full py-2 text-lg font-semibold text-green-600 bg-white border-2 border-green-500 rounded-lg shadow cursor-pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-enclosure-input:focus + label,
|
||||||
|
.form-enclosure-input + label:hover {
|
||||||
|
@apply text-green-700 border-green-700 shadow-md;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-enclosure-input:focus + label {
|
||||||
|
@apply shadow-outline;
|
||||||
|
}
|
||||||
|
|
@ -1,3 +1,7 @@
|
||||||
@import "./tailwind.css";
|
@import "./tailwind.css";
|
||||||
@import "./layout.css";
|
@import "./layout.css";
|
||||||
@import "./breadcrumb.css";
|
@import "./breadcrumb.css";
|
||||||
|
@import "./multiSelect.css";
|
||||||
|
@import "./radioBtn.css";
|
||||||
|
@import "./switch.css";
|
||||||
|
@import "./enclosureInput.css";
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,26 @@
|
||||||
.holy-grail-grid {
|
.holy-grail-grid {
|
||||||
@apply grid;
|
@apply grid min-h-screen overflow-y-auto;
|
||||||
grid-template: auto 1fr auto / auto 1fr auto;
|
grid-template: 1fr auto / auto 1fr;
|
||||||
|
|
||||||
& .holy-grail-header {
|
& .holy-grail-sidebar {
|
||||||
grid-column: 1 / 4;
|
@apply w-64 col-start-1 col-end-2 row-start-1 row-end-3;
|
||||||
}
|
|
||||||
|
|
||||||
& .holy-grail-sidenav {
|
|
||||||
grid-column: 1 / 2;
|
|
||||||
grid-row: 2 / 4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
& .holy-grail-main {
|
& .holy-grail-main {
|
||||||
grid-column: 2 / 4;
|
@apply w-full col-start-1 col-end-3 row-start-1 row-end-2;
|
||||||
}
|
}
|
||||||
|
|
||||||
& .holy-grail-footer {
|
& .holy-grail-footer {
|
||||||
grid-column: 2 / 4;
|
@apply w-full col-start-1 col-end-3 row-start-2 row-end-3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@screen md {
|
||||||
|
& .holy-grail-main {
|
||||||
|
@apply col-start-2;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .holy-grail-footer {
|
||||||
|
@apply col-start-2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
180
app/Views/_assets/styles/multiSelect.css
Normal file
|
|
@ -0,0 +1,180 @@
|
||||||
|
/*===============================
|
||||||
|
= MultiSelect =
|
||||||
|
===============================*/
|
||||||
|
.multiselect {
|
||||||
|
@apply relative;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
@apply shadow-outline outline-none;
|
||||||
|
}
|
||||||
|
&:last-child {
|
||||||
|
@apply mb-0;
|
||||||
|
}
|
||||||
|
&.is-disabled {
|
||||||
|
&.multiselect__inner,
|
||||||
|
&.multiselect__input {
|
||||||
|
@apply bg-gray-300 cursor-not-allowed select-none;
|
||||||
|
}
|
||||||
|
&.multiselect__item {
|
||||||
|
@apply cursor-not-allowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& [hidden] {
|
||||||
|
@apply hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect[data-type*="select-multiple"],
|
||||||
|
.multiselect[data-type*="text"] {
|
||||||
|
& .multiselect__inner {
|
||||||
|
@apply cursor-text;
|
||||||
|
}
|
||||||
|
& .multiselect__button {
|
||||||
|
@apply relative inline-block w-2 pl-4 mt-0 mb-0 ml-1 opacity-75;
|
||||||
|
background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);
|
||||||
|
background-size: 8px;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus {
|
||||||
|
@apply opacity-100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__inner {
|
||||||
|
@apply inline-block w-full px-2 pt-2 pb-1 overflow-hidden align-top bg-white border rounded;
|
||||||
|
|
||||||
|
&.is-focused,
|
||||||
|
&.is-open {
|
||||||
|
@apply shadow-outline;
|
||||||
|
}
|
||||||
|
&.is-open {
|
||||||
|
@apply rounded-b-none;
|
||||||
|
}
|
||||||
|
&.is-flipped.is-open {
|
||||||
|
@apply rounded-t-none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__list {
|
||||||
|
@apply p-0 m-0 list-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__list--multiple {
|
||||||
|
@apply inline;
|
||||||
|
|
||||||
|
& .multiselect__item {
|
||||||
|
@apply inline-flex px-2 py-1 mb-1 mr-2 text-sm text-white break-all bg-green-500 rounded;
|
||||||
|
|
||||||
|
&[data-deletable] {
|
||||||
|
@apply pr-1;
|
||||||
|
}
|
||||||
|
& [dir="rtl"] {
|
||||||
|
@apply ml-2 mr-0;
|
||||||
|
}
|
||||||
|
&.is-highlighted {
|
||||||
|
@apply bg-green-700;
|
||||||
|
}
|
||||||
|
&.is-disabled {
|
||||||
|
@apply bg-gray-500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__list--dropdown {
|
||||||
|
@apply absolute z-10 invisible w-full overflow-hidden break-all bg-white border border-t-0 rounded-b shadow-lg;
|
||||||
|
top: 100%;
|
||||||
|
will-change: visibility;
|
||||||
|
|
||||||
|
&.is-active {
|
||||||
|
@apply visible;
|
||||||
|
}
|
||||||
|
&.is-open {
|
||||||
|
@apply shadow-outline;
|
||||||
|
}
|
||||||
|
&.is-flipped {
|
||||||
|
@apply top-auto mt-0 rounded-t;
|
||||||
|
bottom: 100%;
|
||||||
|
}
|
||||||
|
& .multiselect__list {
|
||||||
|
@apply relative overflow-auto;
|
||||||
|
max-height: 300px;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
will-change: scroll-position;
|
||||||
|
}
|
||||||
|
& .multiselect__item {
|
||||||
|
@apply relative p-3;
|
||||||
|
|
||||||
|
& [dir="rtl"] {
|
||||||
|
@apply text-right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
& .multiselect__item--selectable {
|
||||||
|
@screen sm {
|
||||||
|
padding-right: 100px;
|
||||||
|
&:after {
|
||||||
|
@apply absolute text-sm transform -translate-y-1/2 opacity-0;
|
||||||
|
content: attr(data-select-text);
|
||||||
|
right: 10px;
|
||||||
|
top: 50%;
|
||||||
|
}
|
||||||
|
& [dir="rtl"] {
|
||||||
|
@apply text-right;
|
||||||
|
padding-left: 100px;
|
||||||
|
padding-right: 10px;
|
||||||
|
&:after {
|
||||||
|
@apply right-auto;
|
||||||
|
left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&.is-highlighted {
|
||||||
|
@apply bg-gray-100;
|
||||||
|
&:after {
|
||||||
|
@apply opacity-50;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__item {
|
||||||
|
@apply cursor-default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__item--selectable {
|
||||||
|
@apply cursor-pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__item--disabled {
|
||||||
|
@apply opacity-50 cursor-not-allowed select-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__heading {
|
||||||
|
@apply p-3 font-semibold text-gray-600 border-b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__button {
|
||||||
|
@apply bg-transparent bg-center bg-no-repeat border-0 appearance-none cursor-pointer;
|
||||||
|
text-indent: -9999px;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
@apply outline-none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__input {
|
||||||
|
@apply inline-block max-w-full py-1 pl-1 mb-1 align-baseline bg-transparent border-0 rounded-none;
|
||||||
|
&:focus {
|
||||||
|
@apply outline-none;
|
||||||
|
}
|
||||||
|
& [dir="rtl"] {
|
||||||
|
@apply pl-0 pr-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.multiselect__placeholder {
|
||||||
|
@apply opacity-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===== End of Choices ======*/
|
||||||
24
app/Views/_assets/styles/radioBtn.css
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
.form-radio-btn {
|
||||||
|
@apply absolute opacity-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-radio-btn:focus + label {
|
||||||
|
@apply shadow-outline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-radio-btn + label {
|
||||||
|
@apply px-2 py-1 text-sm text-black bg-white border rounded cursor-pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
@apply bg-green-100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-radio-btn:checked + label {
|
||||||
|
@apply text-white bg-green-500;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
@apply mr-2 text-green-200;
|
||||||
|
content: "✓";
|
||||||
|
}
|
||||||
|
}
|
||||||
26
app/Views/_assets/styles/switch.css
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
.form-switch {
|
||||||
|
@apply absolute w-0 h-0 opacity-0;
|
||||||
|
|
||||||
|
&:checked + .form-switch-slider {
|
||||||
|
@apply bg-green-500;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus + .form-switch-slider {
|
||||||
|
@apply shadow-outline;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:checked + .form-switch-slider::before {
|
||||||
|
@apply transform translate-x-5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-switch-slider {
|
||||||
|
@apply relative inset-0 flex-shrink-0 w-10 h-5 transition duration-200 bg-gray-400 rounded-full cursor-pointer;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
@apply absolute w-4 h-4 transition duration-200 bg-white rounded-full shadow-xs;
|
||||||
|
content: "";
|
||||||
|
left: 2px;
|
||||||
|
bottom: 2px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?= helper('page') ?>
|
<?= helper('page') ?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="<?= service('request')->getLocale() ?>">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8"/>
|
<meta charset="UTF-8"/>
|
||||||
|
|
@ -9,9 +9,6 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
<link rel="shortcut icon" type="image/png" href="/favicon.ico" />
|
<link rel="shortcut icon" type="image/png" href="/favicon.ico" />
|
||||||
<link rel="stylesheet" href="/assets/index.css"/>
|
<link rel="stylesheet" href="/assets/index.css"/>
|
||||||
<?php if (isset($podcast)): ?>
|
|
||||||
<?= $podcast->custom_html_head ?>
|
|
||||||
<?php endif; ?>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="flex flex-col min-h-screen mx-auto">
|
<body class="flex flex-col min-h-screen mx-auto">
|
||||||
|
|
@ -25,6 +22,9 @@
|
||||||
</main>
|
</main>
|
||||||
<footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right border-t">
|
<footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right border-t">
|
||||||
<?= render_page_links() ?>
|
<?= render_page_links() ?>
|
||||||
<p>Powered by <a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>, a <a class="underline hover:no-underline" href="https://podlibre.org/" target="_blank" rel="noreferrer noopener">Podlibre</a> initiative.</p>
|
<small><?= lang('Common.powered_by', [
|
||||||
|
'castopod' =>
|
||||||
|
'<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>',
|
||||||
|
]) ?></small>
|
||||||
</footer>
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
<header class="<?= $class ?>">
|
|
||||||
<div class="w-64">
|
|
||||||
<a href="<?= route_to(
|
|
||||||
'admin'
|
|
||||||
) ?>" class="inline-flex items-center text-xl">
|
|
||||||
<?= svg('logo-castopod', 'h-10 mr-2') ?>
|
|
||||||
Admin
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<?= render_breadcrumb() ?>
|
|
||||||
<div class="relative ml-auto" data-toggle="dropdown">
|
|
||||||
<button type="button" class="inline-flex items-center px-2 py-1 outline-none focus:shadow-outline" id="my-accountDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false">
|
|
||||||
Hey <?= user()->username ?>
|
|
||||||
<?= icon('caret-down', 'ml-2') ?>
|
|
||||||
</button>
|
|
||||||
<nav class="absolute z-10 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="my-accountDropdown" data-popper="menu" data-popper-placement="bottom-end">
|
|
||||||
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
|
||||||
'my-account'
|
|
||||||
) ?>">My Account</a>
|
|
||||||
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
|
||||||
'change-password'
|
|
||||||
) ?>">Change password</a>
|
|
||||||
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
|
||||||
'logout'
|
|
||||||
) ?>">Logout</a>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
@ -1,31 +1,54 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="<?= service('request')->getLocale() ?>">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8"/>
|
<meta charset="UTF-8"/>
|
||||||
<title>Castopod Admin</title>
|
<title><?= $this->renderSection('title') ?> | Castopod Admin</title>
|
||||||
<meta name="description" content="Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience."/>
|
<meta name="description" content="Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience."/>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
<link rel="shortcut icon" type="image/png" href="/favicon.ico" />
|
<link rel="shortcut icon" type="image/png" href="/favicon.ico" />
|
||||||
<link rel="stylesheet" href="/assets/admin.css"/>
|
<link rel="stylesheet" href="/assets/admin.css"/>
|
||||||
<link rel="stylesheet" href="/assets/index.css"/>
|
<link rel="stylesheet" href="/assets/index.css"/>
|
||||||
|
<script src="/assets/admin.js" defer></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="min-h-screen bg-gray-100 holy-grail-grid">
|
<body class="relative bg-gray-100 holy-grail-grid">
|
||||||
<?= view('admin/_header', [
|
<div id="sidebar-backdrop" role="button" tabIndex="0" aria-label="Close" class="fixed z-50 hidden w-full h-full bg-gray-900 bg-opacity-50 md:hidden"></div>
|
||||||
'class' => 'flex items-center px-4 py-2 holy-grail-header',
|
<aside id="admin-sidebar" class="sticky top-0 z-50 flex flex-col w-64 max-h-screen transition duration-200 ease-in-out transform -translate-x-full bg-white border-r holy-grail-sidebar md:translate-x-0">
|
||||||
]) ?>
|
<?php if (isset($podcast)): ?>
|
||||||
<?= view('admin/_sidenav', [
|
<?= $this->include('admin/podcast/_sidebar') ?>
|
||||||
'class' => 'flex flex-col w-64 py-6 holy-grail-sidenav',
|
<?php else: ?>
|
||||||
]) ?>
|
<?= $this->include('admin/_sidebar') ?>
|
||||||
<main class="container px-4 py-6 mx-auto holy-grail-main">
|
<?php endif; ?>
|
||||||
<h1 class="mb-4 text-2xl"><?= $this->renderSection('title') ?></h1>
|
</aside>
|
||||||
<?= view('_message_block') ?>
|
<main class="overflow-hidden holy-grail-main">
|
||||||
<?= $this->renderSection('content') ?>
|
<header class="text-white bg-gradient-to-tr from-gray-900 to-gray-800">
|
||||||
|
<div class="container flex flex-wrap items-end justify-between px-2 py-10 mx-auto md:px-12 gap-y-6 gap-x-6">
|
||||||
|
<div class="flex flex-col">
|
||||||
|
<?= render_breadcrumb('text-gray-300') ?>
|
||||||
|
<h1 class="text-3xl leading-none"><?= $this->renderSection(
|
||||||
|
'pageTitle'
|
||||||
|
) ?></h1>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-wrap gap-y-2"><?= $this->renderSection(
|
||||||
|
'headerRight'
|
||||||
|
) ?></div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="container px-2 py-8 mx-auto md:px-12">
|
||||||
|
<?= view('_message_block') ?>
|
||||||
|
<?= $this->renderSection('content') ?>
|
||||||
|
</div>
|
||||||
</main>
|
</main>
|
||||||
<footer class="w-full px-2 py-4 mx-auto text-xs text-right border-t holy-grail-footer">
|
<footer class="px-2 py-2 mx-auto text-xs text-right holy-grail-footer">
|
||||||
Powered by <a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>, a <a class="underline hover:no-underline" href="https://podlibre.org/" target="_blank" rel="noreferrer noopener">Podlibre</a> initiative.
|
<small><?= lang('Common.powered_by', [
|
||||||
|
'castopod' =>
|
||||||
|
'<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>',
|
||||||
|
]) ?></small>
|
||||||
</footer>
|
</footer>
|
||||||
|
<button
|
||||||
<script src="/assets/admin.js"></script>
|
type="button"
|
||||||
|
id="sidebar-toggler"
|
||||||
|
class="fixed bottom-0 left-0 z-50 p-3 mb-3 ml-3 text-xl transition duration-300 ease-in-out bg-white border-2 rounded-full shadow-lg focus:outline-none md:hidden hover:bg-gray-100 focus:shadow-outline"
|
||||||
|
style="transform: translateX(0px);"><?= icon('menu') ?></button>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
<article class="flex w-full max-w-lg mb-4 bg-white border rounded shadow">
|
|
||||||
<img
|
|
||||||
loading="lazy"
|
|
||||||
src="<?= $episode->image->thumbnail_url ?>"
|
|
||||||
alt="<?= $episode->title ?>" class="object-cover w-32 h-32 rounded-l" />
|
|
||||||
<div class="flex flex-col flex-1 px-4 py-2">
|
|
||||||
<a href="<?= route_to(
|
|
||||||
'episode-view',
|
|
||||||
$episode->podcast->id,
|
|
||||||
$episode->id
|
|
||||||
) ?>">
|
|
||||||
<h3 class="text-xl font-semibold">
|
|
||||||
<span class="mr-1 underline hover:no-underline"><?= $episode->title ?></span>
|
|
||||||
<span class="text-base font-bold text-gray-600">#<?= $episode->number ?></span>
|
|
||||||
</h3>
|
|
||||||
</a>
|
|
||||||
<div class="relative ml-auto" data-toggle="dropdown">
|
|
||||||
<button type="button" class="inline-flex items-center p-1 outline-none focus:shadow-outline" id="moreDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false">
|
|
||||||
<?= icon('more') ?>
|
|
||||||
</button>
|
|
||||||
<nav class="absolute z-10 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="moreDropdown" data-popper="menu" data-popper-placement="bottom-start" data-popper-offset-x="0" data-popper-offset-y="0" >
|
|
||||||
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
|
||||||
'episode-edit',
|
|
||||||
$episode->podcast->id,
|
|
||||||
$episode->id
|
|
||||||
) ?>"><?= lang('Episode.edit') ?></a>
|
|
||||||
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
|
||||||
'episode',
|
|
||||||
$episode->podcast->name,
|
|
||||||
$episode->slug
|
|
||||||
) ?>"><?= lang('Episode.go_to_page') ?></a>
|
|
||||||
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
|
||||||
'episode-delete',
|
|
||||||
$episode->podcast->id,
|
|
||||||
$episode->id
|
|
||||||
) ?>"><?= lang('Episode.delete') ?></a>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
<audio controls class="mt-auto" preload="none">
|
|
||||||
<source src="/<?= $episode->enclosure_media_path ?>" type="<?= $episode->enclosure_type ?>">
|
|
||||||
Your browser does not support the audio tag.
|
|
||||||
</audio>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
<div class="flex flex-col py-4">
|
|
||||||
<?php if ($episodes): ?>
|
|
||||||
<?php foreach ($episodes as $episode): ?>
|
|
||||||
<?= view('admin/_partials/_episode-card', [
|
|
||||||
'episode' => $episode,
|
|
||||||
]) ?>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
<?php else: ?>
|
|
||||||
<p class="italic"><?= lang('Podcast.no_episode') ?></p>
|
|
||||||
<?php endif; ?>
|
|
||||||
</div>
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
<article class="w-48 h-full mb-4 mr-4 overflow-hidden bg-white border rounded shadow">
|
|
||||||
<img
|
|
||||||
alt="<?= $podcast->title ?>"
|
|
||||||
src="<?= $podcast->image
|
|
||||||
->thumbnail_url ?>" class="object-cover w-full h-40" />
|
|
||||||
<div class="p-2">
|
|
||||||
<a href="<?= route_to(
|
|
||||||
'podcast-view',
|
|
||||||
$podcast->id
|
|
||||||
) ?>" class="hover:underline">
|
|
||||||
<h2 class="font-semibold"><?= $podcast->title ?></h2>
|
|
||||||
</a>
|
|
||||||
<p class="text-gray-600">@<?= $podcast->name ?></p>
|
|
||||||
</div>
|
|
||||||
<footer class="flex items-center justify-end p-2">
|
|
||||||
<a class="inline-flex p-2 mr-2 text-teal-700 bg-teal-100 rounded-full shadow-xs hover:bg-teal-200" href="<?= route_to(
|
|
||||||
'podcast-edit',
|
|
||||||
$podcast->id
|
|
||||||
) ?>" data-toggle="tooltip" data-placement="bottom" title="<?= lang(
|
|
||||||
'Podcast.edit'
|
|
||||||
) ?>"><?= icon('edit') ?></a>
|
|
||||||
<a class="inline-flex p-2 text-gray-700 bg-gray-100 rounded-full shadow-xs hover:bg-gray-200" href="<?= route_to(
|
|
||||||
'podcast-view',
|
|
||||||
$podcast->id
|
|
||||||
) ?>" data-toggle="tooltip" data-placement="bottom" title="<?= lang(
|
|
||||||
'Podcast.view'
|
|
||||||
) ?>"><?= icon('eye') ?></a>
|
|
||||||
</footer>
|
|
||||||
</article>
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="px-4 py-5 bg-gray-50 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
<div class="px-4 py-5 bg-gray-50 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
||||||
<dt class="text-sm font-medium leading-5 text-gray-500">
|
<dt class="text-sm font-medium leading-5 text-gray-500">
|
||||||
Email
|
<?= lang('User.form.email') ?>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
||||||
<?= $user->email ?>
|
<?= $user->email ?>
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="px-4 py-5 bg-gray-50 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
<div class="px-4 py-5 bg-gray-50 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
||||||
<dt class="text-sm font-medium leading-5 text-gray-500">
|
<dt class="text-sm font-medium leading-5 text-gray-500">
|
||||||
Username
|
<?= lang('User.form.username') ?>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
||||||
<?= $user->username ?>
|
<?= $user->username ?>
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="px-4 py-5 bg-gray-50 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
<div class="px-4 py-5 bg-gray-50 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
||||||
<dt class="text-sm font-medium leading-5 text-gray-500">
|
<dt class="text-sm font-medium leading-5 text-gray-500">
|
||||||
Roles
|
<?= lang('User.form.roles') ?>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
||||||
[<?= implode(', ', $user->roles) ?>]
|
[<?= implode(', ', $user->roles) ?>]
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="px-4 py-5 bg-gray-50 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
<div class="px-4 py-5 bg-gray-50 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
||||||
<dt class="text-sm font-medium leading-5 text-gray-500">
|
<dt class="text-sm font-medium leading-5 text-gray-500">
|
||||||
Permissions
|
<?= lang('User.form.permissions') ?>
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
||||||
[<?= implode(', ', $user->permissions) ?>]
|
[<?= implode(', ', $user->permissions) ?>]
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,19 @@ $navigation = [
|
||||||
'pages' => ['icon' => 'pages', 'items' => ['page-list', 'page-create']],
|
'pages' => ['icon' => 'pages', 'items' => ['page-list', 'page-create']],
|
||||||
]; ?>
|
]; ?>
|
||||||
|
|
||||||
<nav class="<?= $class ?>">
|
<a href="<?= route_to(
|
||||||
|
'admin'
|
||||||
|
) ?>" class="inline-flex items-center px-4 py-2 mb-2 text-xl">
|
||||||
|
<?= svg('logo-castopod', 'h-8 mr-2') ?>
|
||||||
|
Castopod
|
||||||
|
</a>
|
||||||
|
<a href="<?= route_to(
|
||||||
|
'home'
|
||||||
|
) ?>" class="inline-flex items-center px-6 py-2 mb-2 text-sm underline outline-none hover:no-underline focus:shadow-outline">
|
||||||
|
<?= lang('AdminNavigation.go_to_website') ?>
|
||||||
|
<?= icon('external-link', 'ml-2 text-gray-500') ?>
|
||||||
|
</a>
|
||||||
|
<nav class="flex flex-col flex-1 overflow-y-auto">
|
||||||
<?php foreach ($navigation as $section => $data): ?>
|
<?php foreach ($navigation as $section => $data): ?>
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<button class="inline-flex items-center w-full px-6 py-1 outline-none focus:shadow-outline" type="button">
|
<button class="inline-flex items-center w-full px-6 py-1 outline-none focus:shadow-outline" type="button">
|
||||||
|
|
@ -30,11 +42,23 @@ $navigation = [
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
|
||||||
<a href="<?= route_to(
|
|
||||||
'home'
|
|
||||||
) ?>" class="inline-flex items-center px-4 py-1 mt-auto text-sm underline outline-none hover:no-underline focus:shadow-outline">
|
|
||||||
<?= lang('AdminNavigation.go_to_website') ?>
|
|
||||||
<?= icon('external-link', 'ml-2 text-gray-500') ?>
|
|
||||||
</a>
|
|
||||||
</nav>
|
</nav>
|
||||||
|
<div class="w-full mt-auto border-t" data-toggle="dropdown">
|
||||||
|
<button type="button" class="inline-flex items-center w-full px-6 py-2 outline-none focus:shadow-outline" id="my-accountDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<?= icon('user', 'text-gray-500 mr-2') ?>
|
||||||
|
<?= user()->username ?>
|
||||||
|
<?= icon('caret-right', 'ml-auto') ?>
|
||||||
|
</button>
|
||||||
|
<nav class="absolute z-50 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="my-accountDropdown" data-popper="menu" data-popper-placement="right-end">
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'my-account'
|
||||||
|
) ?>">My Account</a>
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'change-password'
|
||||||
|
) ?>">Change password</a>
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'logout'
|
||||||
|
) ?>">Logout</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
@ -4,6 +4,10 @@
|
||||||
<?= lang('Contributor.add_contributor', [$podcast->title]) ?>
|
<?= lang('Contributor.add_contributor', [$podcast->title]) ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Contributor.add_contributor', [$podcast->title]) ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
|
|
@ -26,11 +30,12 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('Contributor.form.submit_add'),
|
lang('Contributor.form.submit_add'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,10 @@
|
||||||
<?= lang('Contributor.edit_role', [$user->username]) ?>
|
<?= lang('Contributor.edit_role', [$user->username]) ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Contributor.edit_role', [$user->username]) ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
|
|
@ -19,11 +23,12 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('Contributor.form.submit_edit'),
|
lang('Contributor.form.submit_edit'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,47 +2,67 @@
|
||||||
|
|
||||||
<?= $this->section('title') ?>
|
<?= $this->section('title') ?>
|
||||||
<?= lang('Contributor.podcast_contributors') ?>
|
<?= lang('Contributor.podcast_contributors') ?>
|
||||||
<a class="inline-flex items-center px-2 py-1 mb-2 ml-2 text-sm text-white bg-green-500 rounded shadow-xs outline-none hover:bg-green-600 focus:shadow-outline" href="<?= route_to(
|
<?= $this->endSection() ?>
|
||||||
'contributor-add',
|
|
||||||
$podcast->id
|
<?= $this->section('pageTitle') ?>
|
||||||
) ?>">
|
<?= lang('Contributor.podcast_contributors') ?>
|
||||||
<?= icon('add', 'mr-2') ?>
|
<?= $this->endSection() ?>
|
||||||
<?= lang('Contributor.add') ?></a>
|
|
||||||
|
<?= $this->section('headerRight') ?>
|
||||||
|
<?= button(lang('Contributor.add'), route_to('contributor-add', $podcast->id), [
|
||||||
|
'variant' => 'primary',
|
||||||
|
'iconLeft' => 'add',
|
||||||
|
]) ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<table class="table-auto">
|
<?= data_table(
|
||||||
<thead>
|
[
|
||||||
<tr>
|
[
|
||||||
<th class="px-4 py-2">Username</th>
|
'header' => lang('Contributor.list.username'),
|
||||||
<th class="px-4 py-2">Role</th>
|
'cell' => function ($contributor) {
|
||||||
<th class="px-4 py-2">Actions</th>
|
return $contributor->username;
|
||||||
</tr>
|
},
|
||||||
</thead>
|
],
|
||||||
<tbody>
|
[
|
||||||
<?php foreach ($podcast->contributors as $contributor): ?>
|
'header' => lang('Contributor.list.role'),
|
||||||
<tr>
|
'cell' => function ($contributor) {
|
||||||
<td class="px-4 py-2 border"><?= $contributor->username ?></td>
|
return lang('Contributor.roles.' . $contributor->podcast_role);
|
||||||
<td class="px-4 py-2 border"><?= lang(
|
},
|
||||||
'Contributor.roles.' . $contributor->podcast_role
|
],
|
||||||
) ?></td>
|
[
|
||||||
<td class="px-4 py-2 border">
|
'header' => lang('Common.actions'),
|
||||||
<a class="inline-flex px-2 py-1 mb-2 text-sm text-white bg-teal-700 hover:bg-teal-800" href="<?= route_to(
|
'cell' => function ($contributor, $podcast) {
|
||||||
'contributor-edit',
|
return button(
|
||||||
$podcast->id,
|
lang('Contributor.edit'),
|
||||||
$contributor->id
|
route_to(
|
||||||
) ?>"><?= lang('Contributor.edit') ?></a>
|
'contributor-edit',
|
||||||
<a class="inline-flex px-2 py-1 text-sm text-white bg-red-700 hover:bg-red-800" href="<?= route_to(
|
$podcast->id,
|
||||||
'contributor-remove',
|
$contributor->id
|
||||||
$podcast->id,
|
),
|
||||||
$contributor->id
|
[
|
||||||
) ?>"><?= lang('Contributor.remove') ?></a>
|
'variant' => 'info',
|
||||||
</td>
|
'size' => 'small',
|
||||||
</tr>
|
],
|
||||||
<?php endforeach; ?>
|
['class' => 'mr-2']
|
||||||
</tbody>
|
) .
|
||||||
</table>
|
button(
|
||||||
|
lang('Contributor.remove'),
|
||||||
|
route_to(
|
||||||
|
'contributor-remove',
|
||||||
|
$podcast->id,
|
||||||
|
$contributor->id
|
||||||
|
),
|
||||||
|
['variant' => 'danger', 'size' => 'small'],
|
||||||
|
['class' => 'mr-2']
|
||||||
|
);
|
||||||
|
},
|
||||||
|
],
|
||||||
|
],
|
||||||
|
$podcast->contributors,
|
||||||
|
$podcast
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,14 @@
|
||||||
|
<?= helper('components') ?>
|
||||||
<?= $this->extend('admin/_layout') ?>
|
<?= $this->extend('admin/_layout') ?>
|
||||||
|
|
||||||
<?= $this->section('title') ?>
|
<?= $this->section('title') ?>
|
||||||
Welcome to the admin dashboard!
|
Dashboard
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
Admin dashboard
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('content') ?>
|
||||||
|
Welcome to the admin area!
|
||||||
|
<?= $this->endsection() ?>
|
||||||
|
|
|
||||||
|
|
@ -4,26 +4,44 @@
|
||||||
<?= lang('Episode.create') ?>
|
<?= lang('Episode.create') ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Episode.create') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<?= form_open_multipart(route_to('episode-create', $podcast->id), [
|
<?= form_open_multipart(route_to('episode-create', $podcast->id), [
|
||||||
'method' => 'post',
|
'method' => 'post',
|
||||||
'class' => 'flex flex-col max-w-md',
|
'class' => 'flex flex-col',
|
||||||
]) ?>
|
]) ?>
|
||||||
<?= csrf_field() ?>
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.enclosure'), 'enclosure') ?>
|
<div class="flex w-full mb-6">
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'enclosure',
|
'id' => 'enclosure',
|
||||||
'name' => 'enclosure',
|
'name' => 'enclosure',
|
||||||
'class' => 'form-input mb-4',
|
'class' => 'form-enclosure-input',
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
'type' => 'file',
|
'type' => 'file',
|
||||||
'accept' => '.mp3,.m4a',
|
'accept' => '.mp3,.m4a',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
<label for="enclosure"><?= icon('upload', 'mr-2 text-') ?>
|
||||||
|
<span><?= lang('Episode.form.enclosure') ?></span></label>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.image'), 'image') ?>
|
<?= form_section(
|
||||||
|
lang('Episode.form.info_section_title'),
|
||||||
|
lang('Episode.form.info_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?= form_label(
|
||||||
|
lang('Episode.form.image'),
|
||||||
|
'image',
|
||||||
|
[],
|
||||||
|
lang('Episode.form.image_hint'),
|
||||||
|
true
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'image',
|
'id' => 'image',
|
||||||
'name' => 'image',
|
'name' => 'image',
|
||||||
|
|
@ -35,7 +53,12 @@
|
||||||
'Common.forms.image_size_hint'
|
'Common.forms.image_size_hint'
|
||||||
) ?></small>
|
) ?></small>
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.title'), 'title') ?>
|
<?= form_label(
|
||||||
|
lang('Episode.form.title'),
|
||||||
|
'title',
|
||||||
|
[],
|
||||||
|
lang('Episode.form.title_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'title',
|
'id' => 'title',
|
||||||
'name' => 'title',
|
'name' => 'title',
|
||||||
|
|
@ -45,7 +68,12 @@
|
||||||
'data-slugify' => 'title',
|
'data-slugify' => 'title',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.slug'), 'slug') ?>
|
<?= form_label(
|
||||||
|
lang('Episode.form.slug'),
|
||||||
|
'slug',
|
||||||
|
[],
|
||||||
|
lang('Episode.form.slug_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'slug',
|
'id' => 'slug',
|
||||||
'name' => 'slug',
|
'name' => 'slug',
|
||||||
|
|
@ -55,6 +83,74 @@
|
||||||
'data-slugify' => 'slug',
|
'data-slugify' => 'slug',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
|
<div class="flex flex-col mb-4 gap-x-2 gap-y-4 md:flex-row">
|
||||||
|
<div class="flex flex-col flex-1">
|
||||||
|
<?= form_label(lang('Episode.form.season_number'), 'season_number') ?>
|
||||||
|
<?= form_input([
|
||||||
|
'id' => 'season_number',
|
||||||
|
'name' => 'season_number',
|
||||||
|
'class' => 'form-input w-full',
|
||||||
|
'value' => old('season_number'),
|
||||||
|
'type' => 'number',
|
||||||
|
]) ?>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col flex-1">
|
||||||
|
<?= form_label(lang('Episode.form.episode_number'), 'episode_number') ?>
|
||||||
|
<?= form_input([
|
||||||
|
'id' => 'episode_number',
|
||||||
|
'name' => 'episode_number',
|
||||||
|
'class' => 'form-input w-full',
|
||||||
|
'value' => old('episode_number'),
|
||||||
|
'required' => 'required',
|
||||||
|
'type' => 'number',
|
||||||
|
]) ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<?= form_fieldset('', ['class' => 'flex mb-4 gap-1']) ?>
|
||||||
|
<legend>
|
||||||
|
<?= lang('Episode.form.type.label') .
|
||||||
|
hint_tooltip(lang('Episode.form.type.hint'), 'ml-1') ?>
|
||||||
|
</legend>
|
||||||
|
<?= form_radio(
|
||||||
|
['id' => 'full', 'name' => 'type', 'class' => 'form-radio-btn'],
|
||||||
|
'full',
|
||||||
|
old('type') ? old('type') == 'full' : true
|
||||||
|
) ?>
|
||||||
|
<label for="full" class="inline-flex items-center">
|
||||||
|
<?= lang('Episode.form.type.full') ?>
|
||||||
|
</label>
|
||||||
|
<?= form_radio(
|
||||||
|
['id' => 'trailer', 'name' => 'type', 'class' => 'form-radio-btn'],
|
||||||
|
'trailer',
|
||||||
|
old('type') ? old('type') == 'trailer' : false
|
||||||
|
) ?>
|
||||||
|
<label for="trailer" class="inline-flex items-center">
|
||||||
|
<?= lang('Episode.form.type.trailer') ?>
|
||||||
|
</label>
|
||||||
|
<?= form_radio(
|
||||||
|
[
|
||||||
|
'id' => 'bonus',
|
||||||
|
'name' => 'type',
|
||||||
|
'class' => 'form-radio-btn',
|
||||||
|
],
|
||||||
|
'bonus',
|
||||||
|
old('type') ? old('type') == 'bonus' : false
|
||||||
|
) ?>
|
||||||
|
<label for="bonus" class="inline-flex items-center">
|
||||||
|
<?= lang('Episode.form.type.bonus') ?>
|
||||||
|
</label>
|
||||||
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
|
||||||
|
<?= form_section(
|
||||||
|
lang('Episode.form.show_notes_section_title'),
|
||||||
|
lang('Episode.form.show_notes_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<?= form_label(lang('Episode.form.description'), 'description') ?>
|
<?= form_label(lang('Episode.form.description'), 'description') ?>
|
||||||
<?= form_textarea(
|
<?= form_textarea(
|
||||||
|
|
@ -69,6 +165,36 @@
|
||||||
) ?>
|
) ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
<?= form_label(
|
||||||
|
lang('Episode.form.description_footer'),
|
||||||
|
'description_footer',
|
||||||
|
[],
|
||||||
|
lang('Episode.form.description_footer_hint')
|
||||||
|
) ?>
|
||||||
|
<?= form_textarea(
|
||||||
|
[
|
||||||
|
'id' => 'description_footer',
|
||||||
|
'name' => 'description_footer',
|
||||||
|
'class' => 'form-textarea',
|
||||||
|
],
|
||||||
|
old(
|
||||||
|
'description_footer',
|
||||||
|
$podcast->episode_description_footer ?? '',
|
||||||
|
false
|
||||||
|
),
|
||||||
|
'data-editor="markdown"'
|
||||||
|
) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
|
||||||
|
<?= form_section(
|
||||||
|
lang('Episode.form.publication_section_title'),
|
||||||
|
lang('Episode.form.publication_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_fieldset('', ['class' => 'flex mb-4']) ?>
|
<?= form_fieldset('', ['class' => 'flex mb-4']) ?>
|
||||||
<legend><?= lang('Episode.form.published_at.label') ?></legend>
|
<legend><?= lang('Episode.form.published_at.label') ?></legend>
|
||||||
<div class="flex flex-col flex-1">
|
<div class="flex flex-col flex-1">
|
||||||
|
|
@ -99,76 +225,69 @@
|
||||||
</div>
|
</div>
|
||||||
<?= form_fieldset_close() ?>
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.season_number'), 'season_number') ?>
|
<?= form_fieldset('', ['class' => 'flex mb-6 gap-1']) ?>
|
||||||
<?= form_input([
|
<legend>
|
||||||
'id' => 'season_number',
|
<?= lang('Episode.form.parental_advisory.label') .
|
||||||
'name' => 'season_number',
|
hint_tooltip(lang('Episode.form.type.hint'), 'ml-1') ?>
|
||||||
'class' => 'form-input mb-4',
|
</legend>
|
||||||
'value' => old('season_number'),
|
<?= form_radio(
|
||||||
'type' => 'number',
|
[
|
||||||
]) ?>
|
'id' => 'undefined',
|
||||||
|
'name' => 'parental_advisory',
|
||||||
<?= form_label(lang('Episode.form.episode_number'), 'episode_number') ?>
|
'class' => 'form-radio-btn',
|
||||||
<?= form_input([
|
],
|
||||||
'id' => 'episode_number',
|
'undefined',
|
||||||
'name' => 'episode_number',
|
old('parental_advisory')
|
||||||
'class' => 'form-input mb-4',
|
? old('parental_advisory') === 'undefined'
|
||||||
'value' => old('episode_number'),
|
: true
|
||||||
'required' => 'required',
|
|
||||||
'type' => 'number',
|
|
||||||
]) ?>
|
|
||||||
|
|
||||||
<label class="inline-flex items-center mb-4">
|
|
||||||
<?= form_checkbox(
|
|
||||||
['id' => 'explicit', 'name' => 'explicit', 'class' => 'form-checkbox'],
|
|
||||||
'yes',
|
|
||||||
old('explicit', false)
|
|
||||||
) ?>
|
) ?>
|
||||||
<span class="ml-2"><?= lang('Episode.form.explicit') ?></span>
|
<label for="undefined"><?= lang(
|
||||||
</label>
|
'Episode.form.parental_advisory.undefined'
|
||||||
|
) ?></label>
|
||||||
<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?>
|
<?= form_radio(
|
||||||
<legend><?= lang('Episode.form.type.label') ?></legend>
|
[
|
||||||
<label for="full" class="inline-flex items-center">
|
'id' => 'clean',
|
||||||
<?= form_radio(
|
'name' => 'parental_advisory',
|
||||||
['id' => 'full', 'name' => 'type', 'class' => 'form-radio'],
|
'class' => 'form-radio-btn',
|
||||||
'full',
|
],
|
||||||
old('type') ? old('type') == 'full' : true
|
'clean',
|
||||||
) ?>
|
old('parental_advisory') ? old('parental_advisory') === 'clean' : false
|
||||||
<span class="ml-2"><?= lang('Episode.form.type.full') ?></span>
|
) ?>
|
||||||
</label>
|
<label for="clean"><?= lang(
|
||||||
<label for="trailer" class="inline-flex items-center">
|
'Episode.form.parental_advisory.clean'
|
||||||
<?= form_radio(
|
) ?></label>
|
||||||
['id' => 'trailer', 'name' => 'type', 'class' => 'form-radio'],
|
<?= form_radio(
|
||||||
'trailer',
|
[
|
||||||
old('type') ? old('type') == 'trailer' : false
|
'id' => 'explicit',
|
||||||
) ?>
|
'name' => 'parental_advisory',
|
||||||
<span class="ml-2"><?= lang('Episode.form.type.trailer') ?></span>
|
'class' => 'form-radio-btn',
|
||||||
</label>
|
],
|
||||||
<label for="bonus" class="inline-flex items-center">
|
'explicit',
|
||||||
<?= form_radio(
|
old('parental_advisory')
|
||||||
['id' => 'bonus', 'name' => 'type', 'class' => 'form-radio'],
|
? old('parental_advisory') === 'explicit'
|
||||||
'bonus',
|
: false
|
||||||
old('type') ? old('type') == 'bonus' : false
|
) ?>
|
||||||
) ?>
|
<label for="explicit"><?= lang(
|
||||||
<span class="ml-2"><?= lang('Episode.form.type.bonus') ?></span>
|
'Episode.form.parental_advisory.explicit'
|
||||||
</label>
|
) ?></label>
|
||||||
<?= form_fieldset_close() ?>
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
<label class="inline-flex items-center mb-4">
|
<?= form_switch(
|
||||||
<?= form_checkbox(
|
lang('Episode.form.block') .
|
||||||
['id' => 'block', 'name' => 'block', 'class' => 'form-checkbox'],
|
hint_tooltip(lang('Episode.form.block_hint'), 'ml-1'),
|
||||||
'yes',
|
['id' => 'block', 'name' => 'block'],
|
||||||
old('block', false)
|
'yes',
|
||||||
) ?>
|
old('block', false)
|
||||||
<span class="ml-2"><?= lang('Episode.form.block') ?></span>
|
) ?>
|
||||||
</label>
|
|
||||||
|
|
||||||
<?= form_button([
|
<?= form_section_close() ?>
|
||||||
'content' => lang('Episode.form.submit_create'),
|
|
||||||
'type' => 'submit',
|
<?= button(
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
lang('Episode.form.submit_create'),
|
||||||
]) ?>
|
null,
|
||||||
|
['variant' => 'primary'],
|
||||||
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,25 +4,43 @@
|
||||||
<?= lang('Episode.edit') ?>
|
<?= lang('Episode.edit') ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Episode.edit') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<?= form_open_multipart(
|
<?= form_open_multipart(route_to('episode-edit', $podcast->id, $episode->id), [
|
||||||
route_to('episode-edit', $episode->podcast->id, $episode->id),
|
'method' => 'post',
|
||||||
['method' => 'post', 'class' => 'flex flex-col max-w-md']
|
'class' => 'flex flex-col',
|
||||||
) ?>
|
]) ?>
|
||||||
<?= csrf_field() ?>
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.enclosure'), 'enclosure') ?>
|
<div class="flex w-full mb-6">
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'enclosure',
|
'id' => 'enclosure',
|
||||||
'name' => 'enclosure',
|
'name' => 'enclosure',
|
||||||
'class' => 'form-input mb-4',
|
'class' => 'form-enclosure-input',
|
||||||
'type' => 'file',
|
'type' => 'file',
|
||||||
'accept' => '.mp3,.m4a',
|
'accept' => '.mp3,.m4a',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
<label for="enclosure"><?= icon('upload', 'mr-2 text-') ?>
|
||||||
|
<span><?= lang('Episode.form.enclosure') ?></span></label>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.image'), 'image') ?>
|
<?= form_section(
|
||||||
|
lang('Episode.form.info_section_title'),
|
||||||
|
lang('Episode.form.info_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?= form_label(
|
||||||
|
lang('Episode.form.image'),
|
||||||
|
'image',
|
||||||
|
[],
|
||||||
|
lang('Episode.form.image_hint'),
|
||||||
|
true
|
||||||
|
) ?>
|
||||||
<img
|
<img
|
||||||
src="<?= $episode->image->thumbnail_url ?>"
|
src="<?= $episode->image->thumbnail_url ?>"
|
||||||
alt="<?= $episode->title ?>"
|
alt="<?= $episode->title ?>"
|
||||||
|
|
@ -39,7 +57,12 @@
|
||||||
'Common.forms.image_size_hint'
|
'Common.forms.image_size_hint'
|
||||||
) ?></small>
|
) ?></small>
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.title'), 'title') ?>
|
<?= form_label(
|
||||||
|
lang('Episode.form.title'),
|
||||||
|
'title',
|
||||||
|
[],
|
||||||
|
lang('Episode.form.title_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'title',
|
'id' => 'title',
|
||||||
'name' => 'title',
|
'name' => 'title',
|
||||||
|
|
@ -49,7 +72,12 @@
|
||||||
'data-slugify' => 'title',
|
'data-slugify' => 'title',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.slug'), 'slug') ?>
|
<?= form_label(
|
||||||
|
lang('Episode.form.slug'),
|
||||||
|
'slug',
|
||||||
|
[],
|
||||||
|
lang('Episode.form.slug_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'slug',
|
'id' => 'slug',
|
||||||
'name' => 'slug',
|
'name' => 'slug',
|
||||||
|
|
@ -59,6 +87,69 @@
|
||||||
'data-slugify' => 'slug',
|
'data-slugify' => 'slug',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
|
<div class="flex flex-col mb-4 gap-x-2 gap-y-4 md:flex-row">
|
||||||
|
<div class="flex flex-col flex-1">
|
||||||
|
<?= form_label(lang('Episode.form.season_number'), 'season_number') ?>
|
||||||
|
<?= form_input([
|
||||||
|
'id' => 'season_number',
|
||||||
|
'name' => 'season_number',
|
||||||
|
'class' => 'form-input w-full',
|
||||||
|
'value' => old('season_number', $episode->season_number),
|
||||||
|
'type' => 'number',
|
||||||
|
]) ?>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col flex-1">
|
||||||
|
<?= form_label(lang('Episode.form.episode_number'), 'episode_number') ?>
|
||||||
|
<?= form_input([
|
||||||
|
'id' => 'episode_number',
|
||||||
|
'name' => 'episode_number',
|
||||||
|
'class' => 'form-input w-full',
|
||||||
|
'value' => old('episode_number', $episode->number),
|
||||||
|
'required' => 'required',
|
||||||
|
'type' => 'number',
|
||||||
|
]) ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?= form_fieldset('', ['class' => 'flex mb-4 gap-1']) ?>
|
||||||
|
<legend>
|
||||||
|
<?= lang('Episode.form.type.label') .
|
||||||
|
hint_tooltip(lang('Episode.form.type.hint'), 'ml-1') ?>
|
||||||
|
</legend>
|
||||||
|
<?= form_radio(
|
||||||
|
['id' => 'full', 'name' => 'type', 'class' => 'form-radio-btn'],
|
||||||
|
'full',
|
||||||
|
old('type') ? old('type') === 'full' : $episode->type === 'full'
|
||||||
|
) ?>
|
||||||
|
<label for="full" class="inline-flex items-center">
|
||||||
|
<?= lang('Episode.form.type.full') ?>
|
||||||
|
</label>
|
||||||
|
<?= form_radio(
|
||||||
|
['id' => 'trailer', 'name' => 'type', 'class' => 'form-radio-btn'],
|
||||||
|
'trailer',
|
||||||
|
old('type') ? old('type') === 'trailer' : $episode->type === 'trailer'
|
||||||
|
) ?>
|
||||||
|
<label for="trailer" class="inline-flex items-center">
|
||||||
|
<?= lang('Episode.form.type.trailer') ?>
|
||||||
|
</label>
|
||||||
|
<?= form_radio(
|
||||||
|
['id' => 'bonus', 'name' => 'type', 'class' => 'form-radio-btn'],
|
||||||
|
'bonus',
|
||||||
|
old('type') ? old('type') === 'bonus' : $episode->type === 'bonus'
|
||||||
|
) ?>
|
||||||
|
<label for="bonus" class="inline-flex items-center">
|
||||||
|
<?= lang('Episode.form.type.bonus') ?>
|
||||||
|
</label>
|
||||||
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
|
||||||
|
<?= form_section(
|
||||||
|
lang('Episode.form.show_notes_section_title'),
|
||||||
|
lang('Episode.form.show_notes_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<?= form_label(lang('Episode.form.description'), 'description') ?>
|
<?= form_label(lang('Episode.form.description'), 'description') ?>
|
||||||
<?= form_textarea(
|
<?= form_textarea(
|
||||||
|
|
@ -73,6 +164,36 @@
|
||||||
) ?>
|
) ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
<?= form_label(
|
||||||
|
lang('Episode.form.description_footer'),
|
||||||
|
'description_footer',
|
||||||
|
[],
|
||||||
|
lang('Episode.form.description_footer_hint')
|
||||||
|
) ?>
|
||||||
|
<?= form_textarea(
|
||||||
|
[
|
||||||
|
'id' => 'description_footer',
|
||||||
|
'name' => 'description_footer',
|
||||||
|
'class' => 'form-textarea',
|
||||||
|
],
|
||||||
|
old(
|
||||||
|
'description_footer',
|
||||||
|
$podcast->episode_description_footer ?? '',
|
||||||
|
false
|
||||||
|
),
|
||||||
|
'data-editor="markdown"'
|
||||||
|
) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
|
||||||
|
<?= form_section(
|
||||||
|
lang('Episode.form.publication_section_title'),
|
||||||
|
lang('Episode.form.publication_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_fieldset('', ['class' => 'flex mb-4']) ?>
|
<?= form_fieldset('', ['class' => 'flex mb-4']) ?>
|
||||||
<legend><?= lang('Episode.form.published_at.label') ?></legend>
|
<legend><?= lang('Episode.form.published_at.label') ?></legend>
|
||||||
<div class="flex flex-col flex-1">
|
<div class="flex flex-col flex-1">
|
||||||
|
|
@ -111,76 +232,76 @@
|
||||||
</div>
|
</div>
|
||||||
<?= form_fieldset_close() ?>
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.season_number'), 'season_number') ?>
|
|
||||||
<?= form_input([
|
|
||||||
'id' => 'season_number',
|
|
||||||
'name' => 'season_number',
|
|
||||||
'class' => 'form-input mb-4',
|
|
||||||
'value' => old('season_number', $episode->season_number),
|
|
||||||
'type' => 'number',
|
|
||||||
]) ?>
|
|
||||||
|
|
||||||
<?= form_label(lang('Episode.form.episode_number'), 'episode_number') ?>
|
<?= form_fieldset('', ['class' => 'flex mb-6 gap-1']) ?>
|
||||||
<?= form_input([
|
<legend>
|
||||||
'id' => 'episode_number',
|
<?= lang('Episode.form.parental_advisory.label') .
|
||||||
'name' => 'episode_number',
|
hint_tooltip(lang('Episode.form.type.hint'), 'ml-1') ?>
|
||||||
'class' => 'form-input mb-4',
|
</legend>
|
||||||
'value' => old('episode_number', $episode->number),
|
<?= form_radio(
|
||||||
'required' => 'required',
|
[
|
||||||
'type' => 'number',
|
'id' => 'undefined',
|
||||||
]) ?>
|
'name' => 'parental_advisory',
|
||||||
|
'class' => 'form-radio-btn',
|
||||||
<label class="inline-flex items-center mb-4">
|
],
|
||||||
<?= form_checkbox(
|
'undefined',
|
||||||
['id' => 'explicit', 'name' => 'explicit', 'class' => 'form-checkbox'],
|
old('parental_advisory')
|
||||||
'yes',
|
? old('parental_advisory') === 'undefined'
|
||||||
old('explicit', $episode->explicit)
|
: $episode->parental_advisory === null
|
||||||
) ?>
|
) ?>
|
||||||
<span class="ml-2"><?= lang('Episode.form.explicit') ?></span>
|
<label for="undefined"><?= lang(
|
||||||
</label>
|
'Episode.form.parental_advisory.undefined'
|
||||||
|
) ?></label>
|
||||||
<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?>
|
<?= form_radio(
|
||||||
<legend><?= lang('Episode.form.type.label') ?></legend>
|
[
|
||||||
<label for="full" class="inline-flex items-center">
|
'id' => 'clean',
|
||||||
<?= form_radio(
|
'name' => 'parental_advisory',
|
||||||
['id' => 'full', 'name' => 'type', 'class' => 'form-radio'],
|
'class' => 'form-radio-btn',
|
||||||
'full',
|
],
|
||||||
old('type') ? old('type') == 'full' : $episode->type == 'full'
|
'clean',
|
||||||
) ?>
|
old('parental_advisory')
|
||||||
<span class="ml-2"><?= lang('Episode.form.type.full') ?></span>
|
? old('parental_advisory') === 'clean'
|
||||||
</label>
|
: $episode->parental_advisory === 'clean'
|
||||||
<label for="trailer" class="inline-flex items-center">
|
) ?>
|
||||||
<?= form_radio(
|
<label for="clean"><?= lang(
|
||||||
['id' => 'trailer', 'name' => 'type', 'class' => 'form-radio'],
|
'Episode.form.parental_advisory.clean'
|
||||||
'trailer',
|
) ?></label>
|
||||||
old('type') ? old('type') == 'trailer' : $episode->type == 'trailer'
|
<?= form_radio(
|
||||||
) ?>
|
[
|
||||||
<span class="ml-2"><?= lang('Episode.form.type.trailer') ?></span>
|
'id' => 'explicit',
|
||||||
</label>
|
'name' => 'parental_advisory',
|
||||||
<label for="bonus" class="inline-flex items-center">
|
'class' => 'form-radio-btn',
|
||||||
<?= form_radio(
|
],
|
||||||
['id' => 'bonus', 'name' => 'type', 'class' => 'form-radio'],
|
'explicit',
|
||||||
'bonus',
|
old('parental_advisory')
|
||||||
old('type') ? old('type') == 'bonus' : $episode->type == 'bonus'
|
? old('parental_advisory') === 'explicit'
|
||||||
) ?>
|
: $episode->parental_advisory === 'explicit'
|
||||||
<span class="ml-2"><?= lang('Episode.form.type.bonus') ?></span>
|
) ?>
|
||||||
</label>
|
<label for="explicit"><?= lang(
|
||||||
|
'Episode.form.parental_advisory.explicit'
|
||||||
|
) ?></label>
|
||||||
<?= form_fieldset_close() ?>
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
<label class="inline-flex items-center mb-4">
|
<?= form_switch(
|
||||||
<?= form_checkbox(
|
lang('Episode.form.block') .
|
||||||
['id' => 'block', 'name' => 'block', 'class' => 'form-checkbox'],
|
hint_tooltip(lang('Episode.form.block_hint'), 'ml-1'),
|
||||||
'yes',
|
['id' => 'block', 'name' => 'block'],
|
||||||
old('block', $episode->block)
|
'yes',
|
||||||
) ?>
|
old(
|
||||||
<span class="ml-2"><?= lang('Episode.form.block') ?></span>
|
'block',
|
||||||
</label>
|
|
||||||
|
|
||||||
<?= form_button([
|
$episode->block
|
||||||
'content' => lang('Episode.form.submit_edit'),
|
)
|
||||||
'type' => 'submit',
|
) ?>
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
|
||||||
]) ?>
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
<?= button(
|
||||||
|
lang('Episode.form.submit_edit'),
|
||||||
|
null,
|
||||||
|
['variant' => 'primary'],
|
||||||
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,130 @@
|
||||||
<?= $this->extend('admin/_layout') ?>
|
<?= $this->extend('admin/_layout') ?>
|
||||||
|
|
||||||
<?= $this->section('title') ?>
|
<?= $this->section('title') ?>
|
||||||
|
<?= lang('Episode.all_podcast_episodes') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
<?= lang('Episode.all_podcast_episodes') ?> (<?= count($podcast->episodes) ?>)
|
<?= $this->section('pageTitle') ?>
|
||||||
<a class="inline-flex items-center px-2 py-1 mb-2 ml-2 text-sm text-white bg-green-500 rounded shadow-xs outline-none hover:bg-green-600 focus:shadow-outline" href="<?= route_to(
|
<?= lang('Episode.all_podcast_episodes') ?> (<?= $pager->getDetails()[
|
||||||
'episode-create',
|
'total'
|
||||||
$podcast->id
|
] ?>)
|
||||||
) ?>">
|
<?= $this->endSection() ?>
|
||||||
<?= icon('add', 'mr-2') ?>
|
|
||||||
<?= lang('Episode.create') ?></a>
|
|
||||||
|
|
||||||
|
<?= $this->section('headerRight') ?>
|
||||||
|
<?= button(
|
||||||
|
lang('Episode.create'),
|
||||||
|
route_to('episode-create', $podcast->id),
|
||||||
|
|
||||||
|
['variant' => 'primary', 'iconLeft' => 'add']
|
||||||
|
) ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<?= view('admin/_partials/_episode-list.php', [
|
<p class="mb-4 text-sm italic text-gray-700"><?= lang('Common.pageInfo', [
|
||||||
'episodes' => $podcast->episodes,
|
'currentPage' => $pager->getDetails()['currentPage'],
|
||||||
]) ?>
|
'pageCount' => $pager->getDetails()['pageCount'],
|
||||||
|
]) ?></p>
|
||||||
|
<div class="flex flex-wrap mb-6">
|
||||||
|
<?php if ($episodes): ?>
|
||||||
|
<?php foreach ($episodes as $episode): ?>
|
||||||
|
<article class="flex w-full max-w-lg p-4 mx-auto">
|
||||||
|
<img
|
||||||
|
loading="lazy"
|
||||||
|
src="<?= $episode->image->thumbnail_url ?>"
|
||||||
|
alt="<?= $episode->title ?>" class="object-cover w-20 h-20 mr-2 rounded-lg" />
|
||||||
|
<div class="flex flex-col flex-1">
|
||||||
|
<div class="flex">
|
||||||
|
<a class="flex-1 text-sm hover:underline" href="<?= route_to(
|
||||||
|
'episode-view',
|
||||||
|
$podcast->id,
|
||||||
|
$episode->id
|
||||||
|
) ?>">
|
||||||
|
<h2 class="inline-flex justify-between w-full font-bold leading-none group">
|
||||||
|
<span class="mr-1 group-hover:underline"><?= $episode->title ?></span>
|
||||||
|
<?php if (
|
||||||
|
$episode->season_number &&
|
||||||
|
$episode->number
|
||||||
|
): ?>
|
||||||
|
<abbr class="text-xs font-bold text-gray-600" title="<?= lang(
|
||||||
|
'Episode.season_episode',
|
||||||
|
[
|
||||||
|
'seasonNumber' =>
|
||||||
|
$episode->season_number,
|
||||||
|
'episodeNumber' => $episode->number,
|
||||||
|
]
|
||||||
|
) ?>"><?= lang('Episode.season_episode_abbr', [
|
||||||
|
'seasonNumber' => $episode->season_number,
|
||||||
|
'episodeNumber' => $episode->number,
|
||||||
|
]) ?></abbr>
|
||||||
|
<?php elseif (
|
||||||
|
!$episode->season_number &&
|
||||||
|
$episode->number
|
||||||
|
): ?>
|
||||||
|
<abbr class="text-xs font-bold text-gray-600" title="<?= lang(
|
||||||
|
'Episode.number',
|
||||||
|
[
|
||||||
|
'episodeNumber' => $episode->number,
|
||||||
|
]
|
||||||
|
) ?>"><?= lang('Episode.number_abbr', [
|
||||||
|
'episodeNumber' => $episode->number,
|
||||||
|
]) ?></abbr>
|
||||||
|
<?php endif; ?>
|
||||||
|
</h2>
|
||||||
|
</a>
|
||||||
|
<div class="relative" data-toggle="dropdown">
|
||||||
|
<button type="button" class="inline-flex items-center p-1 outline-none focus:shadow-outline" id="moreDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<?= icon('more') ?>
|
||||||
|
</button>
|
||||||
|
<nav class="absolute z-10 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="moreDropdown" data-popper="menu" data-popper-placement="bottom-end" data-popper-offset-x="0" data-popper-offset-y="-24" >
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'episode-edit',
|
||||||
|
$podcast->id,
|
||||||
|
$episode->id
|
||||||
|
) ?>"><?= lang('Episode.edit') ?></a>
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'episode',
|
||||||
|
$podcast->name,
|
||||||
|
$episode->slug
|
||||||
|
) ?>"><?= lang('Episode.go_to_page') ?></a>
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'episode-delete',
|
||||||
|
$podcast->id,
|
||||||
|
$episode->id
|
||||||
|
) ?>"><?= lang('Episode.delete') ?></a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-2 text-xs">
|
||||||
|
<time
|
||||||
|
pubdate
|
||||||
|
datetime="<?= $episode->published_at->toDateTimeString() ?>"
|
||||||
|
title="<?= $episode->published_at ?>">
|
||||||
|
<?= lang('Common.mediumDate', [
|
||||||
|
$episode->published_at,
|
||||||
|
]) ?>
|
||||||
|
</time>
|
||||||
|
<span class="mx-1">•</span>
|
||||||
|
<time datetime="PT<?= $episode->enclosure_duration ?>S">
|
||||||
|
<?= lang('Common.duration', [
|
||||||
|
$episode->enclosure_duration,
|
||||||
|
]) ?>
|
||||||
|
</time>
|
||||||
|
</div>
|
||||||
|
<audio controls preload="none" class="w-full mt-auto">
|
||||||
|
<source src="/<?= $episode->enclosure_media_path ?>" type="<?= $episode->enclosure_type ?>">
|
||||||
|
Your browser does not support the audio tag.
|
||||||
|
</audio>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
<?php else: ?>
|
||||||
|
<p class="italic"><?= lang('Podcast.no_episode') ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?= $pager->links() ?>
|
||||||
|
|
||||||
<?= $this->endSection()
|
<?= $this->endSection()
|
||||||
?>
|
?>
|
||||||
|
|
|
||||||
|
|
@ -4,40 +4,46 @@
|
||||||
<?= $episode->title ?>
|
<?= $episode->title ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= $episode->title ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<img
|
<div class="flex flex-wrap">
|
||||||
src="<?= $episode->image->medium_url ?>"
|
<div class="w-full max-w-sm mb-6 md:mr-4">
|
||||||
alt="Episode cover"
|
<img
|
||||||
class="object-cover w-40 h-40 mb-6"
|
src="<?= $episode->image->medium_url ?>"
|
||||||
/>
|
alt="Episode cover"
|
||||||
<audio controls preload="none" class="mb-12">
|
class="object-cover w-full"
|
||||||
<source src="<?= $episode->enclosure_url ?>" type="<?= $episode->enclosure_type ?>">
|
/>
|
||||||
Your browser does not support the audio tag.
|
<audio controls preload="none" class="w-full mb-6">
|
||||||
</audio>
|
<source src="/<?= $episode->enclosure_media_path ?>" type="<?= $episode->enclosure_type ?>">
|
||||||
|
Your browser does not support the audio tag.
|
||||||
|
</audio>
|
||||||
|
|
||||||
<a class="inline-flex px-4 py-2 text-white bg-teal-700 hover:bg-teal-800" href="<?= route_to(
|
<div class="flex justify-around">
|
||||||
'episode-edit',
|
<?= button(
|
||||||
$episode->podcast->id,
|
lang('Episode.edit'),
|
||||||
$episode->id
|
route_to('episode-edit', $podcast->id, $episode->id),
|
||||||
) ?>"><?= lang('Episode.edit') ?></a>
|
['variant' => 'info', 'iconLeft' => 'edit']
|
||||||
<a href="<?= route_to(
|
) ?>
|
||||||
'episode',
|
<?= button(
|
||||||
$episode->podcast->name,
|
lang('Episode.go_to_page'),
|
||||||
$episode->slug
|
route_to('episode', $podcast->name, $episode->slug),
|
||||||
) ?>" class="inline-flex px-4 py-2 text-white bg-gray-700 hover:bg-gray-800"><?= lang(
|
['variant' => 'secondary', 'iconLeft' => 'external-link']
|
||||||
'Episode.go_to_page'
|
) ?>
|
||||||
) ?></a>
|
<?= button(
|
||||||
<a href="<?= route_to(
|
lang('Episode.delete'),
|
||||||
'episode-delete',
|
route_to('episode-delete', $podcast->id, $episode->id),
|
||||||
$episode->podcast->id,
|
['variant' => 'danger', 'iconLeft' => 'delete-bin']
|
||||||
$episode->id
|
) ?>
|
||||||
) ?>" class="inline-flex px-4 py-2 text-white bg-red-700 hover:bg-red-800"><?= lang(
|
</div>
|
||||||
'Episode.delete'
|
</div>
|
||||||
) ?></a>
|
|
||||||
|
|
||||||
<section class="prose">
|
<section class="w-full max-w-sm prose">
|
||||||
<?= $episode->description_html ?>
|
<?= $episode->description_html ?>
|
||||||
</section>
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
|
||||||
|
|
@ -31,11 +31,12 @@
|
||||||
'autocomplete' => 'new-password',
|
'autocomplete' => 'new-password',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('User.form.submit_password_change'),
|
lang('User.form.submit_password_change'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,10 @@
|
||||||
<?= lang('Page.create') ?>
|
<?= lang('Page.create') ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Page.create') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
|
|
@ -46,11 +50,13 @@
|
||||||
) ?>
|
) ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?= form_button([
|
|
||||||
'content' => lang('Page.form.submit_create'),
|
<?= button(
|
||||||
'type' => 'submit',
|
lang('Page.form.submit_create'),
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
null,
|
||||||
]) ?>
|
['variant' => 'primary'],
|
||||||
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,10 @@
|
||||||
<?= lang('Page.edit') ?>
|
<?= lang('Page.edit') ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Page.edit') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
|
|
@ -46,11 +50,12 @@
|
||||||
) ?>
|
) ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('Page.form.submit_edit'),
|
lang('Page.form.submit_edit'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,47 +1,62 @@
|
||||||
<?= $this->extend('admin/_layout') ?>
|
<?= $this->extend('admin/_layout') ?>
|
||||||
|
|
||||||
<?= $this->section('title') ?>
|
<?= $this->section('title') ?>
|
||||||
|
<?= lang('Page.all_pages') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
<?= lang('Page.all_pages') ?> (<?= count($pages) ?>)
|
<?= lang('Page.all_pages') ?> (<?= count($pages) ?>)
|
||||||
<a class="inline-flex items-center px-2 py-1 mb-2 ml-4 text-sm text-white bg-green-500 rounded shadow-xs outline-none hover:bg-green-600 focus:shadow-outline" href="<?= route_to(
|
<?= $this->endSection() ?>
|
||||||
'page-create'
|
|
||||||
) ?>">
|
<?= $this->section('headerRight') ?>
|
||||||
<?= icon('add', 'mr-2') ?>
|
<?= button(lang('Page.create'), route_to('page-create'), [
|
||||||
<?= lang('Page.create') ?></a>
|
'variant' => 'primary',
|
||||||
|
'iconLeft' => 'add',
|
||||||
|
]) ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<table class="table-auto">
|
<?= data_table(
|
||||||
<thead>
|
[
|
||||||
<tr>
|
[
|
||||||
<th class="px-4 py-2">Title</th>
|
'header' => lang('Page.page'),
|
||||||
<th class="px-4 py-2">Slug</th>
|
'cell' => function ($page) {
|
||||||
<th class="px-4 py-2">Actions</th>
|
return '<div class="flex flex-col">' .
|
||||||
</tr>
|
$page->title .
|
||||||
</thead>
|
'<span class="text-sm text-gray-600">/' .
|
||||||
<tbody>
|
$page->slug .
|
||||||
<?php foreach ($pages as $page): ?>
|
'</span></div>';
|
||||||
<tr>
|
},
|
||||||
<td class="px-4 py-2 border"><?= $page->title ?></td>
|
],
|
||||||
<td class="px-4 py-2 border"><?= $page->slug ?></td>
|
[
|
||||||
<td class="px-4 py-2 border">
|
'header' => lang('Common.actions'),
|
||||||
<a class="inline-flex px-2 py-1 mb-2 text-sm text-white bg-gray-700 hover:bg-gray-800" href="<?= route_to(
|
'cell' => function ($page) {
|
||||||
'page',
|
return button(
|
||||||
$page->slug
|
lang('Page.go_to_page'),
|
||||||
) ?>"><?= lang('Page.go_to_page') ?></a>
|
route_to('page', $page->slug),
|
||||||
<a class="inline-flex px-2 py-1 mb-2 text-sm text-white bg-teal-700 hover:bg-teal-800" href="<?= route_to(
|
[
|
||||||
'page-edit',
|
'variant' => 'secondary',
|
||||||
$page->id
|
'size' => 'small',
|
||||||
) ?>"><?= lang('Page.edit') ?></a>
|
],
|
||||||
<a class="inline-flex px-2 py-1 text-sm text-white bg-red-700 hover:bg-red-800" href="<?= route_to(
|
['class' => 'mr-2']
|
||||||
'page-delete',
|
) .
|
||||||
$page->id
|
button(
|
||||||
) ?>"><?= lang('Page.delete') ?></a>
|
lang('Page.edit'),
|
||||||
</td>
|
route_to('page-edit', $page->id),
|
||||||
</tr>
|
['variant' => 'info', 'size' => 'small'],
|
||||||
<?php endforeach; ?>
|
['class' => 'mr-2']
|
||||||
</tbody>
|
) .
|
||||||
</table>
|
button(
|
||||||
|
lang('Page.delete'),
|
||||||
|
route_to('page-delete', $page->id),
|
||||||
|
['variant' => 'danger', 'size' => 'small']
|
||||||
|
);
|
||||||
|
},
|
||||||
|
],
|
||||||
|
],
|
||||||
|
$pages
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,17 @@
|
||||||
|
|
||||||
<?= $this->section('title') ?>
|
<?= $this->section('title') ?>
|
||||||
<?= $page->title ?>
|
<?= $page->title ?>
|
||||||
<a class="inline-flex items-center px-2 py-1 mb-2 ml-4 text-sm text-white bg-teal-500 rounded shadow-xs outline-none hover:bg-teal-600 focus:shadow-outline" href="<?= route_to(
|
<?= $this->endSection() ?>
|
||||||
'page-edit',
|
|
||||||
$page->id
|
<?= $this->section('pageTitle') ?>
|
||||||
) ?>">
|
<?= $page->title ?>
|
||||||
<?= icon('edit', 'mr-2') ?>
|
<?= $this->endSection() ?>
|
||||||
<?= lang('Page.edit') ?></a>
|
|
||||||
|
<?= $this->section('headerRight') ?>
|
||||||
|
<?= button(lang('Page.edit'), route_to('page-edit', $page->id), [
|
||||||
|
'variant' => 'primary',
|
||||||
|
'iconLeft' => 'add',
|
||||||
|
]) ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
|
||||||
94
app/Views/admin/podcast/_sidebar.php
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
<?php
|
||||||
|
$podcastNavigation = [
|
||||||
|
'dashboard' => [
|
||||||
|
'icon' => 'dashboard',
|
||||||
|
'items' => ['podcast-view', 'podcast-edit'],
|
||||||
|
],
|
||||||
|
'episodes' => [
|
||||||
|
'icon' => 'mic',
|
||||||
|
'items' => ['episode-list', 'episode-create'],
|
||||||
|
],
|
||||||
|
'analytics' => [
|
||||||
|
'icon' => 'line-chart',
|
||||||
|
'items' => [],
|
||||||
|
],
|
||||||
|
'contributors' => [
|
||||||
|
'icon' => 'group',
|
||||||
|
'items' => ['contributor-list', 'contributor-add'],
|
||||||
|
],
|
||||||
|
'settings' => [
|
||||||
|
'icon' => 'settings',
|
||||||
|
'items' => ['platforms'],
|
||||||
|
],
|
||||||
|
]; ?>
|
||||||
|
|
||||||
|
<a href="<?= route_to(
|
||||||
|
'admin'
|
||||||
|
) ?>" class="inline-flex items-center px-4 py-2 border-b">
|
||||||
|
<?= icon('arrow-left', 'mr-4') ?>
|
||||||
|
<?= svg('logo-castopod', 'h-8 mr-2') ?>
|
||||||
|
Castopod
|
||||||
|
</a>
|
||||||
|
<div class="flex items-center border-b">
|
||||||
|
<img
|
||||||
|
src="<?= $podcast->image->thumbnail_url ?>"
|
||||||
|
alt="<?= $podcast->title ?>"
|
||||||
|
class="object-cover w-16 h-16 mr-2"
|
||||||
|
/>
|
||||||
|
<div class="flex flex-col items-start flex-1">
|
||||||
|
<span class="font-semibold truncate"><?= $podcast->title ?></span>
|
||||||
|
<a href="<?= route_to(
|
||||||
|
'podcast',
|
||||||
|
$podcast->name
|
||||||
|
) ?>" class="inline-flex items-center text-sm underline outline-none hover:no-underline focus:shadow-outline"
|
||||||
|
data-toggle="tooltip" data-placement="bottom" title="<?= lang(
|
||||||
|
'PodcastNavigation.go_to_page'
|
||||||
|
) ?>">@<?= $podcast->name ?>
|
||||||
|
<?= icon('external-link', 'ml-1 text-gray-500') ?>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<nav class="flex flex-col flex-1 py-6 overflow-y-auto">
|
||||||
|
<?php foreach ($podcastNavigation as $section => $data): ?>
|
||||||
|
<div class="mb-4">
|
||||||
|
<button class="inline-flex items-center w-full px-6 py-1 outline-none focus:shadow-outline" type="button">
|
||||||
|
<?= icon($data['icon'], 'text-gray-500') ?>
|
||||||
|
<span class="ml-2"><?= lang(
|
||||||
|
'PodcastNavigation.' . $section
|
||||||
|
) ?></span>
|
||||||
|
</button>
|
||||||
|
<ul>
|
||||||
|
<?php foreach ($data['items'] as $item): ?>
|
||||||
|
<?php $isActive =
|
||||||
|
base_url(route_to($item, $podcast->id)) == current_url(); ?>
|
||||||
|
<li>
|
||||||
|
<a class="block py-1 pl-12 pr-2 text-sm text-gray-600 outline-none hover:text-gray-900 focus:shadow-outline <?= $isActive
|
||||||
|
? 'font-semibold text-gray-900'
|
||||||
|
: '' ?>" href="<?= route_to(
|
||||||
|
$item,
|
||||||
|
$podcast->id
|
||||||
|
) ?>"><?= lang('PodcastNavigation.' . $item) ?></a>
|
||||||
|
</li>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</nav>
|
||||||
|
<div class="w-full mt-auto border-t" data-toggle="dropdown">
|
||||||
|
<button type="button" class="inline-flex items-center w-full px-6 py-2 outline-none focus:shadow-outline" id="my-accountDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<?= icon('user', 'text-gray-500 mr-2') ?>
|
||||||
|
<?= user()->username ?>
|
||||||
|
<?= icon('caret-right', 'ml-auto') ?>
|
||||||
|
</button>
|
||||||
|
<nav class="absolute z-50 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="my-accountDropdown" data-popper="menu" data-popper-placement="right-end">
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'my-account'
|
||||||
|
) ?>">My Account</a>
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'change-password'
|
||||||
|
) ?>">Change password</a>
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'logout'
|
||||||
|
) ?>">Logout</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
@ -4,20 +4,30 @@
|
||||||
<?= lang('Podcast.create') ?>
|
<?= lang('Podcast.create') ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Podcast.create') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<?= form_open_multipart(route_to('podcast-create'), [
|
<?= form_open_multipart(route_to('podcast-create'), [
|
||||||
'method' => 'post',
|
'method' => 'post',
|
||||||
'class' => 'flex flex-col max-w-md',
|
'class' => 'flex flex-col',
|
||||||
]) ?>
|
]) ?>
|
||||||
<?= csrf_field() ?>
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
|
<?= form_section(
|
||||||
|
lang('Podcast.form.identity_section_title'),
|
||||||
|
lang('Podcast.form.identity_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.image'), 'image') ?>
|
<?= form_label(lang('Podcast.form.image'), 'image') ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'image',
|
'id' => 'image',
|
||||||
'name' => 'image',
|
'name' => 'image',
|
||||||
'class' => 'form-input',
|
'class' => 'form-input',
|
||||||
|
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
'type' => 'file',
|
'type' => 'file',
|
||||||
'accept' => '.jpg,.jpeg,.png',
|
'accept' => '.jpg,.jpeg,.png',
|
||||||
|
|
@ -35,7 +45,12 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.name'), 'name') ?>
|
<?= form_label(
|
||||||
|
lang('Podcast.form.name'),
|
||||||
|
'name',
|
||||||
|
[],
|
||||||
|
lang('Podcast.form.name_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'name',
|
'id' => 'name',
|
||||||
'name' => 'name',
|
'name' => 'name',
|
||||||
|
|
@ -44,6 +59,33 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
|
<?= form_fieldset('', ['class' => 'flex mb-4 gap-1']) ?>
|
||||||
|
<legend>
|
||||||
|
<?= lang('Podcast.form.type.label') .
|
||||||
|
hint_tooltip(lang('Podcast.form.type.hint'), 'ml-1') ?>
|
||||||
|
</legend>
|
||||||
|
<?= form_radio(
|
||||||
|
[
|
||||||
|
'id' => 'episodic',
|
||||||
|
'name' => 'type',
|
||||||
|
'class' => 'form-radio-btn',
|
||||||
|
],
|
||||||
|
'episodic',
|
||||||
|
old('type') ? old('type') == 'episodic' : true
|
||||||
|
) ?>
|
||||||
|
<label for="episodic"><?= lang('Podcast.form.type.episodic') ?></label>
|
||||||
|
<?= form_radio(
|
||||||
|
[
|
||||||
|
'id' => 'serial',
|
||||||
|
'name' => 'type',
|
||||||
|
'class' => 'form-radio-btn',
|
||||||
|
],
|
||||||
|
'serial',
|
||||||
|
old('type') ? old('type') == 'serial' : false
|
||||||
|
) ?>
|
||||||
|
<label for="serial"><?= lang('Podcast.form.type.serial') ?></label>
|
||||||
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<?= form_label(lang('Podcast.form.description'), 'description') ?>
|
<?= form_label(lang('Podcast.form.description'), 'description') ?>
|
||||||
<?= form_textarea(
|
<?= form_textarea(
|
||||||
|
|
@ -58,21 +100,13 @@
|
||||||
) ?>
|
) ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-4">
|
<?= form_section_close() ?>
|
||||||
<?= form_label(
|
|
||||||
lang('Podcast.form.episode_description_footer'),
|
|
||||||
'episode_description_footer'
|
<?= form_section(
|
||||||
) ?>
|
lang('Podcast.form.classification_section_title'),
|
||||||
<?= form_textarea(
|
lang('Podcast.form.classification_section_subtitle')
|
||||||
[
|
) ?>
|
||||||
'id' => 'episode_description_footer',
|
|
||||||
'name' => 'episode_description_footer',
|
|
||||||
'class' => 'form-textarea',
|
|
||||||
],
|
|
||||||
old('episode_description_footer', '', false),
|
|
||||||
'data-editor="markdown"'
|
|
||||||
) ?>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.language'), 'language') ?>
|
<?= form_label(lang('Podcast.form.language'), 'language') ?>
|
||||||
<?= form_dropdown('language', $languageOptions, old('language', $browserLang), [
|
<?= form_dropdown('language', $languageOptions, old('language', $browserLang), [
|
||||||
|
|
@ -88,16 +122,87 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<label class="inline-flex items-center mb-4">
|
<?= form_label(
|
||||||
<?= form_checkbox(
|
lang('Podcast.form.other_categories'),
|
||||||
['id' => 'explicit', 'name' => 'explicit', 'class' => 'form-checkbox'],
|
|
||||||
'yes',
|
|
||||||
old('explicit', false)
|
|
||||||
) ?>
|
|
||||||
<span class="ml-2"><?= lang('Podcast.form.explicit') ?></span>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.owner_name'), 'owner_name') ?>
|
'other_categories',
|
||||||
|
[],
|
||||||
|
'',
|
||||||
|
true
|
||||||
|
) ?>
|
||||||
|
<?= form_multiselect(
|
||||||
|
'other_categories[]',
|
||||||
|
$categoryOptions,
|
||||||
|
old('other_categories', []),
|
||||||
|
[
|
||||||
|
'id' => 'other_categories',
|
||||||
|
'class' => 'mb-4',
|
||||||
|
'required' => 'required',
|
||||||
|
'data-max-item-count' => '2',
|
||||||
|
]
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?= form_fieldset('', ['class' => 'flex mb-4 gap-1']) ?>
|
||||||
|
<legend>
|
||||||
|
<?= lang('Podcast.form.parental_advisory.label') .
|
||||||
|
hint_tooltip(lang('Podcast.form.parental_advisory.hint'), 'ml-1') ?>
|
||||||
|
</legend>
|
||||||
|
<?= form_radio(
|
||||||
|
[
|
||||||
|
'id' => 'undefined',
|
||||||
|
'name' => 'parental_advisory',
|
||||||
|
'class' => 'form-radio-btn',
|
||||||
|
],
|
||||||
|
'undefined',
|
||||||
|
old('parental_advisory')
|
||||||
|
? old('parental_advisory') === 'undefined'
|
||||||
|
: true
|
||||||
|
) ?>
|
||||||
|
<label for="undefined"><?= lang(
|
||||||
|
'Podcast.form.parental_advisory.undefined'
|
||||||
|
) ?></label>
|
||||||
|
<?= form_radio(
|
||||||
|
[
|
||||||
|
'id' => 'clean',
|
||||||
|
'name' => 'parental_advisory',
|
||||||
|
'class' => 'form-radio-btn',
|
||||||
|
],
|
||||||
|
'clean',
|
||||||
|
old('parental_advisory') ? old('parental_advisory') === 'clean' : false
|
||||||
|
) ?>
|
||||||
|
<label for="clean"><?= lang(
|
||||||
|
'Podcast.form.parental_advisory.clean'
|
||||||
|
) ?></label>
|
||||||
|
<?= form_radio(
|
||||||
|
[
|
||||||
|
'id' => 'explicit',
|
||||||
|
'name' => 'parental_advisory',
|
||||||
|
'class' => 'form-radio-btn',
|
||||||
|
],
|
||||||
|
'explicit',
|
||||||
|
old('parental_advisory')
|
||||||
|
? old('parental_advisory') === 'explicit'
|
||||||
|
: false
|
||||||
|
) ?>
|
||||||
|
<label for="explicit"><?= lang(
|
||||||
|
'Podcast.form.parental_advisory.explicit'
|
||||||
|
) ?></label>
|
||||||
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
|
||||||
|
<?= form_section(
|
||||||
|
lang('Podcast.form.author_section_title'),
|
||||||
|
lang('Podcast.form.author_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?= form_label(
|
||||||
|
lang('Podcast.form.owner_name'),
|
||||||
|
'owner_name',
|
||||||
|
[],
|
||||||
|
lang('Podcast.form.owner_name_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'owner_name',
|
'id' => 'owner_name',
|
||||||
'name' => 'owner_name',
|
'name' => 'owner_name',
|
||||||
|
|
@ -106,7 +211,12 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.owner_email'), 'owner_email') ?>
|
<?= form_label(
|
||||||
|
lang('Podcast.form.owner_email'),
|
||||||
|
'owner_email',
|
||||||
|
[],
|
||||||
|
lang('Podcast.form.owner_email_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'owner_email',
|
'id' => 'owner_email',
|
||||||
'name' => 'owner_email',
|
'name' => 'owner_email',
|
||||||
|
|
@ -116,37 +226,21 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.author'), 'author') ?>
|
<?= form_label(
|
||||||
|
lang('Podcast.form.publisher'),
|
||||||
|
'publisher',
|
||||||
|
[],
|
||||||
|
lang('Podcast.form.publisher_hint'),
|
||||||
|
true
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'author',
|
'id' => 'publisher',
|
||||||
'name' => 'author',
|
'name' => 'publisher',
|
||||||
'class' => 'form-input mb-4',
|
'class' => 'form-input mb-4',
|
||||||
'value' => old('author'),
|
'value' => old('publisher'),
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_fieldset('', [
|
<?= form_label(lang('Podcast.form.copyright'), 'copyright', [], '', true) ?>
|
||||||
'class' => 'flex flex-col mb-4',
|
|
||||||
]) ?>
|
|
||||||
<legend><?= lang('Podcast.form.type.label') ?></legend>
|
|
||||||
<label for="episodic" class="inline-flex items-center">
|
|
||||||
<?= form_radio(
|
|
||||||
['id' => 'episodic', 'name' => 'type', 'class' => 'form-radio'],
|
|
||||||
'episodic',
|
|
||||||
old('type') ? old('type') == 'episodic' : true
|
|
||||||
) ?>
|
|
||||||
<span class="ml-2"><?= lang('Podcast.form.type.episodic') ?></span>
|
|
||||||
</label>
|
|
||||||
<label for="serial" class="inline-flex items-center">
|
|
||||||
<?= form_radio(
|
|
||||||
['id' => 'serial', 'name' => 'type', 'class' => 'form-radio'],
|
|
||||||
'serial',
|
|
||||||
old('type') ? old('type') == 'serial' : false
|
|
||||||
) ?>
|
|
||||||
<span class="ml-2"><?= lang('Podcast.form.type.serial') ?></span>
|
|
||||||
</label>
|
|
||||||
<?= form_fieldset_close() ?>
|
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.copyright'), 'copyright') ?>
|
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'copyright',
|
'id' => 'copyright',
|
||||||
'name' => 'copyright',
|
'name' => 'copyright',
|
||||||
|
|
@ -154,42 +248,39 @@
|
||||||
'value' => old('copyright'),
|
'value' => old('copyright'),
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<label class="inline-flex items-center mb-4">
|
<?= form_section_close() ?>
|
||||||
<?= form_checkbox(
|
|
||||||
['id' => 'block', 'name' => 'block', 'class' => 'form-checkbox'],
|
|
||||||
'yes',
|
|
||||||
old('block', false)
|
|
||||||
) ?>
|
|
||||||
<span class="ml-2"><?= lang('Podcast.form.block') ?></span>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label class="inline-flex items-center mb-4">
|
|
||||||
<?= form_checkbox(
|
|
||||||
['id' => 'complete', 'name' => 'complete', 'class' => 'form-checkbox'],
|
|
||||||
'yes',
|
|
||||||
old('complete', false)
|
|
||||||
) ?>
|
|
||||||
<span class="ml-2"><?= lang('Podcast.form.complete') ?></span>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<div class="mb-4">
|
<?= form_section(
|
||||||
<?= form_label(lang('Podcast.form.custom_html_head'), 'custom_html_head') ?>
|
lang('Podcast.form.status_section_title'),
|
||||||
<?= form_textarea(
|
lang('Podcast.form.status_section_subtitle')
|
||||||
[
|
) ?>
|
||||||
'id' => 'custom_html_head',
|
|
||||||
'name' => 'custom_html_head',
|
<?= form_switch(
|
||||||
'class' => 'form-textarea',
|
lang('Podcast.form.block'),
|
||||||
],
|
['id' => 'block', 'name' => 'block'],
|
||||||
old('custom_html_head', '', false),
|
'yes',
|
||||||
'data-editor="html"'
|
old('block', false),
|
||||||
) ?>
|
'mb-2'
|
||||||
</div>
|
) ?>
|
||||||
|
|
||||||
|
<?= form_switch(
|
||||||
|
lang('Podcast.form.complete'),
|
||||||
|
['id' => 'complete', 'name' => 'complete'],
|
||||||
|
'yes',
|
||||||
|
old('complete', false)
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
|
||||||
|
<?= button(
|
||||||
|
lang('Podcast.form.submit_create'),
|
||||||
|
null,
|
||||||
|
['variant' => 'primary'],
|
||||||
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_button([
|
|
||||||
'content' => lang('Podcast.form.submit_create'),
|
|
||||||
'type' => 'submit',
|
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
|
||||||
]) ?>
|
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,23 @@
|
||||||
<?= lang('Podcast.edit') ?>
|
<?= lang('Podcast.edit') ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Podcast.edit') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<?= form_open_multipart(route_to('podcast-edit', $podcast->id), [
|
<?= form_open_multipart(route_to('podcast-edit', $podcast->id), [
|
||||||
'method' => 'post',
|
'method' => 'post',
|
||||||
'class' => 'flex flex-col max-w-md',
|
'class' => 'flex flex-col',
|
||||||
]) ?>
|
]) ?>
|
||||||
<?= csrf_field() ?>
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
|
<?= form_section(
|
||||||
|
lang('Podcast.form.identity_section_title'),
|
||||||
|
lang('Podcast.form.identity_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.image'), 'image') ?>
|
<?= form_label(lang('Podcast.form.image'), 'image') ?>
|
||||||
<img
|
<img
|
||||||
src="<?= $podcast->image->thumbnail_url ?>"
|
src="<?= $podcast->image->thumbnail_url ?>"
|
||||||
|
|
@ -39,7 +47,12 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.name'), 'name') ?>
|
<?= form_label(
|
||||||
|
lang('Podcast.form.name'),
|
||||||
|
'name',
|
||||||
|
[],
|
||||||
|
lang('Podcast.form.name_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'name',
|
'id' => 'name',
|
||||||
'name' => 'name',
|
'name' => 'name',
|
||||||
|
|
@ -48,6 +61,24 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
|
<?= form_fieldset('', ['class' => 'flex mb-4 gap-1']) ?>
|
||||||
|
<legend><?= lang('Podcast.form.type.label') .
|
||||||
|
hint_tooltip(lang('Podcast.form.type.hint'), 'ml-1') ?>
|
||||||
|
</legend>
|
||||||
|
<?= form_radio(
|
||||||
|
['id' => 'episodic', 'name' => 'type', 'class' => 'form-radio-btn'],
|
||||||
|
'episodic',
|
||||||
|
old('type') ? old('type') == 'episodic' : $podcast->type == 'episodic'
|
||||||
|
) ?>
|
||||||
|
<label for="episodic"><?= lang('Podcast.form.type.episodic') ?></label>
|
||||||
|
<?= form_radio(
|
||||||
|
['id' => 'serial', 'name' => 'type', 'class' => 'form-radio-btn'],
|
||||||
|
'serial',
|
||||||
|
old('type') ? old('type') == 'serial' : $podcast->type == 'serial'
|
||||||
|
) ?>
|
||||||
|
<label for="serial"><?= lang('Podcast.form.type.serial') ?></label>
|
||||||
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<?= form_label(lang('Podcast.form.description'), 'description') ?>
|
<?= form_label(lang('Podcast.form.description'), 'description') ?>
|
||||||
<?= form_textarea(
|
<?= form_textarea(
|
||||||
|
|
@ -62,25 +93,13 @@
|
||||||
) ?>
|
) ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-4">
|
<?= form_section_close() ?>
|
||||||
<?= form_label(
|
|
||||||
lang('Podcast.form.episode_description_footer'),
|
|
||||||
'episode_description_footer'
|
<?= form_section(
|
||||||
) ?>
|
lang('Podcast.form.classification_section_title'),
|
||||||
<?= form_textarea(
|
lang('Podcast.form.classification_section_subtitle')
|
||||||
[
|
) ?>
|
||||||
'id' => 'episode_description_footer',
|
|
||||||
'name' => 'episode_description_footer',
|
|
||||||
'class' => 'form-textarea',
|
|
||||||
],
|
|
||||||
old(
|
|
||||||
'episode_description_footer',
|
|
||||||
$podcast->episode_description_footer,
|
|
||||||
false
|
|
||||||
),
|
|
||||||
'data-editor="markdown"'
|
|
||||||
) ?>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.language'), 'language') ?>
|
<?= form_label(lang('Podcast.form.language'), 'language') ?>
|
||||||
<?= form_dropdown(
|
<?= form_dropdown(
|
||||||
|
|
@ -98,7 +117,7 @@
|
||||||
<?= form_dropdown(
|
<?= form_dropdown(
|
||||||
'category',
|
'category',
|
||||||
$categoryOptions,
|
$categoryOptions,
|
||||||
old('category', $podcast->category_id),
|
old('category', (string) $podcast->category_id),
|
||||||
[
|
[
|
||||||
'id' => 'category',
|
'id' => 'category',
|
||||||
'class' => 'form-select mb-4',
|
'class' => 'form-select mb-4',
|
||||||
|
|
@ -106,16 +125,85 @@
|
||||||
]
|
]
|
||||||
) ?>
|
) ?>
|
||||||
|
|
||||||
<label class="inline-flex items-center mb-4">
|
<?= form_label(
|
||||||
<?= form_checkbox(
|
lang('Podcast.form.other_categories'),
|
||||||
['id' => 'explicit', 'name' => 'explicit', 'class' => 'form-checkbox'],
|
'other_categories',
|
||||||
'yes',
|
[],
|
||||||
old('explicit', $podcast->explicit)
|
'',
|
||||||
) ?>
|
true
|
||||||
<span class="ml-2"><?= lang('Podcast.form.explicit') ?></span>
|
) ?>
|
||||||
</label>
|
<?= form_multiselect(
|
||||||
|
'other_categories[]',
|
||||||
|
$categoryOptions,
|
||||||
|
old('other_categories', $podcast->other_categories_ids),
|
||||||
|
[
|
||||||
|
'id' => 'other_categories',
|
||||||
|
'class' => 'mb-4',
|
||||||
|
'data-max-item-count' => '2',
|
||||||
|
]
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.owner_name'), 'owner_name') ?>
|
<?= form_fieldset('', ['class' => 'flex mb-4 gap-1']) ?>
|
||||||
|
<legend><?= lang('Podcast.form.parental_advisory.label') .
|
||||||
|
hint_tooltip(lang('Podcast.form.parental_advisory.hint'), 'ml-1') ?>
|
||||||
|
</legend>
|
||||||
|
<?= form_radio(
|
||||||
|
[
|
||||||
|
'id' => 'undefined',
|
||||||
|
'name' => 'parental_advisory',
|
||||||
|
'class' => 'form-radio-btn',
|
||||||
|
],
|
||||||
|
'undefined',
|
||||||
|
old('parental_advisory')
|
||||||
|
? old('parental_advisory') === 'undefined'
|
||||||
|
: $podcast->parental_advisory === null
|
||||||
|
) ?>
|
||||||
|
<label for="undefined"><?= lang(
|
||||||
|
'Podcast.form.parental_advisory.undefined'
|
||||||
|
) ?></label>
|
||||||
|
<?= form_radio(
|
||||||
|
[
|
||||||
|
'id' => 'clean',
|
||||||
|
'name' => 'parental_advisory',
|
||||||
|
'class' => 'form-radio-btn',
|
||||||
|
],
|
||||||
|
'clean',
|
||||||
|
old('parental_advisory')
|
||||||
|
? old('parental_advisory') === 'clean'
|
||||||
|
: $podcast->parental_advisory === 'clean'
|
||||||
|
) ?>
|
||||||
|
<label for="clean"><?= lang(
|
||||||
|
'Podcast.form.parental_advisory.clean'
|
||||||
|
) ?></label>
|
||||||
|
<?= form_radio(
|
||||||
|
[
|
||||||
|
'id' => 'explicit',
|
||||||
|
'name' => 'parental_advisory',
|
||||||
|
'class' => 'form-radio-btn',
|
||||||
|
],
|
||||||
|
'explicit',
|
||||||
|
old('parental_advisory')
|
||||||
|
? old('parental_advisory') === 'explicit'
|
||||||
|
: $podcast->parental_advisory === 'explicit'
|
||||||
|
) ?>
|
||||||
|
<label for="explicit"><?= lang(
|
||||||
|
'Podcast.form.parental_advisory.explicit'
|
||||||
|
) ?></label>
|
||||||
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
<?= form_section(
|
||||||
|
lang('Podcast.form.author_section_title'),
|
||||||
|
lang('Podcast.form.author_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?= form_label(
|
||||||
|
lang('Podcast.form.owner_name'),
|
||||||
|
'owner_name',
|
||||||
|
[],
|
||||||
|
lang('Podcast.form.owner_name_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'owner_name',
|
'id' => 'owner_name',
|
||||||
'name' => 'owner_name',
|
'name' => 'owner_name',
|
||||||
|
|
@ -124,7 +212,12 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.owner_email'), 'owner_email') ?>
|
<?= form_label(
|
||||||
|
lang('Podcast.form.owner_email'),
|
||||||
|
'owner_email',
|
||||||
|
[],
|
||||||
|
lang('Podcast.form.owner_email_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'owner_email',
|
'id' => 'owner_email',
|
||||||
'name' => 'owner_email',
|
'name' => 'owner_email',
|
||||||
|
|
@ -134,37 +227,21 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.author'), 'author') ?>
|
<?= form_label(
|
||||||
|
lang('Podcast.form.publisher'),
|
||||||
|
'publisher',
|
||||||
|
[],
|
||||||
|
lang('Podcast.form.publisher_hint'),
|
||||||
|
true
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'author',
|
'id' => 'publisher',
|
||||||
'name' => 'author',
|
'name' => 'publisher',
|
||||||
'class' => 'form-input mb-4',
|
'class' => 'form-input mb-4',
|
||||||
'value' => old('author', $podcast->author),
|
'value' => old('publisher', $podcast->publisher),
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?>
|
<?= form_label(lang('Podcast.form.copyright'), 'copyright', [], '', true) ?>
|
||||||
<legend><?= lang('Podcast.form.type.label') ?></legend>
|
|
||||||
<label for="episodic" class="inline-flex items-center">
|
|
||||||
<?= form_radio(
|
|
||||||
['id' => 'episodic', 'name' => 'type', 'class' => 'form-radio'],
|
|
||||||
'episodic',
|
|
||||||
old('type')
|
|
||||||
? old('type') == 'episodic'
|
|
||||||
: $podcast->type == 'episodic'
|
|
||||||
) ?>
|
|
||||||
<span class="ml-2"><?= lang('Podcast.form.type.episodic') ?></span>
|
|
||||||
</label>
|
|
||||||
<label for="serial" class="inline-flex items-center">
|
|
||||||
<?= form_radio(
|
|
||||||
['id' => 'serial', 'name' => 'type', 'class' => 'form-radio'],
|
|
||||||
'serial',
|
|
||||||
old('type') ? old('type') == 'serial' : $podcast->type == 'serial'
|
|
||||||
) ?>
|
|
||||||
<span class="ml-2"><?= lang('Podcast.form.type.serial') ?></span>
|
|
||||||
</label>
|
|
||||||
<?= form_fieldset_close() ?>
|
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.copyright'), 'copyright') ?>
|
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'copyright',
|
'id' => 'copyright',
|
||||||
'name' => 'copyright',
|
'name' => 'copyright',
|
||||||
|
|
@ -172,42 +249,37 @@
|
||||||
'value' => old('copyright', $podcast->copyright),
|
'value' => old('copyright', $podcast->copyright),
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<label class="inline-flex items-center mb-4">
|
<?= form_section_close() ?>
|
||||||
<?= form_checkbox(
|
|
||||||
['id' => 'block', 'name' => 'block', 'class' => 'form-checkbox'],
|
|
||||||
'yes',
|
|
||||||
old('block', $podcast->block)
|
|
||||||
) ?>
|
|
||||||
<span class="ml-2"><?= lang('Podcast.form.block') ?></span>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label class="inline-flex items-center mb-4">
|
|
||||||
<?= form_checkbox(
|
|
||||||
['id' => 'complete', 'name' => 'complete', 'class' => 'form-checkbox'],
|
|
||||||
'yes',
|
|
||||||
old('complete', $podcast->complete)
|
|
||||||
) ?>
|
|
||||||
<span class="ml-2"><?= lang('Podcast.form.complete') ?></span>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<div class="mb-4">
|
<?= form_section(
|
||||||
<?= form_label(lang('Podcast.form.custom_html_head'), 'custom_html_head') ?>
|
lang('Podcast.form.status_section_title'),
|
||||||
<?= form_textarea(
|
lang('Podcast.form.status_section_subtitle')
|
||||||
[
|
) ?>
|
||||||
'id' => 'custom_html_head',
|
|
||||||
'name' => 'custom_html_head',
|
|
||||||
'class' => 'form-textarea',
|
|
||||||
],
|
|
||||||
old('custom_html_head', $podcast->custom_html_head, false),
|
|
||||||
'data-editor="html"'
|
|
||||||
) ?>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?= form_button([
|
<?= form_switch(
|
||||||
'content' => lang('Podcast.form.submit_edit'),
|
lang('Podcast.form.block'),
|
||||||
'type' => 'submit',
|
['id' => 'block', 'name' => 'block'],
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
'yes',
|
||||||
]) ?>
|
old('block', $podcast->block),
|
||||||
|
'mb-2'
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?= form_switch(
|
||||||
|
lang('Podcast.form.complete'),
|
||||||
|
['id' => 'complete', 'name' => 'complete'],
|
||||||
|
'yes',
|
||||||
|
old('complete', $podcast->complete)
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
<?= button(
|
||||||
|
lang('Podcast.form.submit_edit'),
|
||||||
|
null,
|
||||||
|
['variant' => 'primary'],
|
||||||
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,16 +4,53 @@
|
||||||
<?= lang('Podcast.import') ?>
|
<?= lang('Podcast.import') ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Podcast.import') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<?= form_open_multipart(route_to('rzqr'), [
|
<?= form_open_multipart(route_to('podcast-import'), [
|
||||||
'method' => 'post',
|
'method' => 'post',
|
||||||
'class' => 'flex flex-col max-w-md',
|
'class' => 'flex flex-col items-start',
|
||||||
]) ?>
|
]) ?>
|
||||||
<?= csrf_field() ?>
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form_import.name'), 'name') ?>
|
<?= form_section(
|
||||||
|
lang('PodcastImport.old_podcast_section_title'),
|
||||||
|
lang('PodcastImport.old_podcast_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?= form_label(
|
||||||
|
lang('PodcastImport.imported_feed_url'),
|
||||||
|
'imported_feed_url',
|
||||||
|
[],
|
||||||
|
lang('PodcastImport.imported_feed_url_hint')
|
||||||
|
) ?>
|
||||||
|
<?= form_input([
|
||||||
|
'id' => 'imported_feed_url',
|
||||||
|
'name' => 'imported_feed_url',
|
||||||
|
'class' => 'form-input',
|
||||||
|
'value' => old('imported_feed_url'),
|
||||||
|
'placeholder' => 'https://...',
|
||||||
|
'type' => 'url',
|
||||||
|
'required' => 'required',
|
||||||
|
]) ?>
|
||||||
|
|
||||||
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
|
||||||
|
<?= form_section(
|
||||||
|
lang('PodcastImport.new_podcast_section_title'),
|
||||||
|
lang('PodcastImport.new_podcast_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
|
<?= form_label(
|
||||||
|
lang('PodcastImport.name'),
|
||||||
|
'name',
|
||||||
|
[],
|
||||||
|
lang('PodcastImport.name_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'name',
|
'id' => 'name',
|
||||||
'name' => 'name',
|
'name' => 'name',
|
||||||
|
|
@ -22,19 +59,6 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_label(
|
|
||||||
lang('Podcast.form_import.imported_feed_url'),
|
|
||||||
'imported_feed_url'
|
|
||||||
) ?>
|
|
||||||
<?= form_input([
|
|
||||||
'id' => 'imported_feed_url',
|
|
||||||
'name' => 'imported_feed_url',
|
|
||||||
'class' => 'form-input mb-4',
|
|
||||||
'value' => old('imported_feed_url'),
|
|
||||||
'type' => 'url',
|
|
||||||
'required' => 'required',
|
|
||||||
]) ?>
|
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form.language'), 'language') ?>
|
<?= form_label(lang('Podcast.form.language'), 'language') ?>
|
||||||
<?= form_dropdown('language', $languageOptions, old('language', $browserLang), [
|
<?= form_dropdown('language', $languageOptions, old('language', $browserLang), [
|
||||||
'id' => 'language',
|
'id' => 'language',
|
||||||
|
|
@ -49,38 +73,50 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
|
<?= form_section_close() ?>
|
||||||
|
|
||||||
|
|
||||||
|
<?= form_section(
|
||||||
|
lang('PodcastImport.advanced_params_section_title'),
|
||||||
|
lang('PodcastImport.advanced_params_section_subtitle')
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?>
|
<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?>
|
||||||
<legend><?= lang('Podcast.form_import.slug_field.label') ?></legend>
|
<legend><?= lang('PodcastImport.slug_field.label') ?></legend>
|
||||||
<label for="link" class="inline-flex items-center">
|
<label for="link" class="inline-flex items-center">
|
||||||
<?= form_radio(
|
<?= form_radio(
|
||||||
['id' => 'link', 'name' => 'slug_field', 'class' => 'form-radio'],
|
[
|
||||||
|
'id' => 'link',
|
||||||
|
'name' => 'slug_field',
|
||||||
|
'class' => 'form-radio text-green-500',
|
||||||
|
],
|
||||||
'link',
|
'link',
|
||||||
old('slug_field') ? old('slug_field') == 'link' : true
|
old('slug_field') ? old('slug_field') == 'link' : true
|
||||||
) ?>
|
) ?>
|
||||||
<span class="ml-2"><?= lang(
|
<span class="ml-2"><?= lang('PodcastImport.slug_field.link') ?></span>
|
||||||
'Podcast.form_import.slug_field.link'
|
|
||||||
) ?></span>
|
|
||||||
</label>
|
</label>
|
||||||
<label for="title" class="inline-flex items-center">
|
<label for="title" class="inline-flex items-center">
|
||||||
<?= form_radio(
|
<?= form_radio(
|
||||||
['id' => 'title', 'name' => 'slug_field', 'class' => 'form-radio'],
|
[
|
||||||
|
'id' => 'title',
|
||||||
|
'name' => 'slug_field',
|
||||||
|
'class' => 'form-radio text-green-500',
|
||||||
|
],
|
||||||
'title',
|
'title',
|
||||||
old('slug_field') ? old('slug_field') == 'title' : false
|
old('slug_field') ? old('slug_field') == 'title' : false
|
||||||
) ?>
|
) ?>
|
||||||
<span class="ml-2"><?= lang(
|
<span class="ml-2"><?= lang('PodcastImport.slug_field.title') ?></span>
|
||||||
'Podcast.form_import.slug_field.title'
|
|
||||||
) ?></span>
|
|
||||||
</label>
|
</label>
|
||||||
<?= form_fieldset_close() ?>
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?>
|
<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?>
|
||||||
<legend><?= lang('Podcast.form_import.description_field.label') ?></legend>
|
<legend><?= lang('PodcastImport.description_field.label') ?></legend>
|
||||||
<label for="description" class="inline-flex items-center">
|
<label for="description" class="inline-flex items-center">
|
||||||
<?= form_radio(
|
<?= form_radio(
|
||||||
[
|
[
|
||||||
'id' => 'description',
|
'id' => 'description',
|
||||||
'name' => 'description_field',
|
'name' => 'description_field',
|
||||||
'class' => 'form-radio',
|
'class' => 'form-radio text-green-500',
|
||||||
],
|
],
|
||||||
'description',
|
'description',
|
||||||
old('description_field')
|
old('description_field')
|
||||||
|
|
@ -88,7 +124,7 @@
|
||||||
: true
|
: true
|
||||||
) ?>
|
) ?>
|
||||||
<span class="ml-2"><?= lang(
|
<span class="ml-2"><?= lang(
|
||||||
'Podcast.form_import.description_field.description'
|
'PodcastImport.description_field.description'
|
||||||
) ?></span>
|
) ?></span>
|
||||||
</label>
|
</label>
|
||||||
<label for="summary" class="inline-flex items-center">
|
<label for="summary" class="inline-flex items-center">
|
||||||
|
|
@ -96,7 +132,7 @@
|
||||||
[
|
[
|
||||||
'id' => 'summary',
|
'id' => 'summary',
|
||||||
'name' => 'description_field',
|
'name' => 'description_field',
|
||||||
'class' => 'form-radio',
|
'class' => 'form-radio text-green-500',
|
||||||
],
|
],
|
||||||
'summary',
|
'summary',
|
||||||
old('description_field')
|
old('description_field')
|
||||||
|
|
@ -104,7 +140,7 @@
|
||||||
: false
|
: false
|
||||||
) ?>
|
) ?>
|
||||||
<span class="ml-2"><?= lang(
|
<span class="ml-2"><?= lang(
|
||||||
'Podcast.form_import.description_field.summary'
|
'PodcastImport.description_field.summary'
|
||||||
) ?></span>
|
) ?></span>
|
||||||
</label>
|
</label>
|
||||||
<label for="subtitle_summary" class="inline-flex items-center">
|
<label for="subtitle_summary" class="inline-flex items-center">
|
||||||
|
|
@ -112,7 +148,7 @@
|
||||||
[
|
[
|
||||||
'id' => 'subtitle_summary',
|
'id' => 'subtitle_summary',
|
||||||
'name' => 'description_field',
|
'name' => 'description_field',
|
||||||
'class' => 'form-radio',
|
'class' => 'form-radio text-green-500',
|
||||||
],
|
],
|
||||||
'subtitle_summary',
|
'subtitle_summary',
|
||||||
old('description_field')
|
old('description_field')
|
||||||
|
|
@ -120,7 +156,7 @@
|
||||||
: false
|
: false
|
||||||
) ?>
|
) ?>
|
||||||
<span class="ml-2"><?= lang(
|
<span class="ml-2"><?= lang(
|
||||||
'Podcast.form_import.description_field.subtitle_summary'
|
'PodcastImport.description_field.subtitle_summary'
|
||||||
) ?></span>
|
) ?></span>
|
||||||
</label>
|
</label>
|
||||||
<?= form_fieldset_close() ?>
|
<?= form_fieldset_close() ?>
|
||||||
|
|
@ -131,15 +167,21 @@
|
||||||
[
|
[
|
||||||
'id' => 'force_renumber',
|
'id' => 'force_renumber',
|
||||||
'name' => 'force_renumber',
|
'name' => 'force_renumber',
|
||||||
'class' => 'form-checkbox',
|
'class' => 'form-checkbox text-green-500',
|
||||||
],
|
],
|
||||||
'yes',
|
'yes',
|
||||||
old('force_renumber', false)
|
old('force_renumber', false)
|
||||||
) ?>
|
) ?>
|
||||||
<span class="ml-2"><?= lang('Podcast.form_import.force_renumber') ?></span>
|
<span class="ml-2"><?= lang('PodcastImport.force_renumber') ?></span>
|
||||||
|
<?= hint_tooltip(lang('PodcastImport.force_renumber_hint'), 'ml-1') ?>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form_import.season_number'), 'season_number') ?>
|
<?= form_label(
|
||||||
|
lang('PodcastImport.season_number'),
|
||||||
|
'season_number',
|
||||||
|
[],
|
||||||
|
lang('PodcastImport.season_number_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'season_number',
|
'id' => 'season_number',
|
||||||
'name' => 'season_number',
|
'name' => 'season_number',
|
||||||
|
|
@ -148,7 +190,12 @@
|
||||||
'type' => 'number',
|
'type' => 'number',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_label(lang('Podcast.form_import.max_episodes'), 'max_episodes') ?>
|
<?= form_label(
|
||||||
|
lang('PodcastImport.max_episodes'),
|
||||||
|
'max_episodes',
|
||||||
|
[],
|
||||||
|
lang('PodcastImport.max_episodes_hint')
|
||||||
|
) ?>
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'max_episodes',
|
'id' => 'max_episodes',
|
||||||
'name' => 'max_episodes',
|
'name' => 'max_episodes',
|
||||||
|
|
@ -157,11 +204,14 @@
|
||||||
'type' => 'number',
|
'type' => 'number',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= form_section_close() ?>
|
||||||
'content' => lang('Podcast.form_import.submit_import'),
|
|
||||||
'type' => 'submit',
|
<?= button(
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
lang('PodcastImport.submit'),
|
||||||
]) ?>
|
null,
|
||||||
|
['variant' => 'primary'],
|
||||||
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
101
app/Views/admin/podcast/latest_episodes.php
Normal file
|
|
@ -0,0 +1,101 @@
|
||||||
|
<section class="flex flex-col">
|
||||||
|
<header class="flex justify-between py-2">
|
||||||
|
<h1 class="text-xl"><?= lang('Podcast.latest_episodes') ?></h1>
|
||||||
|
<a href="<?= route_to(
|
||||||
|
'episode-list',
|
||||||
|
$podcast->id
|
||||||
|
) ?>" class="inline-flex items-center text-sm underline hover:no-underline">
|
||||||
|
<?= lang('Podcast.see_all_episodes') ?>
|
||||||
|
<?= icon('chevron-right', 'ml-2') ?>
|
||||||
|
</a>
|
||||||
|
</header>
|
||||||
|
<?php if ($episodes): ?>
|
||||||
|
<div class="flex justify-between gap-4 overflow-x-auto">
|
||||||
|
<?php foreach ($episodes as $episode): ?>
|
||||||
|
<article class="flex flex-col w-56 mb-4 bg-white border rounded shadow" style="min-width: 12rem;">
|
||||||
|
<img
|
||||||
|
src="<?= $episode->image->thumbnail_url ?>"
|
||||||
|
alt="<?= $episode->title ?>" class="object-cover" />
|
||||||
|
<div class="flex justify-between p-2">
|
||||||
|
<div class="flex flex-col">
|
||||||
|
<a href="<?= route_to(
|
||||||
|
'episode-view',
|
||||||
|
$podcast->id,
|
||||||
|
$episode->id
|
||||||
|
) ?>"
|
||||||
|
class="text-sm font-semibold hover:underline"
|
||||||
|
><?= $episode->title ?>
|
||||||
|
</a>
|
||||||
|
<div class="text-xs">
|
||||||
|
<?php if (
|
||||||
|
$episode->season_number &&
|
||||||
|
$episode->number
|
||||||
|
): ?>
|
||||||
|
<abbr class="font-bold text-gray-600" title="<?= lang(
|
||||||
|
'Episode.season_episode',
|
||||||
|
[
|
||||||
|
'seasonNumber' =>
|
||||||
|
$episode->season_number,
|
||||||
|
'episodeNumber' => $episode->number,
|
||||||
|
]
|
||||||
|
) ?>"><?= lang(
|
||||||
|
'Episode.season_episode_abbr',
|
||||||
|
[
|
||||||
|
'seasonNumber' => $episode->season_number,
|
||||||
|
'episodeNumber' => $episode->number,
|
||||||
|
]
|
||||||
|
) ?></abbr>
|
||||||
|
<?php elseif (
|
||||||
|
!$episode->season_number &&
|
||||||
|
$episode->number
|
||||||
|
): ?>
|
||||||
|
<abbr class="font-bold text-gray-600" title="<?= lang(
|
||||||
|
'Episode.number',
|
||||||
|
[
|
||||||
|
'episodeNumber' => $episode->number,
|
||||||
|
]
|
||||||
|
) ?>"><?= lang('Episode.number_abbr', [
|
||||||
|
'episodeNumber' => $episode->number,
|
||||||
|
]) ?></abbr>
|
||||||
|
<?php endif; ?>
|
||||||
|
<span class="mx-1">•</span>
|
||||||
|
<time
|
||||||
|
pubdate
|
||||||
|
datetime="<?= $episode->published_at->toDateTimeString() ?>"
|
||||||
|
title="<?= $episode->published_at ?>">
|
||||||
|
<?= lang('Common.mediumDate', [
|
||||||
|
$episode->published_at,
|
||||||
|
]) ?>
|
||||||
|
</time>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="relative" data-toggle="dropdown">
|
||||||
|
<button type="button" class="inline-flex items-center p-1 outline-none focus:shadow-outline" id="moreDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<?= icon('more') ?>
|
||||||
|
</button>
|
||||||
|
<nav class="absolute z-10 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="moreDropdown" data-popper="menu" data-popper-placement="top-end" data-popper-offset-x="0" data-popper-offset-y="-24" >
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'episode-edit',
|
||||||
|
$podcast->id,
|
||||||
|
$episode->id
|
||||||
|
) ?>"><?= lang('Episode.edit') ?></a>
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'episode',
|
||||||
|
$podcast->name,
|
||||||
|
$episode->slug
|
||||||
|
) ?>"><?= lang('Episode.go_to_page') ?></a>
|
||||||
|
<a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
|
||||||
|
'episode-delete',
|
||||||
|
$podcast->id,
|
||||||
|
$episode->id
|
||||||
|
) ?>"><?= lang('Episode.delete') ?></a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div>
|
||||||
|
<?php else: ?>
|
||||||
|
<p class="italic"><?= lang('Podcast.no_episode') ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
</section>
|
||||||
|
|
@ -1,17 +1,24 @@
|
||||||
<?= $this->extend('admin/_layout') ?>
|
<?= $this->extend('admin/_layout') ?>
|
||||||
|
|
||||||
<?= $this->section('title') ?>
|
<?= $this->section('title') ?>
|
||||||
|
<?= lang('Podcast.all_podcasts') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
<?= lang('Podcast.all_podcasts') ?> (<?= count($podcasts) ?>)
|
<?= lang('Podcast.all_podcasts') ?> (<?= count($podcasts) ?>)
|
||||||
<a class="inline-flex items-center px-2 py-1 mb-2 ml-4 text-sm text-white bg-green-500 rounded shadow-xs outline-none hover:bg-green-600 focus:shadow-outline" href="<?= route_to(
|
<?= $this->endSection() ?>
|
||||||
'podcast-create'
|
|
||||||
) ?>">
|
<?= $this->section('headerRight') ?>
|
||||||
<?= icon('add', 'mr-2') ?>
|
<?= button(
|
||||||
<?= lang('Podcast.create') ?></a>
|
lang('Podcast.create'),
|
||||||
<a class="inline-flex items-center px-2 py-1 mb-2 ml-4 text-sm text-white bg-green-500 rounded shadow-xs outline-none hover:bg-green-600 focus:shadow-outline" href="<?= route_to(
|
route_to('podcast-create'),
|
||||||
'podcast-import'
|
['variant' => 'primary', 'iconLeft' => 'add'],
|
||||||
) ?>">
|
['class' => 'mr-2']
|
||||||
<?= icon('add', 'mr-2') ?>
|
) ?>
|
||||||
<?= lang('Podcast.import') ?></a>
|
<?= button(lang('Podcast.import'), route_to('podcast-import'), [
|
||||||
|
'variant' => 'primary',
|
||||||
|
'iconLeft' => 'download',
|
||||||
|
]) ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -20,9 +27,35 @@
|
||||||
<div class="flex flex-wrap">
|
<div class="flex flex-wrap">
|
||||||
<?php if (!empty($podcasts)): ?>
|
<?php if (!empty($podcasts)): ?>
|
||||||
<?php foreach ($podcasts as $podcast): ?>
|
<?php foreach ($podcasts as $podcast): ?>
|
||||||
<?= view('admin/_partials/_podcast-card', [
|
<article class="w-48 h-full mb-4 mr-4 overflow-hidden bg-white border rounded shadow">
|
||||||
'podcast' => $podcast,
|
<img
|
||||||
]) ?>
|
alt="<?= $podcast->title ?>"
|
||||||
|
src="<?= $podcast->image
|
||||||
|
->thumbnail_url ?>" class="object-cover w-full h-40" />
|
||||||
|
<div class="p-2">
|
||||||
|
<a href="<?= route_to(
|
||||||
|
'podcast-view',
|
||||||
|
$podcast->id
|
||||||
|
) ?>" class="hover:underline">
|
||||||
|
<h2 class="font-semibold"><?= $podcast->title ?></h2>
|
||||||
|
</a>
|
||||||
|
<p class="text-gray-600">@<?= $podcast->name ?></p>
|
||||||
|
</div>
|
||||||
|
<footer class="flex items-center justify-end p-2">
|
||||||
|
<a class="inline-flex p-2 mr-2 text-teal-700 bg-teal-100 rounded-full shadow-xs hover:bg-teal-200" href="<?= route_to(
|
||||||
|
'podcast-edit',
|
||||||
|
$podcast->id
|
||||||
|
) ?>" data-toggle="tooltip" data-placement="bottom" title="<?= lang(
|
||||||
|
'Podcast.edit'
|
||||||
|
) ?>"><?= icon('edit') ?></a>
|
||||||
|
<a class="inline-flex p-2 text-gray-700 bg-gray-100 rounded-full shadow-xs hover:bg-gray-200" href="<?= route_to(
|
||||||
|
'podcast-view',
|
||||||
|
$podcast->id
|
||||||
|
) ?>" data-toggle="tooltip" data-placement="bottom" title="<?= lang(
|
||||||
|
'Podcast.view'
|
||||||
|
) ?>"><?= icon('eye') ?></a>
|
||||||
|
</footer>
|
||||||
|
</article>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<p class="italic"><?= lang('Podcast.no_podcast') ?></p>
|
<p class="italic"><?= lang('Podcast.no_podcast') ?></p>
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,10 @@
|
||||||
<?= lang('Podcast.platforms.title') ?>
|
<?= lang('Podcast.platforms.title') ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Podcast.platforms.title') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('content') ?>
|
||||||
|
Podcast settings...
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,10 @@
|
||||||
<?= lang('Platforms.title') ?>
|
<?= lang('Platforms.title') ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('Platforms.title') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<?= form_open(route_to('platforms', $podcast->id), [
|
<?= form_open(route_to('platforms', $podcast->id), [
|
||||||
|
|
@ -88,11 +92,12 @@
|
||||||
|
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('Platforms.submit'),
|
lang('Platforms.submit'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,45 +2,29 @@
|
||||||
|
|
||||||
<?= $this->section('title') ?>
|
<?= $this->section('title') ?>
|
||||||
<?= $podcast->title ?>
|
<?= $podcast->title ?>
|
||||||
<a class="inline-flex items-center px-2 py-1 mb-2 ml-4 text-sm text-white bg-teal-500 rounded shadow-xs outline-none hover:bg-teal-600 focus:shadow-outline" href="<?= route_to(
|
<?= $this->endSection() ?>
|
||||||
'podcast-edit',
|
|
||||||
$podcast->id
|
<?= $this->section('pageTitle') ?>
|
||||||
) ?>">
|
<?= $podcast->title ?>
|
||||||
<?= icon('edit', 'mr-2') ?>
|
<?= $this->endSection() ?>
|
||||||
<?= lang('Podcast.edit') ?>
|
|
||||||
</a>
|
<?= $this->section('headerRight') ?>
|
||||||
<a class="inline-flex items-center px-2 py-1 mb-2 ml-2 text-sm text-white bg-green-500 rounded shadow-xs outline-none hover:bg-green-600 focus:shadow-outline" href="<?= route_to(
|
<?= button(
|
||||||
'episode-create',
|
lang('Podcast.edit'),
|
||||||
$podcast->id
|
route_to('podcast-edit', $podcast->id),
|
||||||
) ?>">
|
['variant' => 'secondary', 'iconLeft' => 'edit'],
|
||||||
<?= icon('add', 'mr-2') ?>
|
['class' => 'mr-2']
|
||||||
<?= lang('Episode.create') ?></a>
|
) ?>
|
||||||
|
<?= button(lang('Episode.create'), route_to('episode-create', $podcast->id), [
|
||||||
|
'variant' => 'primary',
|
||||||
|
'iconLeft' => 'add',
|
||||||
|
]) ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
<img
|
|
||||||
class="w-64 mb-4"
|
|
||||||
src="<?= $podcast->image->medium_url ?>"
|
|
||||||
alt="<?= $podcast->title ?>"
|
|
||||||
/>
|
|
||||||
<a class="inline-flex px-2 py-1 mb-2 text-white bg-yellow-700 hover:bg-yellow-800" href="<?= route_to(
|
|
||||||
'contributor-list',
|
|
||||||
$podcast->id
|
|
||||||
) ?>"><?= lang('Podcast.see_contributors') ?></a>
|
|
||||||
<a class="inline-flex px-2 py-1 mb-2 text-white bg-indigo-700 hover:bg-indigo-800" href="<?= route_to(
|
|
||||||
'platforms',
|
|
||||||
$podcast->id
|
|
||||||
) ?>"><?= lang('Platforms.title') ?></a>
|
|
||||||
<a class="inline-flex px-2 py-1 text-white bg-gray-700 hover:bg-gray-800" href="<?= route_to(
|
|
||||||
'podcast',
|
|
||||||
$podcast->name
|
|
||||||
) ?>"><?= lang('Podcast.go_to_page') ?></a>
|
|
||||||
<a class="inline-flex px-2 py-1 text-white bg-red-700 hover:bg-red-800" href="<?= route_to(
|
|
||||||
'podcast-delete',
|
|
||||||
$podcast->id
|
|
||||||
) ?>"><?= lang('Podcast.delete') ?></a>
|
|
||||||
|
|
||||||
<?= view('admin/_partials/_episode-list.php', [
|
<?= view_cell('\App\Controllers\Admin\Podcast::latestEpisodes', [
|
||||||
'episodes' => $podcast->episodes,
|
'limit' => 5,
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,14 @@
|
||||||
<?= lang('User.create') ?>
|
<?= lang('User.create') ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('User.create') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<?= form_open(route_to('user-create'), [
|
<?= form_open(route_to('user-create'), ['class' => 'flex flex-col max-w-sm']) ?>
|
||||||
'class' => 'flex flex-col max-w-sm',
|
|
||||||
]) ?>
|
|
||||||
<?= csrf_field() ?>
|
<?= csrf_field() ?>
|
||||||
|
|
||||||
<?= form_label(lang('User.form.email'), 'email') ?>
|
<?= form_label(lang('User.form.email'), 'email') ?>
|
||||||
|
|
@ -33,16 +35,18 @@
|
||||||
<?= form_input([
|
<?= form_input([
|
||||||
'id' => 'password',
|
'id' => 'password',
|
||||||
'name' => 'password',
|
'name' => 'password',
|
||||||
|
|
||||||
'class' => 'form-input mb-4',
|
'class' => 'form-input mb-4',
|
||||||
'type' => 'password',
|
'type' => 'password',
|
||||||
'autocomplete' => 'new-password',
|
'autocomplete' => 'new-password',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('User.form.submit_create'),
|
lang('User.form.submit_create'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,10 @@
|
||||||
<?= lang('User.edit_roles', ['username' => $user->username]) ?>
|
<?= lang('User.edit_roles', ['username' => $user->username]) ?>
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
|
<?= lang('User.edit_roles', ['username' => $user->username]) ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
|
|
@ -15,14 +19,15 @@
|
||||||
<?= form_label(lang('User.form.roles'), 'roles') ?>
|
<?= form_label(lang('User.form.roles'), 'roles') ?>
|
||||||
<?= form_multiselect('roles[]', $roleOptions, $user->roles, [
|
<?= form_multiselect('roles[]', $roleOptions, $user->roles, [
|
||||||
'id' => 'roles',
|
'id' => 'roles',
|
||||||
'class' => 'form-multiselect mb-4',
|
'class' => 'mb-4',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('User.form.submit_edit'),
|
lang('User.form.submit_edit'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,63 +1,89 @@
|
||||||
<?= $this->extend('admin/_layout') ?>
|
<?= $this->extend('admin/_layout') ?>
|
||||||
|
|
||||||
<?= $this->section('title') ?>
|
<?= $this->section('title') ?>
|
||||||
|
<?= lang('User.all_users') ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('pageTitle') ?>
|
||||||
<?= lang('User.all_users') ?> (<?= count($users) ?>)
|
<?= lang('User.all_users') ?> (<?= count($users) ?>)
|
||||||
<?= $this->endSection() ?>
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
<?= $this->section('headerRight') ?>
|
||||||
|
<?= button(lang('User.create'), route_to('user-create'), [
|
||||||
|
'variant' => 'primary',
|
||||||
|
'iconLeft' => 'user-add',
|
||||||
|
]) ?>
|
||||||
|
<?= $this->endSection() ?>
|
||||||
|
|
||||||
|
|
||||||
<?= $this->section('content') ?>
|
<?= $this->section('content') ?>
|
||||||
|
|
||||||
<table class="table-auto">
|
<?= data_table(
|
||||||
<thead>
|
[
|
||||||
<tr>
|
[
|
||||||
<th class="px-4 py-2">Username</th>
|
'header' => lang('User.list.user'),
|
||||||
<th class="px-4 py-2">Email</th>
|
'cell' => function ($user) {
|
||||||
<th class="px-4 py-2">Roles</th>
|
return '<div class="flex flex-col">' .
|
||||||
<th class="px-4 py-2">Banned?</th>
|
$user->username .
|
||||||
<th class="px-4 py-2">Actions</th>
|
'<span class="text-sm text-gray-600">' .
|
||||||
</tr>
|
$user->email .
|
||||||
</thead>
|
'</span></div>';
|
||||||
<tbody>
|
},
|
||||||
<?php foreach ($users as $user): ?>
|
],
|
||||||
<tr>
|
[
|
||||||
<td class="px-4 py-2 border"><?= $user->username ?></td>
|
'header' => lang('User.list.roles'),
|
||||||
<td class="px-4 py-2 border"><?= $user->email ?></td>
|
'cell' => function ($user) {
|
||||||
<td class="px-4 py-2 border">
|
return implode(',', $user->roles) .
|
||||||
[<?= implode(', ', $user->roles) ?>]
|
icon_button(
|
||||||
<a class="inline-flex p-2 mr-2 text-teal-700 bg-teal-100 rounded-full shadow-xs hover:bg-teal-200" href="<?= route_to(
|
'edit',
|
||||||
'user-edit',
|
lang('User.edit_roles', [
|
||||||
$user->id
|
'username' => $user->username,
|
||||||
) ?>" data-toggle="tooltip" data-placement="bottom"
|
]),
|
||||||
title="<?= lang('User.edit_roles', [
|
route_to('user-edit', $user->id),
|
||||||
'username' => $user->username,
|
['variant' => 'info'],
|
||||||
]) ?>">
|
['class' => 'ml-2']
|
||||||
<?= icon('edit') ?>
|
);
|
||||||
</a>
|
},
|
||||||
</td>
|
],
|
||||||
<td class="px-4 py-2 border"><?= $user->isBanned()
|
[
|
||||||
? 'Yes'
|
'header' => lang('User.list.banned'),
|
||||||
: 'No' ?></td>
|
'cell' => function ($user) {
|
||||||
<td class="px-4 py-2 border">
|
return $user->isBanned()
|
||||||
<a class="inline-flex px-2 py-1 mb-2 text-sm text-white bg-gray-700 hover:bg-gray-800" href="<?= route_to(
|
? lang('Common.yes')
|
||||||
'user-force_pass_reset',
|
: lang('Common.no');
|
||||||
$user->id
|
},
|
||||||
) ?>"><?= lang('User.forcePassReset') ?></a>
|
],
|
||||||
<a class="inline-flex px-2 py-1 mb-2 text-sm text-white bg-orange-700 hover:bg-orange-800" href="<?= route_to(
|
[
|
||||||
$user->isBanned() ? 'user-unban' : 'user-ban',
|
'header' => lang('Common.actions'),
|
||||||
$user->id
|
'cell' => function ($user) {
|
||||||
) ?>">
|
return button(
|
||||||
<?= $user->isBanned()
|
lang('User.forcePassReset'),
|
||||||
? lang('User.unban')
|
route_to('user-force_pass_reset', $user->id),
|
||||||
: lang('User.ban') ?></a>
|
[
|
||||||
<a class="inline-flex px-2 py-1 text-sm text-white bg-red-700 hover:bg-red-800" href="<?= route_to(
|
'variant' => 'secondary',
|
||||||
'user-delete',
|
'size' => 'small',
|
||||||
$user->id
|
],
|
||||||
) ?>"><?= lang('User.delete') ?></a>
|
['class' => 'mr-2']
|
||||||
</td>
|
) .
|
||||||
</tr>
|
button(
|
||||||
<?php endforeach; ?>
|
lang('User.' . ($user->isBanned() ? 'unban' : 'ban')),
|
||||||
</tbody>
|
route_to(
|
||||||
</table>
|
$user->isBanned() ? 'user-unban' : 'user-ban',
|
||||||
|
$user->id
|
||||||
|
),
|
||||||
|
['variant' => 'warning', 'size' => 'small'],
|
||||||
|
['class' => 'mr-2']
|
||||||
|
) .
|
||||||
|
button(
|
||||||
|
lang('User.delete'),
|
||||||
|
route_to('user-delete', $user->id),
|
||||||
|
['variant' => 'danger', 'size' => 'small']
|
||||||
|
);
|
||||||
|
},
|
||||||
|
],
|
||||||
|
],
|
||||||
|
$users
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= $this->endSection()
|
<?= $this->endSection()
|
||||||
?>
|
?>
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,9 @@
|
||||||
</main>
|
</main>
|
||||||
<footer class="flex flex-col text-sm">
|
<footer class="flex flex-col text-sm">
|
||||||
<?= $this->renderSection('footer') ?>
|
<?= $this->renderSection('footer') ?>
|
||||||
<p class="py-4 border-t">
|
<small class="py-4 text-center border-t"><?= lang('Common.powered_by', [
|
||||||
Powered by <a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>, a <a class="underline hover:no-underline" href="https://podlibre.org/" target="_blank" rel="noreferrer noopener">Podlibre</a> initiative.
|
'castopod' =>
|
||||||
</p>
|
'<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>',
|
||||||
|
]) ?></small>
|
||||||
</footer>
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -22,11 +22,12 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('Auth.sendInstructions'),
|
lang('Auth.sendInstructions'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
'class' => 'px-4 py-2 ml-auto border',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,11 +28,13 @@
|
||||||
'required' => 'required',
|
'required' => 'required',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_button([
|
|
||||||
'content' => lang('Auth.loginAction'),
|
<?= button(
|
||||||
'class' => 'px-4 py-2 ml-auto border',
|
lang('Auth.loginAction'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
]) ?>
|
['variant' => 'primary'],
|
||||||
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,11 +44,12 @@
|
||||||
'autocomplete' => 'new-password',
|
'autocomplete' => 'new-password',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('Auth.register'),
|
lang('Auth.register'),
|
||||||
'class' => 'px-4 py-2 ml-auto border',
|
null,
|
||||||
'type' => 'submit',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,11 +42,12 @@
|
||||||
'autocomplete' => 'new-password',
|
'autocomplete' => 'new-password',
|
||||||
]) ?>
|
]) ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('Auth.resetPassword'),
|
lang('Auth.resetPassword'),
|
||||||
'class' => 'px-4 py-2 ml-auto border',
|
null,
|
||||||
'type' => 'submit',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?= helper('page') ?>
|
<?= helper('page') ?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="<?= $episode->podcast->language ?>">
|
<html lang="<?= service('request')->getLocale() ?>">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8"/>
|
<meta charset="UTF-8"/>
|
||||||
|
|
@ -16,16 +16,16 @@
|
||||||
<div class="container flex items-start px-2 py-2 mx-auto">
|
<div class="container flex items-start px-2 py-2 mx-auto">
|
||||||
<img
|
<img
|
||||||
class="w-12 h-12 mr-2 rounded cover"
|
class="w-12 h-12 mr-2 rounded cover"
|
||||||
src="<?= $episode->podcast->image->thumbnail_url ?>"
|
src="<?= $podcast->image->thumbnail_url ?>"
|
||||||
alt="<?= $episode->podcast->title ?>"
|
alt="<?= $podcast->title ?>"
|
||||||
/>
|
/>
|
||||||
<a
|
<a
|
||||||
href="<?= route_to('podcast', $episode->podcast->name) ?>"
|
href="<?= route_to('podcast', $podcast->name) ?>"
|
||||||
class="flex flex-col text-lg leading-tight text-white"
|
class="flex flex-col text-lg leading-tight text-white"
|
||||||
title="<?= lang('Episode.back_to_podcast') ?>">
|
title="<?= lang('Episode.back_to_podcast') ?>">
|
||||||
<?= $episode->podcast->title ?>
|
<?= $podcast->title ?>
|
||||||
<span class="text-sm text-gray-300">
|
<span class="text-sm text-gray-300">
|
||||||
@<?= $episode->podcast->name ?>
|
@<?= $podcast->name ?>
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -34,7 +34,7 @@
|
||||||
<nav class="flex items-center px-2 py-4">
|
<nav class="flex items-center px-2 py-4">
|
||||||
<?php if ($previousEpisode): ?>
|
<?php if ($previousEpisode): ?>
|
||||||
<a class="flex items-center text-xs leading-snug text-gray-600 hover:text-gray-900" href="<?= $previousEpisode->link ?>" title="<?= $previousEpisode->title ?>">
|
<a class="flex items-center text-xs leading-snug text-gray-600 hover:text-gray-900" href="<?= $previousEpisode->link ?>" title="<?= $previousEpisode->title ?>">
|
||||||
<?= icon('arrow-left', 'mr-2') ?>
|
<?= icon('chevron-left', 'mr-2') ?>
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<?= $previousEpisode->season_number ==
|
<?= $previousEpisode->season_number ==
|
||||||
$episode->season_number
|
$episode->season_number
|
||||||
|
|
@ -53,7 +53,7 @@
|
||||||
: lang('Episode.next_season') ?>
|
: lang('Episode.next_season') ?>
|
||||||
<span class="w-40 font-semibold truncate"><?= $nextEpisode->title ?></span>
|
<span class="w-40 font-semibold truncate"><?= $nextEpisode->title ?></span>
|
||||||
</div>
|
</div>
|
||||||
<?= icon('arrow-right', 'ml-2') ?>
|
<?= icon('chevron-right', 'ml-2') ?>
|
||||||
</a>
|
</a>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
@ -67,7 +67,7 @@
|
||||||
<?php if ($episode->season_number): ?>
|
<?php if ($episode->season_number): ?>
|
||||||
<a class="mr-1 underline hover:no-underline" href="<?= route_to(
|
<a class="mr-1 underline hover:no-underline" href="<?= route_to(
|
||||||
'podcast',
|
'podcast',
|
||||||
$episode->podcast->name
|
$podcast->name
|
||||||
) .
|
) .
|
||||||
'?season=' .
|
'?season=' .
|
||||||
$episode->season_number ?>">
|
$episode->season_number ?>">
|
||||||
|
|
@ -130,7 +130,7 @@
|
||||||
<div class="container flex flex-col items-center justify-between mx-auto text-sm md:flex-row ">
|
<div class="container flex flex-col items-center justify-between mx-auto text-sm md:flex-row ">
|
||||||
<?= render_page_links('inline-flex mb-4 md:mb-0') ?>
|
<?= render_page_links('inline-flex mb-4 md:mb-0') ?>
|
||||||
<div class="flex flex-col items-end text-xs">
|
<div class="flex flex-col items-end text-xs">
|
||||||
<p><?= $episode->podcast->copyright ?></p>
|
<p><?= $podcast->copyright ?></p>
|
||||||
<p><?= lang('Common.powered_by', [
|
<p><?= lang('Common.powered_by', [
|
||||||
'castopod' =>
|
'castopod' =>
|
||||||
'<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>',
|
'<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>',
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,9 @@
|
||||||
<?= $this->renderSection('content') ?>
|
<?= $this->renderSection('content') ?>
|
||||||
</main>
|
</main>
|
||||||
<footer class="container px-2 py-4 mx-auto text-sm text-right border-t">
|
<footer class="container px-2 py-4 mx-auto text-sm text-right border-t">
|
||||||
Powered by <a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>, a <a class="underline hover:no-underline" href="https://podlibre.org/" target="_blank" rel="noreferrer noopener">Podlibre</a> initiative.
|
<small><?= lang('Common.powered_by', [
|
||||||
|
'castopod' =>
|
||||||
|
'<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>',
|
||||||
|
]) ?></small>
|
||||||
</footer>
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -86,11 +86,12 @@
|
||||||
]) ?>
|
]) ?>
|
||||||
<?= form_fieldset_close() ?>
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('Install.form.submit_install'),
|
lang('Install.form.submit_install'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,11 +41,12 @@
|
||||||
]) ?>
|
]) ?>
|
||||||
<?= form_fieldset_close() ?>
|
<?= form_fieldset_close() ?>
|
||||||
|
|
||||||
<?= form_button([
|
<?= button(
|
||||||
'content' => lang('Install.form.submit_create_superadmin'),
|
lang('Install.form.submit_create_superadmin'),
|
||||||
'type' => 'submit',
|
null,
|
||||||
'class' => 'self-end px-4 py-2 bg-gray-200',
|
['variant' => 'primary'],
|
||||||
]) ?>
|
['type' => 'submit', 'class' => 'self-end']
|
||||||
|
) ?>
|
||||||
|
|
||||||
<?= form_close() ?>
|
<?= form_close() ?>
|
||||||
|
|
||||||
|
|
|
||||||
67
app/Views/pager/default_full.php
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @copyright 2020 Podlibre
|
||||||
|
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||||
|
* @link https://castopod.org/
|
||||||
|
*
|
||||||
|
* @var \CodeIgniter\Pager\PagerRenderer $pager
|
||||||
|
*/
|
||||||
|
|
||||||
|
$pager->setSurroundCount(2); ?>
|
||||||
|
|
||||||
|
<nav aria-label="<?= lang('Pager.pageNavigation') ?>">
|
||||||
|
<ul class="flex justify-center">
|
||||||
|
<?php if ($pager->hasPreviousPage()): ?>
|
||||||
|
<li>
|
||||||
|
<a href="<?= $pager->getFirst() ?>" aria-label="<?= lang(
|
||||||
|
'Pager.first'
|
||||||
|
) ?>" class="block px-3 py-2 text-gray-700 hover:bg-gray-200 hover:text-black">
|
||||||
|
<span aria-hidden="true"><?= lang('Pager.first') ?></span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="<?= $pager->getPreviousPage() ?>" aria-label="<?= lang(
|
||||||
|
'Pager.previous'
|
||||||
|
) ?>" class="block px-3 py-2 text-gray-700 hover:bg-gray-200 hover:text-black">
|
||||||
|
<span aria-hidden="true"><?= lang(
|
||||||
|
'Pager.previous'
|
||||||
|
) ?></span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php foreach ($pager->links() as $link): ?>
|
||||||
|
<li>
|
||||||
|
<?php if ($link['active']): ?>
|
||||||
|
<span class="block px-4 py-2 font-semibold text-white bg-green-500 rounded-full">
|
||||||
|
<?= $link['title'] ?>
|
||||||
|
</span>
|
||||||
|
<?php else: ?>
|
||||||
|
<a href="<?= $link[
|
||||||
|
'uri'
|
||||||
|
] ?>" class="block px-4 py-2 text-gray-700 rounded-full hover:bg-gray-200 hover:text-black">
|
||||||
|
<?= $link['title'] ?>
|
||||||
|
</a>
|
||||||
|
<?php endif; ?>
|
||||||
|
</li>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
|
||||||
|
<?php if ($pager->hasNextPage()): ?>
|
||||||
|
<li>
|
||||||
|
<a href="<?= $pager->getNextPage() ?>" aria-label="<?= lang(
|
||||||
|
'Pager.next'
|
||||||
|
) ?>" class="block px-3 py-2 text-gray-700 hover:bg-gray-200 hover:text-black">
|
||||||
|
<span aria-hidden="true"><?= lang('Pager.next') ?></span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="<?= $pager->getLast() ?>" aria-label="<?= lang(
|
||||||
|
'Pager.last'
|
||||||
|
) ?>" class="block px-3 py-2 text-gray-700 hover:bg-gray-200 hover:text-black">
|
||||||
|
<span aria-hidden="true"><?= lang('Pager.last') ?></span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<?php endif; ?>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<?= helper('page') ?>
|
<?= helper('page') ?>
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="<?= $podcast->language ?>">
|
<html lang="<?= service('request')->getLocale() ?>">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8"/>
|
<meta charset="UTF-8"/>
|
||||||
|
|
@ -10,7 +10,6 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
<link rel="shortcut icon" type="image/png" href="/favicon.ico" />
|
<link rel="shortcut icon" type="image/png" href="/favicon.ico" />
|
||||||
<link rel="stylesheet" href="/assets/index.css"/>
|
<link rel="stylesheet" href="/assets/index.css"/>
|
||||||
<?= $podcast->custom_html_head ?>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body class="flex flex-col min-h-screen">
|
<body class="flex flex-col min-h-screen">
|
||||||
|
|
@ -24,10 +23,10 @@
|
||||||
<div class="flex items-center mb-4">
|
<div class="flex items-center mb-4">
|
||||||
<address>
|
<address>
|
||||||
<?= lang('Podcast.by', [
|
<?= lang('Podcast.by', [
|
||||||
'author' => $podcast->author,
|
'publisher' => $podcast->publisher,
|
||||||
]) ?>
|
]) ?>
|
||||||
</address>
|
</address>
|
||||||
<?= $podcast->explicit
|
<?= $podcast->parental_advisory === 'explicit'
|
||||||
? '<span class="px-1 ml-2 text-xs font-semibold leading-tight tracking-wider uppercase border-2 border-gray-700 rounded md:border-white">' .
|
? '<span class="px-1 ml-2 text-xs font-semibold leading-tight tracking-wider uppercase border-2 border-gray-700 rounded md:border-white">' .
|
||||||
lang('Common.explicit') .
|
lang('Common.explicit') .
|
||||||
'</span>'
|
'</span>'
|
||||||
|
|
@ -48,15 +47,26 @@
|
||||||
</a>
|
</a>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-2 opacity-75">
|
<div class="mb-2 opacity-75">
|
||||||
<?= $podcast->description_html ?>
|
<?= $podcast->description_html ?>
|
||||||
</div>
|
</div>
|
||||||
<span class="px-2 py-1 text-sm text-gray-700 bg-gray-200 rounded">
|
<span class="px-2 py-1 mb-2 mr-2 text-sm text-gray-700 bg-gray-200 rounded">
|
||||||
<?= lang(
|
<?= lang(
|
||||||
'Podcast.category_options.' .
|
'Podcast.category_options.' .
|
||||||
$podcast->category->code
|
$podcast->category->code
|
||||||
) ?>
|
) ?>
|
||||||
</span>
|
</span>
|
||||||
|
<?php foreach (
|
||||||
|
$podcast->other_categories
|
||||||
|
as $other_category
|
||||||
|
): ?>
|
||||||
|
<span class="px-2 py-1 mb-2 mr-2 text-sm text-gray-700 bg-gray-200 rounded">
|
||||||
|
<?= lang(
|
||||||
|
'Podcast.category_options.' .
|
||||||
|
$other_category->code
|
||||||
|
) ?>
|
||||||
|
</span>
|
||||||
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
"myth/auth": "dev-develop",
|
"myth/auth": "dev-develop",
|
||||||
"codeigniter4/codeigniter4": "dev-develop",
|
"codeigniter4/codeigniter4": "dev-develop",
|
||||||
"league/commonmark": "^1.5",
|
"league/commonmark": "^1.5",
|
||||||
"vlucas/phpdotenv": "^5.1",
|
"vlucas/phpdotenv": "^5.2",
|
||||||
"league/html-to-markdown": "^4.10"
|
"league/html-to-markdown": "^4.10"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
|
|
||||||
69
composer.lock
generated
|
|
@ -12,12 +12,12 @@
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/codeigniter4/CodeIgniter4.git",
|
"url": "https://github.com/codeigniter4/CodeIgniter4.git",
|
||||||
"reference": "9b6eda2729d4a8912ccfe8f8c20587b21ff92ac4"
|
"reference": "9204aef421921f2c07021dda418ebfc200fe4a31"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/codeigniter4/CodeIgniter4/zipball/9b6eda2729d4a8912ccfe8f8c20587b21ff92ac4",
|
"url": "https://api.github.com/repos/codeigniter4/CodeIgniter4/zipball/9204aef421921f2c07021dda418ebfc200fe4a31",
|
||||||
"reference": "9b6eda2729d4a8912ccfe8f8c20587b21ff92ac4",
|
"reference": "9204aef421921f2c07021dda418ebfc200fe4a31",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -51,6 +51,9 @@
|
||||||
"CodeIgniter\\ComposerScripts::postUpdate",
|
"CodeIgniter\\ComposerScripts::postUpdate",
|
||||||
"bash admin/setup.sh"
|
"bash admin/setup.sh"
|
||||||
],
|
],
|
||||||
|
"analyze": [
|
||||||
|
"phpstan analyze"
|
||||||
|
],
|
||||||
"test": [
|
"test": [
|
||||||
"phpunit"
|
"phpunit"
|
||||||
]
|
]
|
||||||
|
|
@ -66,7 +69,7 @@
|
||||||
"slack": "https://codeigniterchat.slack.com",
|
"slack": "https://codeigniterchat.slack.com",
|
||||||
"issues": "https://github.com/codeigniter4/CodeIgniter4/issues"
|
"issues": "https://github.com/codeigniter4/CodeIgniter4/issues"
|
||||||
},
|
},
|
||||||
"time": "2020-09-07T16:29:38+00:00"
|
"time": "2020-09-24T17:15:24+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "composer/ca-bundle",
|
"name": "composer/ca-bundle",
|
||||||
|
|
@ -455,16 +458,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laminas/laminas-zendframework-bridge",
|
"name": "laminas/laminas-zendframework-bridge",
|
||||||
"version": "1.1.0",
|
"version": "1.1.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laminas/laminas-zendframework-bridge.git",
|
"url": "https://github.com/laminas/laminas-zendframework-bridge.git",
|
||||||
"reference": "4939c81f63a8a4968c108c440275c94955753b19"
|
"reference": "6ede70583e101030bcace4dcddd648f760ddf642"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/4939c81f63a8a4968c108c440275c94955753b19",
|
"url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642",
|
||||||
"reference": "4939c81f63a8a4968c108c440275c94955753b19",
|
"reference": "6ede70583e101030bcace4dcddd648f760ddf642",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -476,10 +479,6 @@
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "1.0.x-dev",
|
|
||||||
"dev-develop": "1.1.x-dev"
|
|
||||||
},
|
|
||||||
"laminas": {
|
"laminas": {
|
||||||
"module": "Laminas\\ZendFrameworkBridge"
|
"module": "Laminas\\ZendFrameworkBridge"
|
||||||
}
|
}
|
||||||
|
|
@ -509,20 +508,20 @@
|
||||||
"type": "community_bridge"
|
"type": "community_bridge"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2020-08-18T16:34:51+00:00"
|
"time": "2020-09-14T14:23:00+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "league/commonmark",
|
"name": "league/commonmark",
|
||||||
"version": "1.5.4",
|
"version": "1.5.5",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/thephpleague/commonmark.git",
|
"url": "https://github.com/thephpleague/commonmark.git",
|
||||||
"reference": "21819c989e69bab07e933866ad30c7e3f32984ba"
|
"reference": "45832dfed6007b984c0d40addfac48d403dc6432"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/21819c989e69bab07e933866ad30c7e3f32984ba",
|
"url": "https://api.github.com/repos/thephpleague/commonmark/zipball/45832dfed6007b984c0d40addfac48d403dc6432",
|
||||||
"reference": "21819c989e69bab07e933866ad30c7e3f32984ba",
|
"reference": "45832dfed6007b984c0d40addfac48d403dc6432",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -534,7 +533,7 @@
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"cebe/markdown": "~1.0",
|
"cebe/markdown": "~1.0",
|
||||||
"commonmark/commonmark.js": "0.29.1",
|
"commonmark/commonmark.js": "0.29.2",
|
||||||
"erusev/parsedown": "~1.0",
|
"erusev/parsedown": "~1.0",
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"github/gfm": "0.29.0",
|
"github/gfm": "0.29.0",
|
||||||
|
|
@ -604,7 +603,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2020-08-18T01:19:12+00:00"
|
"time": "2020-09-13T14:44:46+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "league/html-to-markdown",
|
"name": "league/html-to-markdown",
|
||||||
|
|
@ -1247,16 +1246,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vlucas/phpdotenv",
|
"name": "vlucas/phpdotenv",
|
||||||
"version": "v5.1.0",
|
"version": "v5.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/vlucas/phpdotenv.git",
|
"url": "https://github.com/vlucas/phpdotenv.git",
|
||||||
"reference": "448c76d7a9e30c341ff5bc367a923af74ae18467"
|
"reference": "fba64139db67123c7a57072e5f8d3db10d160b66"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/448c76d7a9e30c341ff5bc367a923af74ae18467",
|
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/fba64139db67123c7a57072e5f8d3db10d160b66",
|
||||||
"reference": "448c76d7a9e30c341ff5bc367a923af74ae18467",
|
"reference": "fba64139db67123c7a57072e5f8d3db10d160b66",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1279,7 +1278,7 @@
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "5.1-dev"
|
"dev-master": "5.2-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
|
@ -1319,7 +1318,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2020-07-14T19:26:25+00:00"
|
"time": "2020-09-14T15:57:31+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "whichbrowser/parser",
|
"name": "whichbrowser/parser",
|
||||||
|
|
@ -1705,16 +1704,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpdocumentor/reflection-docblock",
|
"name": "phpdocumentor/reflection-docblock",
|
||||||
"version": "5.2.1",
|
"version": "5.2.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
||||||
"reference": "d870572532cd70bc3fab58f2e23ad423c8404c44"
|
"reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d870572532cd70bc3fab58f2e23ad423c8404c44",
|
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
|
||||||
"reference": "d870572532cd70bc3fab58f2e23ad423c8404c44",
|
"reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1753,20 +1752,20 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
|
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
|
||||||
"time": "2020-08-15T11:14:08+00:00"
|
"time": "2020-09-03T19:13:55+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpdocumentor/type-resolver",
|
"name": "phpdocumentor/type-resolver",
|
||||||
"version": "1.3.0",
|
"version": "1.4.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpDocumentor/TypeResolver.git",
|
"url": "https://github.com/phpDocumentor/TypeResolver.git",
|
||||||
"reference": "e878a14a65245fbe78f8080eba03b47c3b705651"
|
"reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651",
|
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
|
||||||
"reference": "e878a14a65245fbe78f8080eba03b47c3b705651",
|
"reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1798,7 +1797,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
|
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
|
||||||
"time": "2020-06-27T10:12:23+00:00"
|
"time": "2020-09-17T18:55:26+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpspec/prophecy",
|
"name": "phpspec/prophecy",
|
||||||
|
|
|
||||||
1283
package-lock.json
generated
|
|
@ -1386,177 +1386,73 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@commitlint/cli": {
|
"@commitlint/cli": {
|
||||||
"version": "9.1.2",
|
"version": "11.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-9.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-11.0.0.tgz",
|
||||||
"integrity": "sha512-ctRrrPqjZ8r4Vc4FXpPaScEpkPwfvB0Us3NK2SD2AnLwXGMxOLFTabDmNySU1Xc40ud2CmJsaV8lpavvzs8ZZA==",
|
"integrity": "sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/runtime": "^7.9.6",
|
"@babel/runtime": "^7.11.2",
|
||||||
"@commitlint/format": "^9.1.2",
|
"@commitlint/format": "^11.0.0",
|
||||||
"@commitlint/lint": "^9.1.2",
|
"@commitlint/lint": "^11.0.0",
|
||||||
"@commitlint/load": "^9.1.2",
|
"@commitlint/load": "^11.0.0",
|
||||||
"@commitlint/read": "^9.1.2",
|
"@commitlint/read": "^11.0.0",
|
||||||
"chalk": "4.1.0",
|
"chalk": "4.1.0",
|
||||||
"core-js": "^3.6.1",
|
"core-js": "^3.6.1",
|
||||||
"get-stdin": "7.0.0",
|
"get-stdin": "8.0.0",
|
||||||
"lodash": "^4.17.19",
|
"lodash": "^4.17.19",
|
||||||
"resolve-from": "5.0.0",
|
"resolve-from": "5.0.0",
|
||||||
"resolve-global": "1.0.0",
|
"resolve-global": "1.0.0",
|
||||||
"yargs": "^15.1.0"
|
"yargs": "^15.1.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ansi-styles": {
|
"@babel/runtime": {
|
||||||
"version": "4.2.1",
|
"version": "7.11.2",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
|
||||||
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
|
"integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/color-name": "^1.1.1",
|
"regenerator-runtime": "^0.13.4"
|
||||||
"color-convert": "^2.0.1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"chalk": {
|
"@commitlint/execute-rule": {
|
||||||
"version": "4.1.0",
|
"version": "11.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz",
|
||||||
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
|
"integrity": "sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"@commitlint/load": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/load/-/load-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"ansi-styles": "^4.1.0",
|
"@commitlint/execute-rule": "^11.0.0",
|
||||||
"supports-color": "^7.1.0"
|
"@commitlint/resolve-extends": "^11.0.0",
|
||||||
|
"@commitlint/types": "^11.0.0",
|
||||||
|
"chalk": "4.1.0",
|
||||||
|
"cosmiconfig": "^7.0.0",
|
||||||
|
"lodash": "^4.17.19",
|
||||||
|
"resolve-from": "^5.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"color-convert": {
|
"@commitlint/resolve-extends": {
|
||||||
"version": "2.0.1",
|
"version": "11.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz",
|
||||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
"integrity": "sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"color-name": "~1.1.4"
|
"import-fresh": "^3.0.0",
|
||||||
|
"lodash": "^4.17.19",
|
||||||
|
"resolve-from": "^5.0.0",
|
||||||
|
"resolve-global": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"color-name": {
|
"@commitlint/types": {
|
||||||
"version": "1.1.4",
|
"version": "11.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
|
||||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
"integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"has-flag": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"lodash": {
|
|
||||||
"version": "4.17.20",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
|
||||||
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"resolve-from": {
|
|
||||||
"version": "5.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
|
|
||||||
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"supports-color": {
|
|
||||||
"version": "7.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
|
|
||||||
"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"has-flag": "^4.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@commitlint/config-conventional": {
|
|
||||||
"version": "9.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-9.1.2.tgz",
|
|
||||||
"integrity": "sha512-2zfnsrBJuCNJEKMEmltYlCUEoQNE4anvEBI/SYEuiB1JYXYaELijobDBpqhUVjh5NEpprNTY16oMZat6ewnxOg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"conventional-changelog-conventionalcommits": "4.3.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@commitlint/ensure": {
|
|
||||||
"version": "9.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-9.1.2.tgz",
|
|
||||||
"integrity": "sha512-hwQICwpNSTsZgj/1/SdPvYAzhwjwgCJI4vLbT879+Jc+AJ6sj2bUDGw/F89vzgKz1VnaMm4D65bNhoWhG3pdhQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@commitlint/types": "^9.1.2",
|
|
||||||
"lodash": "^4.17.19"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"lodash": {
|
|
||||||
"version": "4.17.20",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
|
||||||
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@commitlint/execute-rule": {
|
|
||||||
"version": "9.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-9.1.2.tgz",
|
|
||||||
"integrity": "sha512-NGbeo0KCVYo1yj9vVPFHv6RGFpIF6wcQxpFYUKGIzZVV9Vz1WyiKS689JXa99Dt1aN0cZlEJJLnTNDIgYls0Vg==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"@commitlint/format": {
|
|
||||||
"version": "9.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/format/-/format-9.1.2.tgz",
|
|
||||||
"integrity": "sha512-+ZWTOSGEU6dbn3NRh1q7sY5K5QLiSs7E2uSzuYnWHXcQk8nlTvnE0ibwMCQxdKLaOTZiN57fHM/7M9Re2gsRuw==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@commitlint/types": "^9.1.2",
|
|
||||||
"chalk": "^4.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@commitlint/is-ignored": {
|
|
||||||
"version": "9.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-9.1.2.tgz",
|
|
||||||
"integrity": "sha512-423W/+Ro+Cc8cg81+t9gds1EscMZNjnGT31nKDvxVxJxXiXQsYYoFEQbU+nfUrRGQsUikEgEJ3ppVGr1linvcQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@commitlint/types": "^9.1.2",
|
|
||||||
"semver": "7.3.2"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"semver": {
|
|
||||||
"version": "7.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
|
|
||||||
"integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@commitlint/lint": {
|
|
||||||
"version": "9.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-9.1.2.tgz",
|
|
||||||
"integrity": "sha512-XvggqHZ4XSTKOgzJhCzz52cWRRO57QQnEviwGj0qnD4jdwC+8h2u9LNZwoa2tGAuaNM3nSm//wNK7FRZhgiiFA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@commitlint/is-ignored": "^9.1.2",
|
|
||||||
"@commitlint/parse": "^9.1.2",
|
|
||||||
"@commitlint/rules": "^9.1.2",
|
|
||||||
"@commitlint/types": "^9.1.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@commitlint/load": {
|
|
||||||
"version": "9.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/load/-/load-9.1.2.tgz",
|
|
||||||
"integrity": "sha512-FPL82xBuF7J3EJ57kLVoligQP4BFRwrknooP+vNT787AXmQ/Fddc/iYYwHwy67pNkk5N++/51UyDl/CqiHb6nA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@commitlint/execute-rule": "^9.1.2",
|
|
||||||
"@commitlint/resolve-extends": "^9.1.2",
|
|
||||||
"@commitlint/types": "^9.1.2",
|
|
||||||
"chalk": "4.1.0",
|
|
||||||
"cosmiconfig": "^6.0.0",
|
|
||||||
"lodash": "^4.17.19",
|
|
||||||
"resolve-from": "^5.0.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"ansi-styles": {
|
"ansi-styles": {
|
||||||
"version": "4.2.1",
|
"version": "4.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
|
||||||
|
|
@ -1593,16 +1489,16 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"cosmiconfig": {
|
"cosmiconfig": {
|
||||||
"version": "6.0.0",
|
"version": "7.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
|
||||||
"integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
|
"integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/parse-json": "^4.0.0",
|
"@types/parse-json": "^4.0.0",
|
||||||
"import-fresh": "^3.1.0",
|
"import-fresh": "^3.2.1",
|
||||||
"parse-json": "^5.0.0",
|
"parse-json": "^5.0.0",
|
||||||
"path-type": "^4.0.0",
|
"path-type": "^4.0.0",
|
||||||
"yaml": "^1.7.2"
|
"yaml": "^1.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"has-flag": {
|
"has-flag": {
|
||||||
|
|
@ -1629,12 +1525,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lodash": {
|
|
||||||
"version": "4.17.20",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
|
||||||
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"parse-json": {
|
"parse-json": {
|
||||||
"version": "5.1.0",
|
"version": "5.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
|
||||||
|
|
@ -1654,9 +1544,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"supports-color": {
|
"supports-color": {
|
||||||
"version": "7.1.0",
|
"version": "7.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||||
"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
|
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"has-flag": "^4.0.0"
|
"has-flag": "^4.0.0"
|
||||||
|
|
@ -1664,16 +1554,247 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@commitlint/message": {
|
"@commitlint/config-conventional": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-SNDRsb5gLuDd2PL83yCOQX6pE7gevC79UPFx+GLbLfw6jGnnbO9/tlL76MLD8MOViqGbo7ZicjChO9Gn+7tHhA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"conventional-changelog-conventionalcommits": "^4.3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@commitlint/ensure": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@commitlint/types": "^11.0.0",
|
||||||
|
"lodash": "^4.17.19"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@commitlint/types": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@commitlint/execute-rule": {
|
||||||
"version": "9.1.2",
|
"version": "9.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/message/-/message-9.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-9.1.2.tgz",
|
||||||
"integrity": "sha512-ndlx5z7bPVLG347oYJUHuQ41eTcsw+aUYT1ZwQyci0Duy2atpuoeeSw9SuM1PjufzRCpb6ExzFEgGzcCRKAJsg==",
|
"integrity": "sha512-NGbeo0KCVYo1yj9vVPFHv6RGFpIF6wcQxpFYUKGIzZVV9Vz1WyiKS689JXa99Dt1aN0cZlEJJLnTNDIgYls0Vg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"@commitlint/format": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/format/-/format-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@commitlint/types": "^11.0.0",
|
||||||
|
"chalk": "^4.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@commitlint/types": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@commitlint/is-ignored": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@commitlint/types": "^11.0.0",
|
||||||
|
"semver": "7.3.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@commitlint/types": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"semver": {
|
||||||
|
"version": "7.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
|
||||||
|
"integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@commitlint/lint": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@commitlint/is-ignored": "^11.0.0",
|
||||||
|
"@commitlint/parse": "^11.0.0",
|
||||||
|
"@commitlint/rules": "^11.0.0",
|
||||||
|
"@commitlint/types": "^11.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@commitlint/types": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@commitlint/load": {
|
||||||
|
"version": "9.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/load/-/load-9.1.2.tgz",
|
||||||
|
"integrity": "sha512-FPL82xBuF7J3EJ57kLVoligQP4BFRwrknooP+vNT787AXmQ/Fddc/iYYwHwy67pNkk5N++/51UyDl/CqiHb6nA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"@commitlint/execute-rule": "^9.1.2",
|
||||||
|
"@commitlint/resolve-extends": "^9.1.2",
|
||||||
|
"@commitlint/types": "^9.1.2",
|
||||||
|
"chalk": "4.1.0",
|
||||||
|
"cosmiconfig": "^6.0.0",
|
||||||
|
"lodash": "^4.17.19",
|
||||||
|
"resolve-from": "^5.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"ansi-styles": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/color-name": "^1.1.1",
|
||||||
|
"color-convert": "^2.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"chalk": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"ansi-styles": "^4.1.0",
|
||||||
|
"supports-color": "^7.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"color-convert": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"color-name": "~1.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"color-name": {
|
||||||
|
"version": "1.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||||
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"cosmiconfig": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/parse-json": "^4.0.0",
|
||||||
|
"import-fresh": "^3.1.0",
|
||||||
|
"parse-json": "^5.0.0",
|
||||||
|
"path-type": "^4.0.0",
|
||||||
|
"yaml": "^1.7.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"has-flag": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"import-fresh": {
|
||||||
|
"version": "3.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
|
||||||
|
"integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"parent-module": "^1.0.0",
|
||||||
|
"resolve-from": "^4.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"resolve-from": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lodash": {
|
||||||
|
"version": "4.17.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
||||||
|
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"parse-json": {
|
||||||
|
"version": "5.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
|
||||||
|
"integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/code-frame": "^7.0.0",
|
||||||
|
"error-ex": "^1.3.1",
|
||||||
|
"json-parse-even-better-errors": "^2.3.0",
|
||||||
|
"lines-and-columns": "^1.1.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resolve-from": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"supports-color": {
|
||||||
|
"version": "7.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
|
||||||
|
"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"has-flag": "^4.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@commitlint/message": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/message/-/message-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@commitlint/parse": {
|
"@commitlint/parse": {
|
||||||
"version": "9.1.2",
|
"version": "11.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-9.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-11.0.0.tgz",
|
||||||
"integrity": "sha512-d+/VYbkotctW+lzDpus/R6xTerOqFQkW1myH+3PwnqYSE6JU/uHT4MlZNGJBv8pX9SPlR66t6X9puFobqtezEw==",
|
"integrity": "sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"conventional-changelog-angular": "^5.0.0",
|
"conventional-changelog-angular": "^5.0.0",
|
||||||
|
|
@ -1681,14 +1802,44 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@commitlint/read": {
|
"@commitlint/read": {
|
||||||
"version": "9.1.2",
|
"version": "11.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/read/-/read-9.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/read/-/read-11.0.0.tgz",
|
||||||
"integrity": "sha512-C2sNBQOqeQXMxpWtRnXYKYB3D9yuybPtQNY/P67A6o8XH/UMHkFaUTyIx1KRgu0IG0yTTItRt46FGnsMWLotvA==",
|
"integrity": "sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@commitlint/top-level": "^9.1.2",
|
"@commitlint/top-level": "^11.0.0",
|
||||||
"fs-extra": "^8.1.0",
|
"fs-extra": "^9.0.0",
|
||||||
"git-raw-commits": "^2.0.0"
|
"git-raw-commits": "^2.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"fs-extra": {
|
||||||
|
"version": "9.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
|
||||||
|
"integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"at-least-node": "^1.0.0",
|
||||||
|
"graceful-fs": "^4.2.0",
|
||||||
|
"jsonfile": "^6.0.1",
|
||||||
|
"universalify": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"jsonfile": {
|
||||||
|
"version": "6.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
|
||||||
|
"integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"graceful-fs": "^4.1.6",
|
||||||
|
"universalify": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"universalify": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@commitlint/resolve-extends": {
|
"@commitlint/resolve-extends": {
|
||||||
|
|
@ -1696,6 +1847,7 @@
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-9.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-9.1.2.tgz",
|
||||||
"integrity": "sha512-HcoL+qFGmWEu9VM4fY0HI+VzF4yHcg3x+9Hx6pYFZ+r2wLbnKs964y0v68oyMO/mS/46MVoLNXZGR8U3adpadg==",
|
"integrity": "sha512-HcoL+qFGmWEu9VM4fY0HI+VzF4yHcg3x+9Hx6pYFZ+r2wLbnKs964y0v68oyMO/mS/46MVoLNXZGR8U3adpadg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"import-fresh": "^3.0.0",
|
"import-fresh": "^3.0.0",
|
||||||
"lodash": "^4.17.19",
|
"lodash": "^4.17.19",
|
||||||
|
|
@ -1708,6 +1860,7 @@
|
||||||
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
|
||||||
"integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
|
"integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"parent-module": "^1.0.0",
|
"parent-module": "^1.0.0",
|
||||||
"resolve-from": "^4.0.0"
|
"resolve-from": "^4.0.0"
|
||||||
|
|
@ -1717,7 +1870,8 @@
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
||||||
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
|
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -1725,48 +1879,98 @@
|
||||||
"version": "4.17.20",
|
"version": "4.17.20",
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
||||||
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
|
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"resolve-from": {
|
"resolve-from": {
|
||||||
"version": "5.0.0",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
|
||||||
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
|
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@commitlint/rules": {
|
"@commitlint/rules": {
|
||||||
"version": "9.1.2",
|
"version": "11.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-9.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-11.0.0.tgz",
|
||||||
"integrity": "sha512-1vecFuzqVqjiT57ocXq1bL8V6GEF1NZs3BR0dQzObaqHftImIxBVII299gasckTkcuxNc8M+7XxZyKxUthukpQ==",
|
"integrity": "sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@commitlint/ensure": "^9.1.2",
|
"@commitlint/ensure": "^11.0.0",
|
||||||
"@commitlint/message": "^9.1.2",
|
"@commitlint/message": "^11.0.0",
|
||||||
"@commitlint/to-lines": "^9.1.2",
|
"@commitlint/to-lines": "^11.0.0",
|
||||||
"@commitlint/types": "^9.1.2"
|
"@commitlint/types": "^11.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@commitlint/types": {
|
||||||
|
"version": "11.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
|
||||||
|
"integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@commitlint/to-lines": {
|
"@commitlint/to-lines": {
|
||||||
"version": "9.1.2",
|
"version": "11.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-9.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-11.0.0.tgz",
|
||||||
"integrity": "sha512-o4zWcMf9EnzA3MOqx01780SgrKq5hqDJmUBPk30g6an0XcDuDy3OSZHHTJFdzsg4V9FjC4OY44sFeK7GN7NaxQ==",
|
"integrity": "sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@commitlint/top-level": {
|
"@commitlint/top-level": {
|
||||||
"version": "9.1.2",
|
"version": "11.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-9.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-11.0.0.tgz",
|
||||||
"integrity": "sha512-KMPP5xVePcz3B1dKqcZdU4FZBVOkT+bG3ip4RQX2TeCJoomMkTjd0utALs7rpTGLID6BXbwwXepZCZJREjR/Bw==",
|
"integrity": "sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"find-up": "^4.0.0"
|
"find-up": "^5.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"find-up": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"locate-path": "^6.0.0",
|
||||||
|
"path-exists": "^4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"locate-path": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"p-locate": "^5.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"p-limit": {
|
||||||
|
"version": "3.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
|
||||||
|
"integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"p-try": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"p-locate": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"p-limit": "^3.0.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@commitlint/types": {
|
"@commitlint/types": {
|
||||||
"version": "9.1.2",
|
"version": "9.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-9.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@commitlint/types/-/types-9.1.2.tgz",
|
||||||
"integrity": "sha512-r3fwVbVH+M8W0qYlBBZFsUwKe6NT5qvz+EmU7sr8VeN1cQ63z+3cfXyTo7WGGEMEgKiT0jboNAK3b1FZp8k9LQ==",
|
"integrity": "sha512-r3fwVbVH+M8W0qYlBBZFsUwKe6NT5qvz+EmU7sr8VeN1cQ63z+3cfXyTo7WGGEMEgKiT0jboNAK3b1FZp8k9LQ==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"@csstools/convert-colors": {
|
"@csstools/convert-colors": {
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
|
|
@ -1817,12 +2021,6 @@
|
||||||
"resolve-from": "^4.0.0"
|
"resolve-from": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lodash": {
|
|
||||||
"version": "4.17.20",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
|
||||||
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"resolve-from": {
|
"resolve-from": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
||||||
|
|
@ -1880,9 +2078,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@popperjs/core": {
|
"@popperjs/core": {
|
||||||
"version": "2.4.4",
|
"version": "2.5.3",
|
||||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.4.tgz",
|
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.5.3.tgz",
|
||||||
"integrity": "sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg=="
|
"integrity": "sha512-RFwCobxsvZ6j7twS7dHIZQZituMIDJJNHS/qY6iuthVebxS3zhRY+jaC2roEKiAYaVuTcGmX6Luc6YBcf6zJVg=="
|
||||||
},
|
},
|
||||||
"@prettier/plugin-php": {
|
"@prettier/plugin-php": {
|
||||||
"version": "0.14.3",
|
"version": "0.14.3",
|
||||||
|
|
@ -1896,9 +2094,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@rollup/plugin-babel": {
|
"@rollup/plugin-babel": {
|
||||||
"version": "5.2.0",
|
"version": "5.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.1.tgz",
|
||||||
"integrity": "sha512-CPABsajaKjINgBQ3it+yMnfVO3ibsrMBxRzbUOUw2cL1hsZJ7aogU8mgglQm3S2hHJgjnAmxPz0Rq7DVdmHsTw==",
|
"integrity": "sha512-Jd7oqFR2dzZJ3NWANDyBjwTtX/lYbZpVcmkHrfQcpvawHs9E4c0nYk5U2mfZ6I/DZcIvy506KZJi54XK/jxH7A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/helper-module-imports": "^7.10.4",
|
"@babel/helper-module-imports": "^7.10.4",
|
||||||
|
|
@ -1906,9 +2104,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@rollup/plugin-commonjs": {
|
"@rollup/plugin-commonjs": {
|
||||||
"version": "15.0.0",
|
"version": "15.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz",
|
||||||
"integrity": "sha512-8uAdikHqVyrT32w1zB9VhW6uGwGjhKgnDNP4pQJsjdnyF4FgCj6/bmv24c7v2CuKhq32CcyCwRzMPEElaKkn0w==",
|
"integrity": "sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@rollup/pluginutils": "^3.1.0",
|
"@rollup/pluginutils": "^3.1.0",
|
||||||
|
|
@ -2014,15 +2212,6 @@
|
||||||
"integrity": "sha512-aPgMH+CjQiScLZculoDNOQUrrK2ktkbl3D6uCLYp1jgYRlNDrMONu9nMu8LfwAeetYNpVNeIGx7WzHSu0kvECg==",
|
"integrity": "sha512-aPgMH+CjQiScLZculoDNOQUrrK2ktkbl3D6uCLYp1jgYRlNDrMONu9nMu8LfwAeetYNpVNeIGx7WzHSu0kvECg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/codemirror": {
|
|
||||||
"version": "0.0.97",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.97.tgz",
|
|
||||||
"integrity": "sha512-n5d7o9nWhC49DjfhsxANP7naWSeTzrjXASkUDQh7626sM4zK9XP2EVcHp1IcCf/IPV6c7ORzDUDF3Bkt231VKg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@types/tern": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@types/color-name": {
|
"@types/color-name": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
||||||
|
|
@ -2158,15 +2347,6 @@
|
||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@types/tern": {
|
|
||||||
"version": "0.23.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.3.tgz",
|
|
||||||
"integrity": "sha512-imDtS4TAoTcXk0g7u4kkWqedB3E4qpjXzCpD2LU5M5NAXHzCDsypyvXSaG7mM8DKYkCRa7tFp4tS/lp/Wo7Q3w==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@types/estree": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@types/unist": {
|
"@types/unist": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
|
||||||
|
|
@ -2174,13 +2354,13 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@typescript-eslint/eslint-plugin": {
|
"@typescript-eslint/eslint-plugin": {
|
||||||
"version": "4.0.1",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.3.0.tgz",
|
||||||
"integrity": "sha512-pQZtXupCn11O4AwpYVUX4PDFfmIJl90ZgrEBg0CEcqlwvPiG0uY81fimr1oMFblZnpKAq6prrT9a59pj1x58rw==",
|
"integrity": "sha512-RqEcaHuEKnn3oPFislZ6TNzsBLqpZjN93G69SS+laav/I8w/iGMuMq97P0D2/2/kW4SCebHggqhbcCfbDaaX+g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/experimental-utils": "4.0.1",
|
"@typescript-eslint/experimental-utils": "4.3.0",
|
||||||
"@typescript-eslint/scope-manager": "4.0.1",
|
"@typescript-eslint/scope-manager": "4.3.0",
|
||||||
"debug": "^4.1.1",
|
"debug": "^4.1.1",
|
||||||
"functional-red-black-tree": "^1.0.1",
|
"functional-red-black-tree": "^1.0.1",
|
||||||
"regexpp": "^3.0.0",
|
"regexpp": "^3.0.0",
|
||||||
|
|
@ -2197,55 +2377,55 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/experimental-utils": {
|
"@typescript-eslint/experimental-utils": {
|
||||||
"version": "4.0.1",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.3.0.tgz",
|
||||||
"integrity": "sha512-gAqOjLiHoED79iYTt3F4uSHrYmg/GPz/zGezdB0jAdr6S6gwNiR/j7cTZ8nREKVzMVKLd9G3xbg1sV9GClW3sw==",
|
"integrity": "sha512-cmmIK8shn3mxmhpKfzMMywqiEheyfXLV/+yPDnOTvQX/ztngx7Lg/OD26J8gTZfkLKUmaEBxO2jYP3keV7h2OQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/json-schema": "^7.0.3",
|
"@types/json-schema": "^7.0.3",
|
||||||
"@typescript-eslint/scope-manager": "4.0.1",
|
"@typescript-eslint/scope-manager": "4.3.0",
|
||||||
"@typescript-eslint/types": "4.0.1",
|
"@typescript-eslint/types": "4.3.0",
|
||||||
"@typescript-eslint/typescript-estree": "4.0.1",
|
"@typescript-eslint/typescript-estree": "4.3.0",
|
||||||
"eslint-scope": "^5.0.0",
|
"eslint-scope": "^5.0.0",
|
||||||
"eslint-utils": "^2.0.0"
|
"eslint-utils": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/parser": {
|
"@typescript-eslint/parser": {
|
||||||
"version": "4.0.1",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.3.0.tgz",
|
||||||
"integrity": "sha512-1+qLmXHNAWSQ7RB6fdSQszAiA7JTwzakj5cNYjBTUmpH2cqilxMZEIV+DRKjVZs8NzP3ALmKexB0w/ExjcK9Iw==",
|
"integrity": "sha512-JyfRnd72qRuUwItDZ00JNowsSlpQGeKfl9jxwO0FHK1qQ7FbYdoy5S7P+5wh1ISkT2QyAvr2pc9dAemDxzt75g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/scope-manager": "4.0.1",
|
"@typescript-eslint/scope-manager": "4.3.0",
|
||||||
"@typescript-eslint/types": "4.0.1",
|
"@typescript-eslint/types": "4.3.0",
|
||||||
"@typescript-eslint/typescript-estree": "4.0.1",
|
"@typescript-eslint/typescript-estree": "4.3.0",
|
||||||
"debug": "^4.1.1"
|
"debug": "^4.1.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/scope-manager": {
|
"@typescript-eslint/scope-manager": {
|
||||||
"version": "4.0.1",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.3.0.tgz",
|
||||||
"integrity": "sha512-u3YEXVJ8jsj7QCJk3om0Y457fy2euEOkkzxIB/LKU3MdyI+FJ2gI0M4aKEaXzwCSfNDiZ13a3lDo5DVozc+XLQ==",
|
"integrity": "sha512-cTeyP5SCNE8QBRfc+Lgh4Xpzje46kNUhXYfc3pQWmJif92sjrFuHT9hH4rtOkDTo/si9Klw53yIr+djqGZS1ig==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "4.0.1",
|
"@typescript-eslint/types": "4.3.0",
|
||||||
"@typescript-eslint/visitor-keys": "4.0.1"
|
"@typescript-eslint/visitor-keys": "4.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/types": {
|
"@typescript-eslint/types": {
|
||||||
"version": "4.0.1",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.3.0.tgz",
|
||||||
"integrity": "sha512-S+gD3fgbkZYW2rnbjugNMqibm9HpEjqZBZkTiI3PwbbNGWmAcxolWIUwZ0SKeG4Dy2ktpKKaI/6+HGYVH8Qrlg==",
|
"integrity": "sha512-Cx9TpRvlRjOppGsU6Y6KcJnUDOelja2NNCX6AZwtVHRzaJkdytJWMuYiqi8mS35MRNA3cJSwDzXePfmhU6TANw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@typescript-eslint/typescript-estree": {
|
"@typescript-eslint/typescript-estree": {
|
||||||
"version": "4.0.1",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.3.0.tgz",
|
||||||
"integrity": "sha512-zGzleORFXrRWRJAMLTB2iJD1IZbCPkg4hsI8mGdpYlKaqzvKYSEWVAYh14eauaR+qIoZVWrXgYSXqLtTlxotiw==",
|
"integrity": "sha512-ZAI7xjkl+oFdLV/COEz2tAbQbR3XfgqHEGy0rlUXzfGQic6EBCR4s2+WS3cmTPG69aaZckEucBoTxW9PhzHxxw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "4.0.1",
|
"@typescript-eslint/types": "4.3.0",
|
||||||
"@typescript-eslint/visitor-keys": "4.0.1",
|
"@typescript-eslint/visitor-keys": "4.3.0",
|
||||||
"debug": "^4.1.1",
|
"debug": "^4.1.1",
|
||||||
"globby": "^11.0.1",
|
"globby": "^11.0.1",
|
||||||
"is-glob": "^4.0.1",
|
"is-glob": "^4.0.1",
|
||||||
|
|
@ -2263,12 +2443,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/visitor-keys": {
|
"@typescript-eslint/visitor-keys": {
|
||||||
"version": "4.0.1",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.3.0.tgz",
|
||||||
"integrity": "sha512-yBSqd6FjnTzbg5RUy9J+9kJEyQjTI34JdGMJz+9ttlJzLCnGkBikxw+N5n2VDcc3CesbIEJ0MnZc5uRYnrEnCw==",
|
"integrity": "sha512-xZxkuR7XLM6RhvLkgv9yYlTcBHnTULzfnw4i6+z2TGBLy9yljAypQaZl9c3zFvy7PNI7fYWyvKYtohyF8au3cw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "4.0.1",
|
"@typescript-eslint/types": "4.3.0",
|
||||||
"eslint-visitor-keys": "^2.0.0"
|
"eslint-visitor-keys": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -2289,9 +2469,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"acorn-jsx": {
|
"acorn-jsx": {
|
||||||
"version": "5.2.0",
|
"version": "5.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
|
||||||
"integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
|
"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"acorn-node": {
|
"acorn-node": {
|
||||||
|
|
@ -2322,9 +2502,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ajv": {
|
"ajv": {
|
||||||
"version": "6.12.4",
|
"version": "6.12.5",
|
||||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz",
|
||||||
"integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
|
"integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"fast-deep-equal": "^3.1.1",
|
"fast-deep-equal": "^3.1.1",
|
||||||
|
|
@ -2420,6 +2600,12 @@
|
||||||
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
|
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"arrify": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"assign-symbols": {
|
"assign-symbols": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
|
||||||
|
|
@ -2682,6 +2868,12 @@
|
||||||
"integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
|
"integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"camelcase": {
|
||||||
|
"version": "5.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
|
||||||
|
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"camelcase-css": {
|
"camelcase-css": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
|
||||||
|
|
@ -2697,14 +2889,6 @@
|
||||||
"camelcase": "^5.3.1",
|
"camelcase": "^5.3.1",
|
||||||
"map-obj": "^4.0.0",
|
"map-obj": "^4.0.0",
|
||||||
"quick-lru": "^4.0.1"
|
"quick-lru": "^4.0.1"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"camelcase": {
|
|
||||||
"version": "5.3.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
|
|
||||||
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"caniuse-api": {
|
"caniuse-api": {
|
||||||
|
|
@ -2813,6 +2997,16 @@
|
||||||
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
|
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"choices.js": {
|
||||||
|
"version": "9.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/choices.js/-/choices.js-9.0.1.tgz",
|
||||||
|
"integrity": "sha512-JgpeDY0Tmg7tqY6jaW/druSklJSt7W68tXFJIw0GSGWmO37SDAL8o60eICNGbzIODjj02VNNtf5h6TgoHDtCsA==",
|
||||||
|
"requires": {
|
||||||
|
"deepmerge": "^4.2.0",
|
||||||
|
"fuse.js": "^3.4.5",
|
||||||
|
"redux": "^4.0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"chokidar": {
|
"chokidar": {
|
||||||
"version": "3.4.2",
|
"version": "3.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
|
||||||
|
|
@ -3086,11 +3280,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"codemirror": {
|
|
||||||
"version": "5.57.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.57.0.tgz",
|
|
||||||
"integrity": "sha512-WGc6UL7Hqt+8a6ZAsj/f1ApQl3NPvHY/UQSzG6fB6l4BjExgVdhFaxd7mRTw1UCiYe/6q86zHP+kfvBQcZGvUg=="
|
|
||||||
},
|
|
||||||
"collapse-white-space": {
|
"collapse-white-space": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
|
||||||
|
|
@ -3286,41 +3475,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"conventional-changelog-conventionalcommits": {
|
"conventional-changelog-conventionalcommits": {
|
||||||
"version": "4.3.0",
|
"version": "4.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz",
|
||||||
"integrity": "sha512-oYHydvZKU+bS8LnGqTMlNrrd7769EsuEHKy4fh1oMdvvDi7fem8U+nvfresJ1IDB8K00Mn4LpiA/lR+7Gs6rgg==",
|
"integrity": "sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"compare-func": "^1.3.1",
|
"compare-func": "^2.0.0",
|
||||||
"lodash": "^4.17.15",
|
"lodash": "^4.17.15",
|
||||||
"q": "^1.5.1"
|
"q": "^1.5.1"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"compare-func": {
|
|
||||||
"version": "1.3.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz",
|
|
||||||
"integrity": "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"array-ify": "^1.0.0",
|
|
||||||
"dot-prop": "^3.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dot-prop": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
|
|
||||||
"integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"is-obj": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"is-obj": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
|
|
||||||
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"conventional-commit-types": {
|
"conventional-commit-types": {
|
||||||
|
|
@ -3852,8 +4014,7 @@
|
||||||
"deepmerge": {
|
"deepmerge": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
|
||||||
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
|
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"define-properties": {
|
"define-properties": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
|
|
@ -4008,9 +4169,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dot-prop": {
|
"dot-prop": {
|
||||||
"version": "5.2.0",
|
"version": "5.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
|
||||||
"integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
|
"integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"is-obj": "^2.0.0"
|
"is-obj": "^2.0.0"
|
||||||
|
|
@ -4113,6 +4274,12 @@
|
||||||
"is-symbol": "^1.0.2"
|
"is-symbol": "^1.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"escalade": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"escape-string-regexp": {
|
"escape-string-regexp": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||||
|
|
@ -4120,9 +4287,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"eslint": {
|
"eslint": {
|
||||||
"version": "7.8.1",
|
"version": "7.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.10.0.tgz",
|
||||||
"integrity": "sha512-/2rX2pfhyUG0y+A123d0ccXtMm7DV7sH1m3lk9nk2DZ2LReq39FXHueR9xZwshE5MdfSf0xunSaMWRqyIA6M1w==",
|
"integrity": "sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/code-frame": "^7.0.0",
|
"@babel/code-frame": "^7.0.0",
|
||||||
|
|
@ -4133,7 +4300,7 @@
|
||||||
"debug": "^4.0.1",
|
"debug": "^4.0.1",
|
||||||
"doctrine": "^3.0.0",
|
"doctrine": "^3.0.0",
|
||||||
"enquirer": "^2.3.5",
|
"enquirer": "^2.3.5",
|
||||||
"eslint-scope": "^5.1.0",
|
"eslint-scope": "^5.1.1",
|
||||||
"eslint-utils": "^2.1.0",
|
"eslint-utils": "^2.1.0",
|
||||||
"eslint-visitor-keys": "^1.3.0",
|
"eslint-visitor-keys": "^1.3.0",
|
||||||
"espree": "^7.3.0",
|
"espree": "^7.3.0",
|
||||||
|
|
@ -4201,12 +4368,6 @@
|
||||||
"resolve-from": "^4.0.0"
|
"resolve-from": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lodash": {
|
|
||||||
"version": "4.17.20",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
|
||||||
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"resolve-from": {
|
"resolve-from": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
||||||
|
|
@ -4243,9 +4404,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"eslint-config-prettier": {
|
"eslint-config-prettier": {
|
||||||
"version": "6.11.0",
|
"version": "6.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.12.0.tgz",
|
||||||
"integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==",
|
"integrity": "sha512-9jWPlFlgNwRUYVoujvWTQ1aMO8o6648r+K7qU7K5Jmkbyqav1fuEZC0COYpGBxyiAJb65Ra9hrmFx19xRGwXWw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"get-stdin": "^6.0.0"
|
"get-stdin": "^6.0.0"
|
||||||
|
|
@ -4269,12 +4430,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"eslint-scope": {
|
"eslint-scope": {
|
||||||
"version": "5.1.0",
|
"version": "5.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
|
||||||
"integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
|
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"esrecurse": "^4.1.0",
|
"esrecurse": "^4.3.0",
|
||||||
"estraverse": "^4.1.1"
|
"estraverse": "^4.1.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -4855,6 +5016,11 @@
|
||||||
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
|
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"fuse.js": {
|
||||||
|
"version": "3.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz",
|
||||||
|
"integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw=="
|
||||||
|
},
|
||||||
"generic-names": {
|
"generic-names": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz",
|
||||||
|
|
@ -4883,9 +5049,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"get-stdin": {
|
"get-stdin": {
|
||||||
"version": "7.0.0",
|
"version": "8.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
|
||||||
"integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
|
"integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"get-stream": {
|
"get-stream": {
|
||||||
|
|
@ -5168,15 +5334,15 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"husky": {
|
"husky": {
|
||||||
"version": "4.2.5",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz",
|
"resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz",
|
||||||
"integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==",
|
"integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"chalk": "^4.0.0",
|
"chalk": "^4.0.0",
|
||||||
"ci-info": "^2.0.0",
|
"ci-info": "^2.0.0",
|
||||||
"compare-versions": "^3.6.0",
|
"compare-versions": "^3.6.0",
|
||||||
"cosmiconfig": "^6.0.0",
|
"cosmiconfig": "^7.0.0",
|
||||||
"find-versions": "^3.2.0",
|
"find-versions": "^3.2.0",
|
||||||
"opencollective-postinstall": "^2.0.2",
|
"opencollective-postinstall": "^2.0.2",
|
||||||
"pkg-dir": "^4.2.0",
|
"pkg-dir": "^4.2.0",
|
||||||
|
|
@ -5186,16 +5352,16 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cosmiconfig": {
|
"cosmiconfig": {
|
||||||
"version": "6.0.0",
|
"version": "7.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
|
||||||
"integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
|
"integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/parse-json": "^4.0.0",
|
"@types/parse-json": "^4.0.0",
|
||||||
"import-fresh": "^3.1.0",
|
"import-fresh": "^3.2.1",
|
||||||
"parse-json": "^5.0.0",
|
"parse-json": "^5.0.0",
|
||||||
"path-type": "^4.0.0",
|
"path-type": "^4.0.0",
|
||||||
"yaml": "^1.7.2"
|
"yaml": "^1.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"import-fresh": {
|
"import-fresh": {
|
||||||
|
|
@ -5209,14 +5375,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"parse-json": {
|
"parse-json": {
|
||||||
"version": "5.0.0",
|
"version": "5.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
|
||||||
"integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
|
"integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/code-frame": "^7.0.0",
|
"@babel/code-frame": "^7.0.0",
|
||||||
"error-ex": "^1.3.1",
|
"error-ex": "^1.3.1",
|
||||||
"json-parse-better-errors": "^1.0.1",
|
"json-parse-even-better-errors": "^2.3.0",
|
||||||
"lines-and-columns": "^1.1.6"
|
"lines-and-columns": "^1.1.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -5734,8 +5900,7 @@
|
||||||
"js-tokens": {
|
"js-tokens": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||||
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
|
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"js-yaml": {
|
"js-yaml": {
|
||||||
"version": "3.14.0",
|
"version": "3.14.0",
|
||||||
|
|
@ -5859,9 +6024,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"version": "10.3.0",
|
"version": "10.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.4.0.tgz",
|
||||||
"integrity": "sha512-an3VgjHqmJk0TORB/sdQl0CTkRg4E5ybYCXTTCSJ5h9jFwZbcgKIx5oVma5e7wp/uKt17s1QYFmYqT9MGVosGw==",
|
"integrity": "sha512-uaiX4U5yERUSiIEQc329vhCTDDwUcSvKdRLsNomkYLRzijk3v8V9GWm2Nz0RMVB87VcuzLvtgy6OsjoH++QHIg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"chalk": "^4.1.0",
|
"chalk": "^4.1.0",
|
||||||
|
|
@ -6143,6 +6308,30 @@
|
||||||
"integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
|
"integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"lodash.difference": {
|
||||||
|
"version": "4.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
|
||||||
|
"integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"lodash.forown": {
|
||||||
|
"version": "4.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz",
|
||||||
|
"integrity": "sha1-hRFc8E9z75ZuztUlEdOJPMRmg68=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"lodash.get": {
|
||||||
|
"version": "4.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
|
||||||
|
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"lodash.groupby": {
|
||||||
|
"version": "4.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz",
|
||||||
|
"integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"lodash.map": {
|
"lodash.map": {
|
||||||
"version": "4.6.0",
|
"version": "4.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
|
||||||
|
|
@ -6155,6 +6344,12 @@
|
||||||
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
|
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"lodash.sortby": {
|
||||||
|
"version": "4.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
|
||||||
|
"integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"lodash.template": {
|
"lodash.template": {
|
||||||
"version": "4.5.0",
|
"version": "4.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
|
||||||
|
|
@ -6322,7 +6517,6 @@
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
|
||||||
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
|
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"js-tokens": "^3.0.0 || ^4.0.0"
|
"js-tokens": "^3.0.0 || ^4.0.0"
|
||||||
}
|
}
|
||||||
|
|
@ -6447,9 +6641,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"meow": {
|
"meow": {
|
||||||
"version": "7.1.0",
|
"version": "7.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/meow/-/meow-7.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz",
|
||||||
"integrity": "sha512-kq5F0KVteskZ3JdfyQFivJEj2RaA8NFsS4+r9DaMKLcUHpk5OcHS3Q0XkCXONB1mZRPsu/Y/qImKri0nwSEZog==",
|
"integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/minimist": "^1.2.0",
|
"@types/minimist": "^1.2.0",
|
||||||
|
|
@ -6546,14 +6740,6 @@
|
||||||
"arrify": "^1.0.1",
|
"arrify": "^1.0.1",
|
||||||
"is-plain-obj": "^1.1.0",
|
"is-plain-obj": "^1.1.0",
|
||||||
"kind-of": "^6.0.3"
|
"kind-of": "^6.0.3"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"arrify": {
|
|
||||||
"version": "1.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
|
|
||||||
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mixin-deep": {
|
"mixin-deep": {
|
||||||
|
|
@ -6648,14 +6834,6 @@
|
||||||
"resolve": "^1.10.0",
|
"resolve": "^1.10.0",
|
||||||
"semver": "2 || 3 || 4 || 5",
|
"semver": "2 || 3 || 4 || 5",
|
||||||
"validate-npm-package-license": "^3.0.1"
|
"validate-npm-package-license": "^3.0.1"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"semver": {
|
|
||||||
"version": "5.7.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
|
|
||||||
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"normalize-path": {
|
"normalize-path": {
|
||||||
|
|
@ -7041,57 +7219,6 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"find-up": "^4.0.0"
|
"find-up": "^4.0.0"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"find-up": {
|
|
||||||
"version": "4.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
|
|
||||||
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"locate-path": "^5.0.0",
|
|
||||||
"path-exists": "^4.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"locate-path": {
|
|
||||||
"version": "5.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
|
|
||||||
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"p-locate": "^4.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"p-limit": {
|
|
||||||
"version": "2.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
|
|
||||||
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"p-try": "^2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"p-locate": {
|
|
||||||
"version": "4.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
|
|
||||||
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"p-limit": "^2.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"p-try": {
|
|
||||||
"version": "2.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
|
|
||||||
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"path-exists": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pkg-up": {
|
"pkg-up": {
|
||||||
|
|
@ -7241,9 +7368,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"postcss-cli": {
|
"postcss-cli": {
|
||||||
"version": "7.1.2",
|
"version": "8.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-7.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.0.0.tgz",
|
||||||
"integrity": "sha512-3mlEmN1v2NVuosMWZM2tP8bgZn7rO5PYxRRrXtdSyL5KipcgBDjJ9ct8/LKxImMCJJi3x5nYhCGFJOkGyEqXBQ==",
|
"integrity": "sha512-WgQIz1tc8htjob2DULE6dTssDzItuBh3UbscdrAlvid7M6X2WBZUrHCaLMtIuFkHFijAnimIq3nkpXV6FdDTSg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"chalk": "^4.0.0",
|
"chalk": "^4.0.0",
|
||||||
|
|
@ -7252,14 +7379,55 @@
|
||||||
"fs-extra": "^9.0.0",
|
"fs-extra": "^9.0.0",
|
||||||
"get-stdin": "^8.0.0",
|
"get-stdin": "^8.0.0",
|
||||||
"globby": "^11.0.0",
|
"globby": "^11.0.0",
|
||||||
"postcss": "^7.0.0",
|
"postcss-load-config": "^2.1.1",
|
||||||
"postcss-load-config": "^2.0.0",
|
"postcss-reporter": "^7.0.0",
|
||||||
"postcss-reporter": "^6.0.0",
|
|
||||||
"pretty-hrtime": "^1.0.3",
|
"pretty-hrtime": "^1.0.3",
|
||||||
"read-cache": "^1.0.0",
|
"read-cache": "^1.0.0",
|
||||||
"yargs": "^15.0.2"
|
"yargs": "^16.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"ansi-regex": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"ansi-styles": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/color-name": "^1.1.1",
|
||||||
|
"color-convert": "^2.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cliui": {
|
||||||
|
"version": "7.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.1.tgz",
|
||||||
|
"integrity": "sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"string-width": "^4.2.0",
|
||||||
|
"strip-ansi": "^6.0.0",
|
||||||
|
"wrap-ansi": "^7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"color-convert": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"color-name": "~1.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"color-name": {
|
||||||
|
"version": "1.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||||
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"fs-extra": {
|
"fs-extra": {
|
||||||
"version": "9.0.1",
|
"version": "9.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
|
||||||
|
|
@ -7272,10 +7440,10 @@
|
||||||
"universalify": "^1.0.0"
|
"universalify": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"get-stdin": {
|
"is-fullwidth-code-point": {
|
||||||
"version": "8.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
||||||
"integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
|
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"jsonfile": {
|
"jsonfile": {
|
||||||
|
|
@ -7288,11 +7456,79 @@
|
||||||
"universalify": "^1.0.0"
|
"universalify": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"postcss-load-config": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-D2ENobdoZsW0+BHy4x1CAkXtbXtYWYRIxL/JbtRBqrRGOPtJ2zoga/bEZWhV/ShWB5saVxJMzbMdSyA/vv4tXw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"cosmiconfig": "^5.0.0",
|
||||||
|
"import-cwd": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"string-width": {
|
||||||
|
"version": "4.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
|
||||||
|
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"emoji-regex": "^8.0.0",
|
||||||
|
"is-fullwidth-code-point": "^3.0.0",
|
||||||
|
"strip-ansi": "^6.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"strip-ansi": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"ansi-regex": "^5.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"universalify": {
|
"universalify": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
|
||||||
"integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
|
"integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
|
||||||
"dev": true
|
"dev": true
|
||||||
|
},
|
||||||
|
"wrap-ansi": {
|
||||||
|
"version": "7.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||||
|
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"ansi-styles": "^4.0.0",
|
||||||
|
"string-width": "^4.1.0",
|
||||||
|
"strip-ansi": "^6.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"y18n": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.1.tgz",
|
||||||
|
"integrity": "sha512-/jJ831jEs4vGDbYPQp4yGKDYPSCCEQ45uZWJHE1AoYBzqdZi8+LDWas0z4HrmJXmKdpFsTiowSHXdxyFhpmdMg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"yargs": {
|
||||||
|
"version": "16.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.0.3.tgz",
|
||||||
|
"integrity": "sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"cliui": "^7.0.0",
|
||||||
|
"escalade": "^3.0.2",
|
||||||
|
"get-caller-file": "^2.0.5",
|
||||||
|
"require-directory": "^2.1.1",
|
||||||
|
"string-width": "^4.2.0",
|
||||||
|
"y18n": "^5.0.1",
|
||||||
|
"yargs-parser": "^20.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"yargs-parser": {
|
||||||
|
"version": "20.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.0.tgz",
|
||||||
|
"integrity": "sha512-2agPoRFPoIcFzOIp6656gcvsg2ohtscpw2OINr/q46+Sq41xz2OYLqx5HRHabmFU1OARIPAYH5uteICE7mn/5A==",
|
||||||
|
"dev": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -8396,37 +8632,18 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"postcss-reporter": {
|
"postcss-reporter": {
|
||||||
"version": "6.0.1",
|
"version": "7.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.0.tgz",
|
||||||
"integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==",
|
"integrity": "sha512-TQ7aIDKgd7FFekFMHLRoDfl0aY3XmIAAhE4Bduyh5GvFi6uYPSVORWY4jkeC7qidFw7YtXwF5ejYQfUHOC73rQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"chalk": "^2.4.1",
|
"colorette": "^1.2.1",
|
||||||
"lodash": "^4.17.11",
|
"lodash.difference": "^4.5.0",
|
||||||
"log-symbols": "^2.2.0",
|
"lodash.forown": "^4.4.0",
|
||||||
"postcss": "^7.0.7"
|
"lodash.get": "^4.4.2",
|
||||||
},
|
"lodash.groupby": "^4.6.0",
|
||||||
"dependencies": {
|
"lodash.sortby": "^4.7.0",
|
||||||
"chalk": {
|
"log-symbols": "^4.0.0"
|
||||||
"version": "2.4.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
|
|
||||||
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"ansi-styles": "^3.2.1",
|
|
||||||
"escape-string-regexp": "^1.0.5",
|
|
||||||
"supports-color": "^5.3.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"log-symbols": {
|
|
||||||
"version": "2.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
|
|
||||||
"integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"chalk": "^2.0.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"postcss-resolve-nested-selector": {
|
"postcss-resolve-nested-selector": {
|
||||||
|
|
@ -8555,9 +8772,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"prettier": {
|
"prettier": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
|
||||||
"integrity": "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw==",
|
"integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"prettier-linter-helpers": {
|
"prettier-linter-helpers": {
|
||||||
|
|
@ -8729,9 +8946,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"prosemirror-view": {
|
"prosemirror-view": {
|
||||||
"version": "1.15.6",
|
"version": "1.16.0",
|
||||||
"resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.15.6.tgz",
|
"resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.16.0.tgz",
|
||||||
"integrity": "sha512-9FBFB+rK5pvvzHsHOacy0T/Jf+OxZSzY8tSlQiur3SZwAVaNVQm+fl23V/6gU2dHBnreGxjYx9jK+F3XPsPCGw==",
|
"integrity": "sha512-iFtStCw2byF0yLc3mm1ezGdFSd6SWM4pnJod+ZaJiU5ju36QdYM4Xwa+qNm/AaI2/MgxpJqi8jsGWOJNkeBQ/Q==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"prosemirror-model": "^1.1.0",
|
"prosemirror-model": "^1.1.0",
|
||||||
"prosemirror-state": "^1.0.0",
|
"prosemirror-state": "^1.0.0",
|
||||||
|
|
@ -8817,14 +9034,14 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"parse-json": {
|
"parse-json": {
|
||||||
"version": "5.0.0",
|
"version": "5.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
|
||||||
"integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
|
"integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/code-frame": "^7.0.0",
|
"@babel/code-frame": "^7.0.0",
|
||||||
"error-ex": "^1.3.1",
|
"error-ex": "^1.3.1",
|
||||||
"json-parse-better-errors": "^1.0.1",
|
"json-parse-even-better-errors": "^2.3.0",
|
||||||
"lines-and-columns": "^1.1.6"
|
"lines-and-columns": "^1.1.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -8907,6 +9124,15 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"redux": {
|
||||||
|
"version": "4.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz",
|
||||||
|
"integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==",
|
||||||
|
"requires": {
|
||||||
|
"loose-envify": "^1.4.0",
|
||||||
|
"symbol-observable": "^1.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"regenerate": {
|
"regenerate": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
|
||||||
|
|
@ -8922,6 +9148,12 @@
|
||||||
"regenerate": "^1.4.0"
|
"regenerate": "^1.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"regenerator-runtime": {
|
||||||
|
"version": "0.13.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
|
||||||
|
"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"regenerator-transform": {
|
"regenerator-transform": {
|
||||||
"version": "0.14.5",
|
"version": "0.14.5",
|
||||||
"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
|
"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
|
||||||
|
|
@ -9155,9 +9387,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rollup": {
|
"rollup": {
|
||||||
"version": "2.26.10",
|
"version": "2.28.2",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.10.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.28.2.tgz",
|
||||||
"integrity": "sha512-dUnjCWOA0h9qNX6qtcHidyatz8FAFZxVxt1dbcGtKdlJkpSxGK3G9+DLCYvtZr9v94D129ij9zUhG+xbRoqepw==",
|
"integrity": "sha512-8txbsFBFLmm9Xdt4ByTOGa9Muonmc8MfNjnGAR8U8scJlF1ZW7AgNZa7aqBXaKtlvnYP/ab++fQIq9dB9NWUbg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"fsevents": "~2.1.2"
|
"fsevents": "~2.1.2"
|
||||||
|
|
@ -9266,9 +9498,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rollup-plugin-terser": {
|
"rollup-plugin-terser": {
|
||||||
"version": "7.0.1",
|
"version": "7.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
|
||||||
"integrity": "sha512-HL0dgzSxBYG/Ly9i/E5Sc+PuKKZ0zBzk11VmLCfdUtpqH4yYqkLclPkTqRy85FU9246yetImOClaQ/ufnj08vg==",
|
"integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/code-frame": "^7.10.4",
|
"@babel/code-frame": "^7.10.4",
|
||||||
|
|
@ -9693,9 +9925,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"spdx-license-ids": {
|
"spdx-license-ids": {
|
||||||
"version": "3.0.5",
|
"version": "3.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
|
||||||
"integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
|
"integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"specificity": {
|
"specificity": {
|
||||||
|
|
@ -9962,9 +10194,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"stylelint": {
|
"stylelint": {
|
||||||
"version": "13.7.0",
|
"version": "13.7.2",
|
||||||
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.7.2.tgz",
|
||||||
"integrity": "sha512-1wStd4zVetnlHO98VjcHQbjSDmvcA39smkZQMct2cf+hom40H0xlQNdzzbswoG/jGBh61/Ue9m7Lu99PY51O6A==",
|
"integrity": "sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@stylelint/postcss-css-in-js": "^0.37.2",
|
"@stylelint/postcss-css-in-js": "^0.37.2",
|
||||||
|
|
@ -10064,9 +10296,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"caniuse-lite": {
|
"caniuse-lite": {
|
||||||
"version": "1.0.30001124",
|
"version": "1.0.30001142",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001124.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001142.tgz",
|
||||||
"integrity": "sha512-zQW8V3CdND7GHRH6rxm6s59Ww4g/qGWTheoboW9nfeMg7sUoopIfKCcNZUjwYRCOrvereh3kwDpZj4VLQ7zGtA==",
|
"integrity": "sha512-pDPpn9ankEpBFZXyCv2I4lh1v/ju+bqb78QfKf+w9XgDAFWBwSYPswXqprRdrgQWK0wQnpIbfwRjNHO1HWqvoQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"chalk": {
|
"chalk": {
|
||||||
|
|
@ -10130,12 +10362,6 @@
|
||||||
"to-regex-range": "^5.0.1"
|
"to-regex-range": "^5.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"get-stdin": {
|
|
||||||
"version": "8.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
|
|
||||||
"integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"global-modules": {
|
"global-modules": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
|
||||||
|
|
@ -10192,31 +10418,6 @@
|
||||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"lodash": {
|
|
||||||
"version": "4.17.20",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
|
||||||
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"meow": {
|
|
||||||
"version": "7.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz",
|
|
||||||
"integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@types/minimist": "^1.2.0",
|
|
||||||
"camelcase-keys": "^6.2.2",
|
|
||||||
"decamelize-keys": "^1.1.0",
|
|
||||||
"hard-rejection": "^2.1.0",
|
|
||||||
"minimist-options": "4.1.0",
|
|
||||||
"normalize-package-data": "^2.5.0",
|
|
||||||
"read-pkg-up": "^7.0.1",
|
|
||||||
"redent": "^3.0.0",
|
|
||||||
"trim-newlines": "^3.0.0",
|
|
||||||
"type-fest": "^0.13.1",
|
|
||||||
"yargs-parser": "^18.1.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"micromatch": {
|
"micromatch": {
|
||||||
"version": "4.0.2",
|
"version": "4.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
|
||||||
|
|
@ -10381,6 +10582,11 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"symbol-observable": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
|
||||||
|
},
|
||||||
"table": {
|
"table": {
|
||||||
"version": "5.4.6",
|
"version": "5.4.6",
|
||||||
"resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
|
"resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
|
||||||
|
|
@ -10413,9 +10619,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tailwindcss": {
|
"tailwindcss": {
|
||||||
"version": "1.7.6",
|
"version": "1.8.10",
|
||||||
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.7.6.tgz",
|
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.8.10.tgz",
|
||||||
"integrity": "sha512-focAhU3ciM1/UYBHQVKKzede4zC3y9+IHzU2N/ZF6mbZbhY8S96lOxrO2Y6LMU08+Dbh2xBLmO1bsioLk3Egig==",
|
"integrity": "sha512-7QkERG/cWCzsuMqHMwjOaLMVixOGLNBiXsrkssxlE1aWfkxVbGqiuMokR2162xRyaH2mBIHKxmlf1qb3DvIPqw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@fullhuman/postcss-purgecss": "^2.1.2",
|
"@fullhuman/postcss-purgecss": "^2.1.2",
|
||||||
|
|
@ -10426,6 +10632,7 @@
|
||||||
"color": "^3.1.2",
|
"color": "^3.1.2",
|
||||||
"detective": "^5.2.0",
|
"detective": "^5.2.0",
|
||||||
"fs-extra": "^8.0.0",
|
"fs-extra": "^8.0.0",
|
||||||
|
"html-tags": "^3.1.0",
|
||||||
"lodash": "^4.17.20",
|
"lodash": "^4.17.20",
|
||||||
"node-emoji": "^1.8.1",
|
"node-emoji": "^1.8.1",
|
||||||
"normalize.css": "^8.0.1",
|
"normalize.css": "^8.0.1",
|
||||||
|
|
@ -10439,20 +10646,12 @@
|
||||||
"pretty-hrtime": "^1.0.3",
|
"pretty-hrtime": "^1.0.3",
|
||||||
"reduce-css-calc": "^2.1.6",
|
"reduce-css-calc": "^2.1.6",
|
||||||
"resolve": "^1.14.2"
|
"resolve": "^1.14.2"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"lodash": {
|
|
||||||
"version": "4.17.20",
|
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
|
||||||
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"terser": {
|
"terser": {
|
||||||
"version": "5.3.0",
|
"version": "5.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/terser/-/terser-5.3.2.tgz",
|
||||||
"integrity": "sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg==",
|
"integrity": "sha512-H67sydwBz5jCUA32ZRL319ULu+Su1cAoZnnc+lXnenGRYWyLE3Scgkt8mNoAsMx0h5kdo758zdoS0LG9rYZXDQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"commander": "^2.20.0",
|
"commander": "^2.20.0",
|
||||||
|
|
@ -10641,9 +10840,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"typescript": {
|
"typescript": {
|
||||||
"version": "4.0.2",
|
"version": "4.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz",
|
||||||
"integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==",
|
"integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"uc.micro": {
|
"uc.micro": {
|
||||||
|
|
@ -11093,9 +11292,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"yargs": {
|
"yargs": {
|
||||||
"version": "15.3.1",
|
"version": "15.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
|
||||||
"integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
|
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"cliui": "^6.0.0",
|
"cliui": "^6.0.0",
|
||||||
|
|
@ -11108,7 +11307,7 @@
|
||||||
"string-width": "^4.2.0",
|
"string-width": "^4.2.0",
|
||||||
"which-module": "^2.0.0",
|
"which-module": "^2.0.0",
|
||||||
"y18n": "^4.0.0",
|
"y18n": "^4.0.0",
|
||||||
"yargs-parser": "^18.1.1"
|
"yargs-parser": "^18.1.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ansi-regex": {
|
"ansi-regex": {
|
||||||
|
|
@ -11153,14 +11352,6 @@
|
||||||
"requires": {
|
"requires": {
|
||||||
"camelcase": "^5.0.0",
|
"camelcase": "^5.0.0",
|
||||||
"decamelize": "^1.2.0"
|
"decamelize": "^1.2.0"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"camelcase": {
|
|
||||||
"version": "5.3.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
|
|
||||||
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
|
|
||||||
"dev": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
41
package.json
|
|
@ -24,56 +24,55 @@
|
||||||
"commit": "git-cz"
|
"commit": "git-cz"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@popperjs/core": "^2.4.4",
|
"@popperjs/core": "^2.5.3",
|
||||||
"codemirror": "^5.57.0",
|
"choices.js": "^9.0.1",
|
||||||
"prosemirror-example-setup": "^1.1.2",
|
"prosemirror-example-setup": "^1.1.2",
|
||||||
"prosemirror-markdown": "^1.5.0",
|
"prosemirror-markdown": "^1.5.0",
|
||||||
"prosemirror-state": "^1.3.3",
|
"prosemirror-state": "^1.3.3",
|
||||||
"prosemirror-view": "^1.15.6"
|
"prosemirror-view": "^1.16.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.11.6",
|
"@babel/core": "^7.11.6",
|
||||||
"@babel/plugin-proposal-class-properties": "^7.10.4",
|
"@babel/plugin-proposal-class-properties": "^7.10.4",
|
||||||
"@babel/preset-env": "^7.11.5",
|
"@babel/preset-env": "^7.11.5",
|
||||||
"@babel/preset-typescript": "^7.10.4",
|
"@babel/preset-typescript": "^7.10.4",
|
||||||
"@commitlint/cli": "^9.1.2",
|
"@commitlint/cli": "^11.0.0",
|
||||||
"@commitlint/config-conventional": "^9.1.2",
|
"@commitlint/config-conventional": "^11.0.0",
|
||||||
"@prettier/plugin-php": "^0.14.3",
|
"@prettier/plugin-php": "^0.14.3",
|
||||||
"@rollup/plugin-babel": "^5.2.0",
|
"@rollup/plugin-babel": "^5.2.1",
|
||||||
"@rollup/plugin-commonjs": "^15.0.0",
|
"@rollup/plugin-commonjs": "^15.1.0",
|
||||||
"@rollup/plugin-json": "^4.1.0",
|
"@rollup/plugin-json": "^4.1.0",
|
||||||
"@rollup/plugin-multi-entry": "^4.0.0",
|
"@rollup/plugin-multi-entry": "^4.0.0",
|
||||||
"@rollup/plugin-node-resolve": "^9.0.0",
|
"@rollup/plugin-node-resolve": "^9.0.0",
|
||||||
"@tailwindcss/custom-forms": "^0.2.1",
|
"@tailwindcss/custom-forms": "^0.2.1",
|
||||||
"@tailwindcss/typography": "^0.2.0",
|
"@tailwindcss/typography": "^0.2.0",
|
||||||
"@types/codemirror": "0.0.97",
|
|
||||||
"@types/prosemirror-markdown": "^1.0.3",
|
"@types/prosemirror-markdown": "^1.0.3",
|
||||||
"@types/prosemirror-view": "^1.15.1",
|
"@types/prosemirror-view": "^1.15.1",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.0.1",
|
"@typescript-eslint/eslint-plugin": "^4.3.0",
|
||||||
"@typescript-eslint/parser": "^4.0.1",
|
"@typescript-eslint/parser": "^4.3.0",
|
||||||
"cross-env": "^7.0.2",
|
"cross-env": "^7.0.2",
|
||||||
"cssnano": "^4.1.10",
|
"cssnano": "^4.1.10",
|
||||||
"cz-conventional-changelog": "^3.3.0",
|
"cz-conventional-changelog": "^3.3.0",
|
||||||
"eslint": "^7.8.1",
|
"eslint": "^7.10.0",
|
||||||
"eslint-config-prettier": "^6.11.0",
|
"eslint-config-prettier": "^6.12.0",
|
||||||
"eslint-plugin-prettier": "^3.1.4",
|
"eslint-plugin-prettier": "^3.1.4",
|
||||||
"husky": "^4.2.5",
|
"husky": "^4.3.0",
|
||||||
"lint-staged": "^10.3.0",
|
"lint-staged": "^10.4.0",
|
||||||
"postcss-cli": "^7.1.2",
|
"postcss-cli": "^8.0.0",
|
||||||
"postcss-import": "^12.0.1",
|
"postcss-import": "^12.0.1",
|
||||||
"postcss-preset-env": "^6.7.0",
|
"postcss-preset-env": "^6.7.0",
|
||||||
"prettier": "2.1.1",
|
"prettier": "2.1.2",
|
||||||
"prettier-plugin-organize-imports": "^1.1.1",
|
"prettier-plugin-organize-imports": "^1.1.1",
|
||||||
"rollup": "^2.26.10",
|
"rollup": "^2.28.2",
|
||||||
"rollup-plugin-multi-input": "^1.1.1",
|
"rollup-plugin-multi-input": "^1.1.1",
|
||||||
"rollup-plugin-node-polyfills": "^0.2.1",
|
"rollup-plugin-node-polyfills": "^0.2.1",
|
||||||
"rollup-plugin-postcss": "^3.1.8",
|
"rollup-plugin-postcss": "^3.1.8",
|
||||||
"rollup-plugin-terser": "^7.0.1",
|
"rollup-plugin-terser": "^7.0.2",
|
||||||
"stylelint": "^13.7.0",
|
"stylelint": "^13.7.2",
|
||||||
"stylelint-config-standard": "^20.0.0",
|
"stylelint-config-standard": "^20.0.0",
|
||||||
"svgo": "^1.3.2",
|
"svgo": "^1.3.2",
|
||||||
"tailwindcss": "^1.7.6",
|
"tailwindcss": "^1.8.10",
|
||||||
"typescript": "^4.0.2"
|
"typescript": "^4.0.3"
|
||||||
},
|
},
|
||||||
"husky": {
|
"husky": {
|
||||||
"hooks": {
|
"hooks": {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
purge: ["./app/Views/**/*.php", "./app/Views/**/*.ts"],
|
purge: [
|
||||||
theme: {
|
"./app/Views/**/*.php",
|
||||||
extend: {},
|
"./app/Views/**/*.ts",
|
||||||
},
|
"/app/Helpers/**/*.php",
|
||||||
|
],
|
||||||
|
theme: {},
|
||||||
variants: {
|
variants: {
|
||||||
textDecoration: ["responsive", "hover", "focus", "group-hover"],
|
textDecoration: ["responsive", "hover", "focus", "group-hover"],
|
||||||
},
|
},
|
||||||
|
|
@ -12,4 +14,8 @@ module.exports = {
|
||||||
require("@tailwindcss/custom-forms"),
|
require("@tailwindcss/custom-forms"),
|
||||||
require("@tailwindcss/typography"),
|
require("@tailwindcss/typography"),
|
||||||
],
|
],
|
||||||
|
future: {
|
||||||
|
removeDeprecatedGapUtilities: true,
|
||||||
|
purgeLayersByDefault: true,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||