mirror of
https://code.castopod.org/adaures/castopod.git
synced 2024-09-07 03:09:20 +02:00
Apple podcasts requires a category to submit a valid podcast RSS feed. The "uncategorized" category is not a valid category.
259 lines
8.1 KiB
PHP
259 lines
8.1 KiB
PHP
<?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<string, string> $attributes Additional attributes
|
|
*/
|
|
function form_section(
|
|
string $title = '',
|
|
string $subtitle = '',
|
|
array $attributes = [],
|
|
string $customSubtitleClass = ''
|
|
): string {
|
|
$subtitleClass = 'text-sm text-gray-600';
|
|
if ($customSubtitleClass !== '') {
|
|
$subtitleClass = $customSubtitleClass;
|
|
}
|
|
|
|
$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="' .
|
|
$subtitleClass .
|
|
'">' .
|
|
$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
|
|
*/
|
|
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 mixed[] $data
|
|
* @param mixed[] $extra
|
|
*/
|
|
function form_switch(
|
|
string $label = '',
|
|
array $data = [],
|
|
string $value = '',
|
|
bool $checked = false,
|
|
string $class = '',
|
|
array $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 $text The text to appear onscreen
|
|
* @param string $id The id the label applies to
|
|
* @param array<string, string> $attributes Additional attributes
|
|
* @param string $hintText Hint text to add next to the label
|
|
* @param boolean $isOptional adds an optional text if true
|
|
*/
|
|
function form_label(
|
|
string $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 . '"';
|
|
}
|
|
}
|
|
|
|
$labelContent = $text;
|
|
if ($isOptional) {
|
|
$labelContent .=
|
|
'<small class="ml-1 lowercase">(' .
|
|
lang('Common.optional') .
|
|
')</small>';
|
|
}
|
|
|
|
if ($hintText !== '') {
|
|
$labelContent .= hint_tooltip($hintText, 'ml-1');
|
|
}
|
|
|
|
return $label . '>' . $labelContent . '</label>';
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
if (! function_exists('form_multiselect')) {
|
|
/**
|
|
* Multi-select menu
|
|
*
|
|
* @param array<string, string> $options
|
|
* @param string[] $selected
|
|
* @param array<string, string> $customExtra
|
|
*/
|
|
function form_multiselect(
|
|
string $name = '',
|
|
array $options = [],
|
|
array $selected = [],
|
|
array $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);
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
if (! function_exists('form_dropdown')) {
|
|
/**
|
|
* Drop-down Menu (based on html select tag)
|
|
*
|
|
* @param array<string, mixed>|string $data
|
|
* @param array<string, string> $options
|
|
* @param string|string[] $selected
|
|
* @param array<string, mixed>|string $extra
|
|
*/
|
|
function form_dropdown(
|
|
string | array $data = '',
|
|
array $options = [],
|
|
string | array $selected = [],
|
|
string | array $extra = ''
|
|
): string {
|
|
$defaults = [];
|
|
if (is_array($data)) {
|
|
if (isset($data['selected'])) {
|
|
$selected = $data['selected'];
|
|
unset($data['selected']); // select tags don't have a selected attribute
|
|
}
|
|
if (isset($data['options'])) {
|
|
$options = $data['options'];
|
|
unset($data['options']); // select tags don't use an options attribute
|
|
}
|
|
} else {
|
|
$defaults = [
|
|
'name' => $data,
|
|
];
|
|
}
|
|
|
|
if (! is_array($selected)) {
|
|
$selected = [$selected];
|
|
}
|
|
if (! is_array($options)) {
|
|
$options = [$options];
|
|
}
|
|
|
|
// standardize selected as strings, like the option keys will be.
|
|
foreach ($selected as $key => $item) {
|
|
$selected[$key] = (string) $item;
|
|
}
|
|
|
|
$placeholderOption = '';
|
|
if (isset($extra['placeholder'])) {
|
|
$placeholderOption = '<option value="" disabled="disabled" hidden="hidden"' . (in_array(
|
|
'',
|
|
$selected,
|
|
true
|
|
) ? ' selected="selected"' : '') . '>' . $extra['placeholder'] . '</option>';
|
|
unset($extra['placeholder']);
|
|
}
|
|
|
|
$extra = stringify_attributes($extra);
|
|
$multiple = (count($selected) > 1 && stripos($extra, 'multiple') === false) ? ' multiple="multiple"' : '';
|
|
$form = '<select ' . rtrim(parse_form_attributes($data, $defaults)) . $extra . $multiple . ">\n";
|
|
$form .= $placeholderOption;
|
|
|
|
foreach ($options as $key => $val) {
|
|
$key = (string) $key;
|
|
if (is_array($val)) {
|
|
if ($val === []) {
|
|
continue;
|
|
}
|
|
$form .= '<optgroup label="' . $key . "\">\n";
|
|
foreach ($val as $optgroupKey => $optgroupVal) {
|
|
$sel = in_array($optgroupKey, $selected, true) ? ' selected="selected"' : '';
|
|
$form .= '<option value="' . htmlspecialchars($optgroupKey) . '"' . $sel . '>'
|
|
. $optgroupVal . "</option>\n";
|
|
}
|
|
$form .= "</optgroup>\n";
|
|
} else {
|
|
$form .= '<option value="' . htmlspecialchars($key) . '"'
|
|
. (in_array($key, $selected, true) ? ' selected="selected"' : '') . '>'
|
|
. $val . "</option>\n";
|
|
}
|
|
}
|
|
|
|
return $form . "</select>\n";
|
|
}
|
|
}
|
|
|
|
// ------------------------------------------------------------------------
|