ldc-volena/app/Models/Section.php
2023-11-16 09:42:21 +01:00

525 lines
14 KiB
PHP

<?php
namespace App\Models;
use App\Enums\InputType;
use App\Enums\Sections\PageSectionEnum;
use App\Lib\Helpers\FileStorageHelper;
use App\Lib\Helpers\ToolboxHelper;
use App\Traits\Models\MiniCrudModel;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
/**
* @property App\Enums\Sections\PageSectionEnum $section Slider that contains the slide.
* @property string $h2_title Title.
* @property string $text WYSIWYG - Content.
* @property string $data Minicrud content.
* @property-read \Carbon\Carbon $created_at Created date.
* @property-read \Carbon\Carbon $updated_at Updated date.
*/
class Section extends Model
{
use HasFactory;
use MiniCrudModel;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'section',
'h2_title',
'text',
'data',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'section' => \App\Enums\Sections\PageSectionEnum::class,
'data' => 'object',
];
/**
* Perform any actions required after the model boots.
*
* @return void
*/
protected static function booted(): void
{
static::creating(function () {
throw new \RuntimeException("Creating a new section is not authorized");
});
static::updating(function (self $model) {
// * ASSERTIONS
ToolboxHelper::assertNoInternalBoUrls('data', $model->data);
// * TRANSFORMATIONS
$model->data = FileStorageHelper::storeModelFilesFromHtml($model, $model->data);
});
static::updated(function (self $model) {
FileStorageHelper::removeOldModelFilesFromHtml(
$model->data,
ToolboxHelper::getOriginal($model, 'data')
);
});
static::deleting(function () {
throw new \RuntimeException('Deleting a section is not authorized');
});
}
// * METHODS
/**
* Manage model fields.
*
* @param self $model
* @return void
*/
private static function manageFields(self $model): void
{
$model->picture = FileStorageHelper::storeFile($model, $model->picture, true);
}
/**
* Get MiniCrud bloc for home_missions section.
*
* @param array $data
* @param string $img
* @param string $imgAlt
* @param string $imgTitle
* @param integer $width
* @param integer $height
* @param string $url
* @param integer $keyValueSites
* @param integer $keyValueJobs
* @return array
*/
public static function getHomeMissionsBloc(
array $data,
string $img,
string $imgAlt,
string $imgTitle,
int $width,
int $height,
string $url,
int $keyValueSites,
int $keyValueJobs
): array {
$data = self::emptyPictureBloc($data, $img, $imgAlt, $imgTitle, $width, $height);
$data = self::emptyPictureLinkBloc($data, $url);
$data = self::emptyKeyNumberBloc($data, 'sites', $keyValueSites);
$data = self::emptyKeyNumberBloc($data, 'métiers', $keyValueJobs);
return $data;
}
/**
* Get MiniCrud bloc for home_ambition section.
*
* @param array $data
* @return array
*/
public static function getHomeAmbitionBloc(array $data): array
{
return self::emptyButtonBooleanBloc($data, 'On se Dévoile');
}
/**
* Get MiniCrud bloc for home_team section.
*
* @param array $data
* @param string $img
* @param string $imgAlt
* @param string $imgTitle
* @param integer $width
* @param integer $height
* @param string $url
* @return array
*/
public static function getHomeTeamBloc(
array $data,
string $img,
string $imgAlt,
string $imgTitle,
int $width,
int $height,
string $url
): array {
$data = self::emptyPictureBloc($data, $img, $imgAlt, $imgTitle, $width, $height);
$data = self::emptyPictureLinkBloc($data, $url);
$data = self::emptyButtonBooleanBloc($data, 'On Embauche');
return $data;
}
/**
* Get MiniCrud bloc for home_life section.
*
* @param array $data
* @return array
*/
public static function getHomeLifeBloc(array $data): array
{
return self::emptyButtonBooleanBloc($data, 'On Embauche');
}
/**
* Get MiniCrud bloc for unveil_pole section.
*
* @param array $data
* @param integer $keyValueSites
* @param integer $keyValueSpecies
* @param integer $keyValueCa
* @param integer $keyValueEmployees
* @return array
*/
public static function getUnveilPoleBloc(
array $data,
int $keyValueSites,
int $keyValueSpecies,
int $keyValueCa,
int $keyValueEmployees
): array {
$data = self::emptyKeyNumberBloc($data, 'sites', $keyValueSites);
$data = self::emptyKeyNumberBloc($data, 'espèces', $keyValueSpecies);
$data = self::emptyKeyNumberBloc($data, 'ca', $keyValueCa);
$data = self::emptyKeyNumberBloc($data, 'collaborateurs', $keyValueEmployees);
return $data;
}
/**
* Get MiniCrud bloc for hire_grow section.
*
* @param array $data
* @param string $title
* @return array
*/
public static function getHireGrowBloc(array $data, string $title): array
{
return self::emptyH3Bloc($data, PageSectionEnum::hire_grow->label(), $title);
}
/**
* Get MiniCrud bloc for hire_parity section.
*
* @param array $data
* @param string $img
* @param string $imgAlt
* @param string $imgTitle
* @param integer $width
* @param integer $height
* @return array
*/
public static function getHireParityBloc(
array $data,
string $img,
string $imgAlt,
string $imgTitle,
int $width,
int $height
): array {
$data = self::emptyButtonBooleanBloc($data, 'On Bouge Ensemble');
$data = self::emptyPictureBloc($data, $img, $imgAlt, $imgTitle, $width, $height, true);
return $data;
}
/**
* Get MiniCrud bloc for commit_breeding section.
*
* @param array $data
* @param string $img
* @param string $imgAlt
* @param string $imgTitle
* @param integer $width
* @param integer $height
* @return array
*/
public static function getCommitBreedingBloc(
array $data,
string $img,
string $imgAlt,
string $imgTitle,
int $width,
int $height
): array {
$data = self::emptyButtonBooleanBloc($data, 'On Témoigne - engagements');
$data = self::emptyPictureBloc($data, $img, $imgAlt, $imgTitle, $width, $height, true);
return $data;
}
/**
* Get MiniCrud bloc for commit_living section.
*
* @param array $data
* @param string $content
* @return array
*/
public static function getCommitLivingBloc(array $data, string $content): array
{
$data = self::emptyButtonBooleanBloc($data, 'On Témoigne - engagements');
$data = self::emptyWysiwygBloc($data, 'second', $content, true);
$data = self::emptyButtonBooleanBloc($data, 'On Bouge');
return $data;
}
/**
* Get MiniCrud bloc for commit_respect_earth section.
*
* @param array $data
* @param string $content
* @return array
*/
public static function getCommitRespectEarthBloc(array $data, string $content): array
{
$data = self::emptyButtonBooleanBloc($data, 'On Témoigne - engagements');
$data = self::emptyWysiwygBloc($data, 'second', $content, true);
return $data;
}
/**
* Get MiniCrud bloc for commit_feed section.
*
* @param array $data
* @param string $content
* @param string $secondContent
* @return array
*/
public static function getCommitFeedBloc(array $data, string $content, string $secondContent): array
{
$data = self::emptyButtonBooleanBloc($data, 'On Témoigne - engagements');
$data = self::emptyWysiwygBloc($data, 'second', $content, true);
$data = self::emptyButtonBooleanBloc($data, 'On Produit');
$data = self::emptyWysiwygBloc($data, 'third', $secondContent, true);
return $data;
}
/**
* Get MiniCrud bloc for commit_commitments section.
*
* @param array $data
* @param string $firstTitle
* @param string $secondTitle
* @return array
*/
public static function getCommitCommitmentsBloc(array $data, string $firstTitle, string $secondTitle): array
{
$data = self::emptyH3Bloc($data, 'Premier', $firstTitle);
$data = self::emptyH3Bloc($data, 'Second', $secondTitle);
return $data;
}
/**
* Get MiniCrud bloc for move_commitments section.
*
* @param array $data
* @return array
*/
public static function getMoveCommitmentsBloc(array $data): array
{
return self::emptyButtonBooleanBloc($data, 'On Témoigne - engagements');
}
/**
* Get MiniCrud bloc for produce_linking section.
*
* @param array $data
* @param string $content
* @param string $secondContent
* @return array
*/
public static function getProduceLinkingBloc(array $data, string $content, string $secondContent): array
{
$data = self::emptyWysiwygBloc($data, 'second', $content);
$data = self::emptyButtonBooleanBloc($data, 'On vous écoute');
$data = self::emptyWysiwygBloc($data, 'third', $secondContent);
$data = self::emptyButtonBooleanBloc($data, 'On se Dévoile');
return $data;
}
/**
* Empty bloc for picture.
*
* @param array $data
* @param string $img
* @param string $imgAlt
* @param string $imgTitle
* @param integer $width
* @param integer $height
* @param boolean $required
* @return array
*/
private static function emptyPictureBloc(
array $data,
string $img = '',
string $imgAlt = '',
string $imgTitle = '',
int $width = 100,
int $height = 100,
bool $required = false,
) {
$data["bloc_image"] = [
'label' => "Image",
'dimensions' => ['width' => $width, 'height' => $height],
'inputType' => InputType::image->value,
'alt' => $imgAlt,
'title' => $imgTitle,
'value' => $img,
'validate' => $required ? 'required' : 'nullable',
'required' => $required
];
return $data;
}
/**
* Empty bloc for link associated to the picture.
*
* @param array $data
* @param string $url
* @param boolean $required
* @return array
*/
private static function emptyPictureLinkBloc(
array $data,
string $url = '',
bool $required = false,
) {
$data["bloc_image_link"] = [
'label' => "URL à ouvrir",
'inputType' => InputType::url->value,
'value' => $url,
'validate' => $required ? 'required' : 'nullable',
'required' => $required
];
$data["bloc_image_link_new_tab"] = [
'label' => "Ouvrir dans un nouvel onglet",
'inputType' => InputType::boolean->value,
];
return $data;
}
/**
* Empty bloc for key numbers.
*
* @param array $data
* @param string $name
* @param integer $value
* @param boolean $required
*
* @return array
*/
private static function emptyKeyNumberBloc(
array $data,
string $name,
int $value = 0,
bool $required = false,
) {
$snakeCaseName = Str::of($name)->snake()->ascii()->remove(['\'', '-']);
$data['bloc_key_' . $snakeCaseName] = [
'label' => "Chiffre clé {$name}",
'inputType' => InputType::number->value,
'value' => $value,
'validate' => $required ? 'required' : 'nullable',
'required' => $required
];
return $data;
}
/**
* Empty bloc for the button boolean.
*
* @param array $data
* @param string $name
* @return array
*/
private static function emptyButtonBooleanBloc(
array $data,
string $name
) {
$snakeCaseName = Str::of($name)->snake()->ascii()->remove(['\'', '-']);
$data["bloc_button_{$snakeCaseName}"] = [
'label' => "Afficher le bouton {$name} ?",
'inputType' => InputType::boolean->value,
];
return $data;
}
/**
* Empty bloc for the h3 title.
*
* @param array $data
* @param string $name
* @param string $value
* @param boolean $required
* @return array
*/
private static function emptyH3Bloc(
array $data,
string $name,
string $value = '',
bool $required = false
) {
$snakeCaseName = Str::of($name)->snake()->ascii()->remove(['\'', '-']);
$data["bloc_h3_{$snakeCaseName}"] = [
'label' => "Titre de la section {$name}",
'inputType' => InputType::string->value,
'validate' => $required ? 'required' : 'nullable',
'value' => $value,
'required' => $required
];
return $data;
}
/**
* Empty bloc for the WYSIWYG content.
*
* @param array $data
* @param string $name
* @param string $value
* @param boolean $advanced
* @param boolean $required
* @return array
*/
private static function emptyWysiwygBloc(
array $data,
string $name,
string $value = '',
bool $advanced = false,
bool $required = false
) {
$snakeCaseName = Str::of($name)->snake()->ascii()->remove(['\'', '-'])->remove(['\'', '-']);
$data["bloc_{$snakeCaseName}_content"] = [
'label' => "Titre de la section {$name}",
'inputType' => InputType::text->value,
'validate' => $required ? 'required' : 'nullable',
'value' => $value,
'advanced' => $advanced,
'required' => $required
];
return $data;
}
}