Version 5.0.13

This commit is contained in:
Neo committed 2025-12-19 19:04:57 -08:00
1 parent b89858b2ff
commit 5efe744c5f
1407 files changed
+69690 -30177

No files matched your search

+87 -60
View File
@@ -22,6 +22,7 @@ use IPS\Helpers\Form\Icon;
use IPS\Helpers\Form\Number;
use IPS\Helpers\Form\Radio;
use IPS\Helpers\Form\YesNo;
use IPS\Member;
use IPS\Output;
use IPS\Theme;
use UnderflowException;
@@ -43,27 +44,42 @@ trait CustomBadge
/**
* Get the custom badge linked to this class
*
* @param string|null $identifier
* @return CustomBadgeClass|null
*/
public function getRecordBadge() : CustomBadgeClass|null
public function getRecordBadge( ?string $identifier=null ) : CustomBadgeClass|null
{
$class = get_called_class();
$idColumn = static::$databaseColumnId;
$key = $this->$idColumn . '.' . ( $identifier ?? '' );
if( !isset( static::$customBadgeStore[ $class ][ $this->$idColumn ] ) )
if( !isset( static::$customBadgeStore[ $class ][ $key ] ) )
{
try
{
$row = Db::i()->select( '*', 'core_custom_badges', [ 'class=? and active_record_id=?', $class, $this->$idColumn ] )->first();
static::$customBadgeStore[ $class ][ $this->$idColumn ] = CustomBadgeClass::constructFromData( $row );
$where = [
[ 'class=?', $class ],
[ 'active_record_id=?', $this->$idColumn ]
];
if( !empty( $identifier ) )
{
$where[] = [ 'extra=?', $identifier ];
}
else
{
$where[] = [ 'extra is null' ];
}
$row = Db::i()->select( '*', 'core_custom_badges', $where )->first();
static::$customBadgeStore[ $class ][ $key ] = CustomBadgeClass::constructFromData( $row );
}
catch( UnderflowException )
{
static::$customBadgeStore[ $class ][ $this->$idColumn ] = false;
static::$customBadgeStore[ $class ][ $key ] = false;
}
}
return static::$customBadgeStore[ $class ][ $this->$idColumn ] ?: null;
return static::$customBadgeStore[ $class ][ $key ] ?: null;
}
/**
@@ -71,84 +87,94 @@ trait CustomBadge
*
* @param Form $form
* @param CustomBadgeClass|null $badge
* @param string|null $badgeType
* @return void
*/
public function addBadgeFieldsToForm( Form $form, ?CustomBadgeClass $badge=null ) : void
public function addBadgeFieldsToForm( Form $form, ?CustomBadgeClass $badge=null, ?string $badgeType=null ) : void
{
$form->class .= " ipsBadgePicker--form";
$badgeType = $badgeType ?? 'custombadge';
$shapeToggles = ["custombadge_background", "custombadge_border"];
$dynamicShapeToggles = [ "custombadge_sides", "custombadge_rotation" ];
$shapeToggles = ["{$badgeType}_background", "{$badgeType}_border"];
$dynamicShapeToggles = [ "{$badgeType}_sides", "{$badgeType}_rotation" ];
$form->add( new YesNo(
"custombadge_use_custom",
"{$badgeType}_use_custom",
(bool) $badge,
true,
[
'togglesOff' => static::$customBadgeToggles ?? [],
'togglesOn' => [
"{$form->id}_header_badge_preview",
"custombadge_border",
"custombadge_foreground",
"custombadge_background",
"custombadge_shape",
"custombadge_icon",
"custombadge_sides",
"custombadge_rotation",
"custombadge_number_overlay",
"custombadge_icon_size",
'preview'
"{$form->id}_header_{$badgeType}_preview",
"{$badgeType}_preview",
"{$badgeType}_border",
"{$badgeType}_foreground",
"{$badgeType}_background",
"{$badgeType}_shape",
"{$badgeType}_icon",
"{$badgeType}_sides",
"{$badgeType}_rotation",
"{$badgeType}_number_overlay",
"{$badgeType}_icon_size"
]
]
));
$form->addHeader( 'custombadge_preview' );
$form->addHeader( $badgeType . '_preview' );
Member::loggedIn()->language()->words[ $badgeType . '_preview' ] = Member::loggedIn()->language()->get( 'custombadge_preview' );
Output::i()->jsFiles = array_merge( Output::i()->jsFiles, Output::i()->js( 'admin_badgepreview.js', 'core', 'admin' ) );
$form->addHtml( Theme::i()->getTemplate( 'achievements', 'core', 'admin' )->badgePreview( $badge ? $badge->raw : '' ) );
$form->addHtml( Theme::i()->getTemplate( 'achievements', 'core', 'admin' )->badgePreview( $badge ? $badge->raw : '', $badgeType ) );
$form->add( new Radio( "custombadge_shape", $badge ? $badge->shape : 'circle', null, ['options' => [
'square' => 'custombadge_square',
'circle' => 'custombadge_circle',
'ngon' => 'custombadge_n_gon',
'star' => 'custombadge_star',
'flower' => 'custombadge_flower',
"no_shape" => "custombadge_no_shape",
], 'toggles' => [
'ngon' => [...$dynamicShapeToggles, ...$shapeToggles],
'star' => [...$dynamicShapeToggles, ...$shapeToggles],
'flower' => [...$dynamicShapeToggles, ...$shapeToggles],
"square" => $shapeToggles,
"circle" => $shapeToggles
], 'rowClasses' => ['ipsFieldRow--badge-creator ipsFieldRow--badge-creator-shape']], null, null, null, "custombadge_shape") );
$form->add( new Icon( "custombadge_icon", ( $badge and $badge->icon ) ? [ $badge->icon ] : null, false, ['useSvgIcon' => true, 'rowClasses' => ['ipsFieldRow--badge-creator ipsFieldRow--badge-creator-icon']], null, null, null, "custombadge_icon" ) );
$formFields = [
'shape' => new Radio( "{$badgeType}_shape", $badge ? $badge->shape : 'circle', null, ['options' => [
'square' => 'custombadge_square',
'circle' => 'custombadge_circle',
'ngon' => 'custombadge_n_gon',
'star' => 'custombadge_star',
'flower' => 'custombadge_flower',
"no_shape" => "custombadge_no_shape",
], 'toggles' => [
'ngon' => [...$dynamicShapeToggles, ...$shapeToggles],
'star' => [...$dynamicShapeToggles, ...$shapeToggles],
'flower' => [...$dynamicShapeToggles, ...$shapeToggles],
"square" => $shapeToggles,
"circle" => $shapeToggles
], 'rowClasses' => ['ipsFieldRow--badge-creator ipsFieldRow--badge-creator-shape']], null, null, null, "{$badgeType}_shape"),
'icon' => new Icon( "{$badgeType}_icon", ( $badge and $badge->icon ) ? [ $badge->icon ] : null, false, ['useSvgIcon' => true, 'rowClasses' => ['ipsFieldRow--badge-creator ipsFieldRow--badge-creator-icon']], null, null, null, "{$badgeType}_icon" )
];
/* The overlay is optional */
if ( !isset( static::$customBadgeNumberOverlay ) or static::$customBadgeNumberOverlay )
{
$form->add( new Number( "custombadge_number_overlay", ( $badge and $badge->number_overlay ) ? $badge->number_overlay : 0, false, [ 'step' => 1, 'min' => 1, 'max' => 999, 'unlimited' => 0, 'unlimitedLang' => 'none', 'rowClasses' => ['ipsFieldRow--badge-creator'] ], null, null, null, "custombadge_number_overlay" ) );
$formFields['number_overlay'] = new Number( "{$badgeType}_number_overlay", ( $badge and $badge->number_overlay ) ? $badge->number_overlay : 0, false, [ 'step' => 1, 'min' => 1, 'max' => 999, 'unlimited' => 0, 'unlimitedLang' => 'none', 'rowClasses' => ['ipsFieldRow--badge-creator'] ], null, null, null, "{$badgeType}_number_overlay" );
}
$form->add( new Color( "custombadge_background", $badge ? $badge->background : '#eeb95f', null, ['rowClasses' => ['ipsFieldRow--badge-creator ipsFieldRow--badge-creator-background']], null, null, null, "custombadge_background" ) );
$form->add( new Color( "custombadge_border", $badge ? $badge->border : '#f7d36f', null, ['rowClasses' => ['ipsFieldRow--badge-creator ipsFieldRow--badge-creator-border']], null, null, null, "custombadge_border" ) );
$form->add( new Color( "custombadge_foreground", $badge ? $badge->foreground : '#ffffff', null, ['rgba' => true, 'swatches' => true, 'rowClasses' => ['ipsFieldRow--badge-creator ipsFieldRow--badge-creator-foreground']], null, null, null, "custombadge_foreground" ) );
$formFields['background'] = new Color( "{$badgeType}_background", $badge ? $badge->background : '#eeb95f', null, ['rowClasses' => ['ipsFieldRow--badge-creator ipsFieldRow--badge-creator-background']], null, null, null, "{$badgeType}_background" );
$formFields['border'] = new Color( "{$badgeType}_border", $badge ? $badge->border : '#f7d36f', null, ['rowClasses' => ['ipsFieldRow--badge-creator ipsFieldRow--badge-creator-border']], null, null, null, "{$badgeType}_border" );
$formFields['foreground'] = new Color( "{$badgeType}_foreground", $badge ? $badge->foreground : '#ffffff', null, ['rgba' => true, 'swatches' => true, 'rowClasses' => ['ipsFieldRow--badge-creator ipsFieldRow--badge-creator-foreground']], null, null, null, "{$badgeType}_foreground" );
$formFields['icon_size'] = new Form\Number( "{$badgeType}_icon_size", $badge ? $badge->icon_size : 3, null, ["min" => 1, "max" => 5, "step" => 1, "range" => true, "rowClasses" => ['ipsFieldRow--badge-creator', 'ipsFieldRow--badge-creator-icon-size']], id: "{$badgeType}_icon_size" );
$formFields['sides'] = new Number( "{$badgeType}_sides", $badge ? $badge->sides : 5, null, ['step' => 1, 'min' => 4, 'max' => 12, 'range' => true, 'rowClasses' => ['ipsFieldRow--badge-creator']], null, null, null, "{$badgeType}_sides" );
$formFields['rotation'] = new Number( "{$badgeType}_rotation", $badge?->rotation, null, ['step' => 1, 'min' => 0, 'max' => 90, 'range' => true, 'rowClasses' => ['ipsFieldRow--badge-creator']], null, null, null, "{$badgeType}_rotation" );
$form->add( new Form\Number( "custombadge_icon_size", $badge ? $badge->icon_size : 3, null, ["min" => 1, "max" => 5, "step" => 1, "range" => true, "rowClasses" => ['ipsFieldRow--badge-creator', 'ipsFieldRow--badge-creator-icon-size']], id: "custombadge_icon_size" ) );
$form->add( new Number( "custombadge_sides", $badge ? $badge->sides : 5, null, ['step' => 1, 'min' => 4, 'max' => 12, 'range' => true, 'rowClasses' => ['ipsFieldRow--badge-creator']], null, null, null, "custombadge_sides" ) );
$form->add( new Number( "custombadge_rotation", $badge?->rotation, null, ['step' => 1, 'min' => 0, 'max' => 90, 'range' => true, 'rowClasses' => ['ipsFieldRow--badge-creator']], null, null, null, "custombadge_rotation" ) );
foreach( $formFields as $k => $v )
{
$v->label = Member::loggedIn()->language()->addToStack( 'custombadge_' . $k );
$form->add( $v );
}
}
/**
* @param array $values
* @param string|null $badgeType
* @return void
*/
public function saveRecordBadge( array &$values ) : void
public function saveRecordBadge( array &$values, ?string $badgeType=null ) : void
{
$badge = $this->getRecordBadge();
$badge = $this->getRecordBadge( $badgeType );
$prefix = $badgeType ?? 'custombadge';
/* Are we using a badge? */
if( $values['custombadge_use_custom'] )
if( $values[ $prefix . '_use_custom'] )
{
if( $badge === null )
{
@@ -159,15 +185,16 @@ trait CustomBadge
$badge->active_record_id = $this->$idColumn;
}
$badge->shape = $values['custombadge_shape'];
$badge->foreground = $values['custombadge_foreground'];
$badge->background = $values['custombadge_background'];
$badge->border = $values['custombadge_border'];
$badge->icon = $values['custombadge_icon'][0] ?? null;
$badge->rotation = $values['custombadge_rotation'];
$badge->sides = $values['custombadge_sides'];
$badge->number_overlay = $values['custombadge_number_overlay'] ?? 0;
$badge->icon_size = $values['custombadge_icon_size'] ?? 3;
$badge->shape = $values[ $prefix . '_shape'];
$badge->foreground = $values[ $prefix . '_foreground'];
$badge->background = $values[ $prefix . '_background'];
$badge->border = $values[ $prefix . '_border'];
$badge->icon = $values[ $prefix . '_icon'][0] ?? null;
$badge->rotation = $values[ $prefix . '_rotation'];
$badge->sides = $values[ $prefix . '_sides'];
$badge->number_overlay = $values[ $prefix . '_number_overlay'] ?? 0;
$badge->icon_size = $values[ $prefix . '_icon_size'] ?? 3;
$badge->extra = $badgeType ?? null;
$badge->save();
}
elseif( $badge !== null )
@@ -179,7 +206,7 @@ trait CustomBadge
/* Clear the form fields */
foreach ( ['shape', 'foreground', 'background', 'border', 'icon', 'rotation', 'sides', 'number_overlay', 'use_custom', 'icon_size'] as $key )
{
unset( $values["custombadge_{$key}"] );
unset( $values[ "{$prefix}_{$key}" ] );
}
}
}