Skip to content

Commit c90158a

Browse files
committed
Merge branch 'develop'
* develop: Fix styling update exporter, export templates+fields+content for DocumentType Bugfix: have error onrender if content have ogImage add config to allow skip authorizstion for super admin Bugfix: only can select all permission while creating new role
2 parents 6469b47 + bf77f00 commit c90158a

10 files changed

Lines changed: 220 additions & 94 deletions

File tree

config/inspirecms.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@
3333
* The number of minutes to lock the user out for after the maximum number of failed login attempts is reached.
3434
*/
3535
'lockout_duration' => 120,
36+
37+
/**
38+
* Skip authentication for super admin users.
39+
*
40+
* Allowed values: before, after, none
41+
*/
42+
'skip_super_admin_check' => 'before',
3643
],
3744

3845
'avatar' => [

src/Base/TemplateManager.php

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public function getComponentPathWithTheme(?string $componentName = null, ?string
7777
}
7878

7979
if (filled($componentName)) {
80-
$path .= '/' . $this->ensureViewFileName($componentName);
80+
$path .= '/' . TemplateHelper::ensureViewFileNameForTemplate($componentName);
8181
}
8282

8383
return $path;
@@ -173,25 +173,6 @@ public function exportTemplate($template, ?string $theme = null): void
173173
}
174174
}
175175

176-
private static function ensureTemplateFileBaseName(string $slug): string
177-
{
178-
return str($slug)
179-
->trim()->trim('.')->trim('/')
180-
->snake()
181-
->replace(['-', ' '], '-')
182-
->toString();
183-
}
184-
185-
private static function ensureViewFileName(string $name)
186-
{
187-
return str($name)
188-
->trim()
189-
->replace('.', '/')
190-
->trim('/')
191-
->finish('.blade.php')
192-
->toString();
193-
}
194-
195176
private function loadCurrentTheme()
196177
{
197178
if ($this->theme) {

src/CmsPanelProvider.php

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,20 @@ public function panel(Panel $panel): Panel
9696
])
9797
->bootUsing(function () {
9898

99-
// Gate for super admin
100-
Gate::before(function ($user, $ability) {
101-
if ($user && is_inspirecms_user($user) && $user->isSuperAdmin()) {
102-
return true;
103-
}
104-
});
105-
99+
$skipSuperAdminCheck = InspireCmsConfig::get('auth.skip_super_admin_check');
100+
if ($skipSuperAdminCheck == 'before') {
101+
Gate::before(function ($user, $ability) {
102+
if ($user && is_inspirecms_user($user) && $user->isSuperAdmin()) {
103+
return true;
104+
}
105+
});
106+
} elseif ($skipSuperAdminCheck == 'after') {
107+
Gate::after(function ($user, $ability) {
108+
if ($user && is_inspirecms_user($user) && $user->isSuperAdmin()) {
109+
return true;
110+
}
111+
});
112+
}
106113
});
107114

108115
$this->configurePlugins($panel);

src/Dtos/SeoDto.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ public function __toString(): string
273273
$html .= "<meta property=\"og:description\" content=\"{$this->ogDescription}\">\n";
274274
}
275275

