]> BookStack Code Mirror - bookstack/commitdiff
Extracted icon helper, aligned container resolution
authorDan Brown <redacted>
Sat, 16 Sep 2023 17:25:08 +0000 (18:25 +0100)
committerDan Brown <redacted>
Sat, 16 Sep 2023 17:26:28 +0000 (18:26 +0100)
Also updated breadcrumb view composer to current standards.
Closes #4553

app/Access/Controllers/ThrottlesLogins.php
app/App/HomeController.php
app/App/Providers/ViewTweaksServiceProvider.php
app/App/helpers.php
app/Entities/BreadcrumbsViewComposer.php
app/Entities/Tools/TrashCan.php
app/Users/Models/User.php
app/Util/SvgIcon.php [new file with mode: 0644]

index 2a066dab502a04a44227d47fdaa4106e77f33a85..25c3452f25e77374dde516ab3e1366e437084aad 100644 (file)
@@ -71,7 +71,7 @@ trait ThrottlesLogins
      */
     protected function limiter(): RateLimiter
     {
-        return app(RateLimiter::class);
+        return app()->make(RateLimiter::class);
     }
 
     /**
index 667af80d39c96582a131124c914900333b4884c3..24b7c3ed819eacb1e0f7dbe04638446dfdf69197 100644 (file)
@@ -78,14 +78,14 @@ class HomeController extends Controller
         }
 
         if ($homepageOption === 'bookshelves') {
-            $shelves = app(BookshelfRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
+            $shelves = app()->make(BookshelfRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
             $data = array_merge($commonData, ['shelves' => $shelves]);
 
             return view('home.shelves', $data);
         }
 
         if ($homepageOption === 'books') {
-            $books = app(BookRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
+            $books = app()->make(BookRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
             $data = array_merge($commonData, ['books' => $books]);
 
             return view('home.books', $data);
index 16b5c1f9751c400d62210d82845f6abcda280365..10593ac8bf851b47380f9b8064a7ade1b141ddd4 100644 (file)
@@ -25,7 +25,7 @@ class ViewTweaksServiceProvider extends ServiceProvider
 
         // Custom blade view directives
         Blade::directive('icon', function ($expression) {
-            return "<?php echo icon($expression); ?>";
+            return "<?php echo (new \BookStack\Util\SvgIcon($expression))->toHtml(); ?>";
         });
     }
 }
index b59a63448340d716fd5a24e5b2328f2c2b7d273e..af6dbcfc39787da06e9d9387685733e932da17b6 100644 (file)
@@ -49,7 +49,7 @@ function userCan(string $permission, Model $ownable = null): bool
     }
 
     // Check permission on ownable item
-    $permissions = app(PermissionApplicator::class);
+    $permissions = app()->make(PermissionApplicator::class);
 
     return $permissions->checkOwnableUserAccess($ownable, $permission);
 }
@@ -60,7 +60,7 @@ function userCan(string $permission, Model $ownable = null): bool
  */
 function userCanOnAny(string $action, string $entityClass = ''): bool
 {
-    $permissions = app(PermissionApplicator::class);
+    $permissions = app()->make(PermissionApplicator::class);
 
     return $permissions->checkUserHasEntityPermissionOnAny($action, $entityClass);
 }