276-
if ($this->ogImage && ($mediaAssetUrl = inspirecms_asset()->getAssetUrl($this->ogImage))) {
276+
if ($this->ogImage && ($mediaAssetUrl = inspirecms_asset()->findByKey($this->ogImage)?->getUrl())) {
277277
$html .= "<meta property=\"og:image\" content=\"{$mediaAssetUrl}\">\n";
278278
}
279279

src/Exports/Exporters/BaseExporter.php

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
use Illuminate\Support\Str;
77
use SolutionForest\InspireCms\Exports\ExportResult;
88
use SolutionForest\InspireCms\Helpers\FileHelper;
9+
use SolutionForest\InspireCms\Helpers\TemplateHelper;
910
use SolutionForest\InspireCms\ImportData\Entities as ImportDataEntities;
11+
use SolutionForest\InspireCms\Models\Contracts\Content;
1012
use SolutionForest\InspireCms\Models\Contracts\DocumentType;
1113
use SolutionForest\InspireCms\Models\Contracts\Export;
1214
use SolutionForest\InspireCms\Models\Contracts\FieldGroup;
@@ -101,34 +103,44 @@ protected function ensureTempFolderForExport(string $folderPrefix, array $subFol
101103
return array_merge([$folderName], $tmpFolderData);
102104
}
103105

106+
/**
107+
* @return string | array
108+
*/
104109
protected function generateImportFileName(Model $record)
105110
{
106111
switch (true) {
112+
107113
case $record instanceof DocumentType:
114+
case $record instanceof Content:
108115
return $record->slug . '.json';
109116

110117
case $record instanceof FieldGroup:
111118
return Str::replace('_', '-', $record->name) . '.json';
112119

113-
// case $record instanceof Template:
114-
// if (is_array($record->content)) {
115-
// $themes = array_keys($record->content);
116-
// } else {
117-
// $themes = [inspirecms_templates()->getCurrentTheme()];
118-
// }
119-
// return collect($themes)
120-
// ->filter()
121-
// ->unique()
122-
// ->map(fn ($theme) => $record->slug . '/' . "$theme.blade.php")
123-
// ->toArray();
120+
case $record instanceof Template:
121+
if (is_array($record->content)) {
122+
$themes = array_keys($record->content);
123+
} else {
124+
$themes = [inspirecms_templates()->getCurrentTheme()];
125+
}
126+
127+
return collect($themes)
128+
->filter()
129+
->unique()
130+
->mapWithKeys(fn ($theme) => [$theme => $record->slug . '/' . TemplateHelper::ensureViewFileNameForTemplate($theme)])
131+
->toArray();
124132
}
125133

126134
return $record->getKey() . '.json';
127135
}
128136

137+
/**
138+
* @return array|bool|string
139+
*/
129140
protected function prepareImportContentFromModel(Model $record)
130141
{
131142
switch (true) {
143+
132144
case $record instanceof DocumentType:
133145
$array = ImportDataEntities\DocumentType::fromRecord($record)->toExportArray();
134146

@@ -145,6 +157,11 @@ protected function prepareImportContentFromModel(Model $record)
145157
// $themeContent = [inspirecms_templates()->getCurrentTheme() => $themeContent];
146158
// }
147159
// return $themeContent;
160+
161+
case $record instanceof Content:
162+
$array = ImportDataEntities\Content::fromRecord($record)->toExportArray();
163+
164+
return json_encode($array, JSON_PRETTY_PRINT);
148165
}
149166

150167
return '';
@@ -182,15 +199,39 @@ protected function handleExportCompletion(string $folderName, $processingErrors)
182199
protected function processRecordForImportUsed(Model $record, $fs, ?string $dir, array &$errors)
183200
{
184201
try {
185-
$content = $this->prepareImportContentFromModel($record);
202+
186203
$filename = $this->generateImportFileName($record);
187-
$path = $dir . '/' . $filename;
188204

189-
$fs->put($path, $content);
205+
if ($record instanceof Template && is_array($filename)) {
206+
207+
foreach ($filename as $theme => $templateFilePath) {
208+
209+
$templateContent = $record->getContent($theme);
210+
211+
$path = $dir . '/' . trim($templateFilePath, '/');
212+
213+
$fs->put($path, $templateContent);
214+
}
215+
216+
} elseif (! is_string($filename)) {
217+
$errors[] = [
218+
'record' => $record->getKey(),
219+
'model' => get_class($record),
220+
'message' => 'Invalid filename',
221+
];
222+
} else {
223+
224+
$content = $this->prepareImportContentFromModel($record);
225+
226+
$path = $dir . '/' . $filename;
227+
$fs->put($path, $content);
228+
229+
}
190230

191231
} catch (\Throwable $th) {
192232
$errors[] = [
193233
'record' => $record->getKey(),
234+
'model' => get_class($record),
194235
'message' => $th->getMessage(),
195236
];
196237
}

src/Exports/Exporters/DocumentTypeExporter.php

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace SolutionForest\InspireCms\Exports\Exporters;
44

55
use Filament\Forms\Components\CheckboxList;
6+
use Filament\Forms\Components\Toggle;
67
use Illuminate\Support\Arr;
78
use SolutionForest\InspireCms\Exports\ExportResult;
89
use SolutionForest\InspireCms\Helpers\ImportDataHelper;
@@ -17,6 +18,10 @@ public static function getArgsFormFields(): array
1718
$descriptions = $records->map(fn ($record) => $record->slug)->all();
1819

1920
return [
21+
Toggle::make('with_content')
22+
->label('With Content')
23+
->hint('Export content records along with document types')
24+
->default(true),
2025
CheckboxList::make('filter_record')
2126
->label('Filter Records')
2227
->hint('Keep empty to export all records.')
@@ -32,6 +37,9 @@ public function export()
3237
{
3338
[$folderName, $fs, $fullPath, $subFolders] = $this->ensureTempFolderForExport('export-document-types', [
3439
ImportDataHelper::FOLDER_IDENTIFIER_DOCUMENTTYPE,
40+
ImportDataHelper::FOLDER_IDENTIFIER_FIELDGROUP,
41+
ImportDataHelper::FOLDER_IDENTIFIER_TEMPLATE,
42+
ImportDataHelper::FOLDER_IDENTIFIER_CONTENT,
3543
]);
3644

3745
[$records, $perPage, $page] = $this->getDocumentTypeRecords();
@@ -42,9 +50,40 @@ public function export()
4250
$this->processRecordForImportUsed(
4351
$record,
4452
$fs,
45-
(Arr::first($subFolders) ?? $folderName),
53+
(Arr::get($subFolders, ImportDataHelper::FOLDER_IDENTIFIER_DOCUMENTTYPE) ?? $folderName),
4654
$errors,
4755
);
56+
57+
foreach ($record->fieldGroups as $fieldGroup) {
58+
59+
$this->processRecordForImportUsed(
60+
$fieldGroup,
61+
$fs,
62+
(Arr::get($subFolders, ImportDataHelper::FOLDER_IDENTIFIER_FIELDGROUP) ?? $folderName),
63+
$errors,
64+
);
65+
}
66+
67+
foreach ($record->templates as $template) {
68+
69+
$this->processRecordForImportUsed(
70+
$template,
71+
$fs,
72+
(Arr::get($subFolders, ImportDataHelper::FOLDER_IDENTIFIER_TEMPLATE) ?? $folderName),
73+
$errors,
74+
);
75+
}
76+
77+
foreach ($record->content as $content) {
78+
79+
$this->processRecordForImportUsed(
80+
$content,
81+
$fs,
82+
(Arr::get($subFolders, ImportDataHelper::FOLDER_IDENTIFIER_CONTENT) ?? $folderName),
83+
$errors,
84+
);
85+
}
86+
4887
}
4988

5089
$processingErrors = array_merge(
@@ -72,7 +111,21 @@ private function getDocumentTypeRecords()
72111

73112
$args = $this->record->getArgsForExporter();
74113

75-
$query = static::getModel()::query()->with(['fieldGroups', 'templates', 'allowedDocumentTypes']);
114+
$relations = [
115+
'fieldGroups',
116+
'templates',
117+
'allowedDocumentTypes',
118+
'content',
119+
];
120+
121+
if ($args['with_content'] ?? false) {
122+
$relations[] = 'content.parent.path';
123+
$relations[] = 'content.sitemap';
124+
$relations[] = 'content.webSetting';
125+
$relations[] = 'content.documentType';
126+
}
127+
128+
$query = static::getModel()::query()->with($relations);
76129

77130
if (! empty($args['filter_record'])) {
78131
$query->whereKey($args['filter_record']);

src/Exports/Exporters/TemplateExporter.php

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace SolutionForest\InspireCms\Exports\Exporters;
44

5-
use Illuminate\Database\Eloquent\Model;
65
use Illuminate\Support\Arr;
76
use SolutionForest\InspireCms\Exports\ExportResult;
87
use SolutionForest\InspireCms\Helpers\ImportDataHelper;
@@ -65,47 +64,4 @@ private static function getModel()
6564
{
6665
return InspireCmsConfig::getTemplateModelClass();
6766
}
68-
69-
private function getFilePathAndContent($record)
70-
{
71-
$slug = $record->slug;
72-
73-
$themeContent = $record->content;
74-
if (! is_array($themeContent)) {
75-
$themeContent = [inspirecms_templates()->getCurrentTheme() => $themeContent];
76-
}
77-
78-
$result = [];
79-
80-
foreach ($themeContent as $theme => $content) {
81-
82-
$path = $slug . '/' . "$theme.blade.php";
83-
84-
$result[$path] = $content;
85-
}
86-
87-
return $result;
88-
}
89-
90-
protected function processRecordForImportUsed(Model $record, $fs, ?string $dir, array &$errors)
91-
{
92-
$pathAndContent = $this->getFilePathAndContent($record);
93-
94-
foreach ($pathAndContent as $filePath => $content) {
95-
96-
try {
97-
98-
$path = $dir . '/' . $filePath;
99-
100-
$fs->put($path, $content);
101-
102-
} catch (\Throwable $th) {
103-
$errors[] = [
104-
'record' => $record->getKey(),
105-
'path' => $filePath,
106-
'message' => $th->getMessage(),
107-
];
108-
}
109-
}
110-
}
11167
}

src/Filament/Resources/RoleResource.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,8 @@ public static function form(Form $form): Form
8181
->schema(static::getFormComponentForTieredPermissionsSection()),
8282
])
8383
->afterStateHydrated(function (null | Role | RoleContract $record, Forms\Components\Group $component) {
84-
if (is_null($record)) {
85-
$component->state([]);
8684

87-
return;
88-
}
89-
90-
$permissionNames = $record->permissions->pluck('name');
85+
$permissionNames = $record ? $record->permissions->pluck('name') : [];
9186
$state = [];
9287

9388
$resourcePermissions = PermissionManifest::getResourcePermissions();

src/Helpers/TemplateHelper.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,25 @@ public static function getDefaultThemedLayoutComponentName(): string
111111
return 'page';
112112
}
113113

114+
public static function ensureFileBaseNameForTemplate(string $slug): string
115+
{
116+
return str($slug)
117+
->trim()->trim('.')->trim('/')
118+
->snake()
119+
->replace(['_', ' '], '-')
120+
->toString();
121+
}
122+
123+
public static function ensureViewFileNameForTemplate(string $name)
124+
{
125+
return str($name)
126+
->trim()
127+
->replace('.', '/')
128+
->trim('/')
129+
->finish('.blade.php')
130+
->toString();
131+
}
132+
114133
/**
115134
* Splits a Blade expression to extract a property.
116135
*

0 commit comments

Comments
 (0)