@@ -72,7 +72,7 @@ function userCanOnAny(string $action, string $entityClass = ''): bool
  */
 function setting(string $key = null, $default = null)
 {
-    $settingService = resolve(SettingService::class);
+    $settingService = app()->make(SettingService::class);
 
     if (is_null($key)) {
         return $settingService;
@@ -97,39 +97,6 @@ function theme_path(string $path = ''): ?string
     return base_path('themes/' . $theme . ($path ? DIRECTORY_SEPARATOR . $path : $path));
 }
 
-/**
- * Get fetch an SVG icon as a string.
- * Checks for icons defined within a custom theme before defaulting back
- * to the 'resources/assets/icons' folder.
- *
- * Returns an empty string if icon file not found.
- */
-function icon(string $name, array $attrs = []): string
-{
-    $attrs = array_merge([
-        'class'     => 'svg-icon',
-        'data-icon' => $name,
-        'role'      => 'presentation',
-    ], $attrs);
-    $attrString = ' ';
-    foreach ($attrs as $attrName => $attr) {
-        $attrString .= $attrName . '="' . $attr . '" ';
-    }
-
-    $iconPath = resource_path('icons/' . $name . '.svg');
-    $themeIconPath = theme_path('icons/' . $name . '.svg');
-
-    if ($themeIconPath && file_exists($themeIconPath)) {
-        $iconPath = $themeIconPath;
-    } elseif (!file_exists($iconPath)) {
-        return '';
-    }
-
-    $fileContents = file_get_contents($iconPath);
-
-    return  str_replace('<svg', '<svg' . $attrString, $fileContents);
-}
-
 /**
  * Generate a URL with multiple parameters for sorting purposes.
  * Works out the logic to set the correct sorting direction
index 797162dfb4fb586e8c0b536bb22bd0dea548bd38..c9269c7c66af95029029f4e600901692d5d8e07c 100644 (file)
@@ -8,29 +8,21 @@ use Illuminate\View\View;
 
 class BreadcrumbsViewComposer
 {
-    protected $entityContextManager;
-
-    /**
-     * BreadcrumbsViewComposer constructor.
-     *
-     * @param ShelfContext $entityContextManager
-     */
-    public function __construct(ShelfContext $entityContextManager)
-    {
-        $this->entityContextManager = $entityContextManager;
+    public function __construct(
+        protected ShelfContext $shelfContext
+    ) {
     }
 
     /**
      * Modify data when the view is composed.
-     *
-     * @param View $view
      */
-    public function compose(View $view)
+    public function compose(View $view): void
     {
         $crumbs = $view->getData()['crumbs'];
         $firstCrumb = $crumbs[0] ?? null;
+
         if ($firstCrumb instanceof Book) {
-            $shelf = $this->entityContextManager->getContextualShelfForBook($firstCrumb);
+            $shelf = $this->shelfContext->getContextualShelfForBook($firstCrumb);
             if ($shelf) {
                 array_unshift($crumbs, $shelf);
                 $view->with('crumbs', $crumbs);
index 3c497024fb2d55a7ceaaa5f596f025e40c111d49..08276230c4059eabc5427350ede5df693ba0a486 100644 (file)
@@ -197,7 +197,7 @@ class TrashCan
         $page->allRevisions()->delete();
 
         // Delete Attached Files
-        $attachmentService = app(AttachmentService::class);
+        $attachmentService = app()->make(AttachmentService::class);
         foreach ($page->attachments as $attachment) {
             $attachmentService->deleteFile($attachment);
         }
index 1eeacfe2e18553931dd397cb1ef0c454f870bf80..232ea88326aa96f2bdc1b646590dd975440e29c5 100644 (file)
@@ -374,7 +374,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
      */
     public function refreshSlug(): string
     {
-        $this->slug = app(SlugGenerator::class)->generate($this);
+        $this->slug = app()->make(SlugGenerator::class)->generate($this);
 
         return $this->slug;
     }
diff --git a/app/Util/SvgIcon.php b/app/Util/SvgIcon.php
new file mode 100644 (file)
index 0000000..ce6e1c2
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+namespace BookStack\Util;
+
+class SvgIcon
+{
+    public function __construct(
+        protected string $name,
+        protected array $attrs = []
+    ) {
+    }
+
+    public function toHtml(): string
+    {
+        $attrs = array_merge([
+            'class'     => 'svg-icon',
+            'data-icon' => $this->name,
+            'role'      => 'presentation',
+        ], $this->attrs);
+
+        $attrString = ' ';
+        foreach ($attrs as $attrName => $attr) {
+            $attrString .= $attrName . '="' . $attr . '" ';
+        }
+
+        $iconPath = resource_path('icons/' . $this->name . '.svg');
+        $themeIconPath = theme_path('icons/' . $this->name . '.svg');
+
+        if ($themeIconPath && file_exists($themeIconPath)) {
+            $iconPath = $themeIconPath;
+        } elseif (!file_exists($iconPath)) {
+            return '';
+        }
+
+        $fileContents = file_get_contents($iconPath);
+
+        return str_replace('<svg', '<svg' . $attrString, $fileContents);
+    }
+}
Morty Proxy This is a proxified and sanitized view of the page, visit original site.