diff --git a/app/_config/requirements.yml b/app/_config/requirements.yml index f635ae8..7af9d52 100644 --- a/app/_config/requirements.yml +++ b/app/_config/requirements.yml @@ -8,7 +8,9 @@ Site\Templates\DeferredRequirements: static_domain: false deferred: true jquery_version: '3.4.1' - fontawesome_version: '5.10.2' + +SilverStripe\FontAwesome\FontAwesomeField: + version: '5.12.0' SilverStripe\View\Requirements: disable_flush_combined: true diff --git a/app/src/Templates/DeferredRequirements.php b/app/src/Templates/DeferredRequirements.php index a57fc44..ec932af 100644 --- a/app/src/Templates/DeferredRequirements.php +++ b/app/src/Templates/DeferredRequirements.php @@ -10,6 +10,7 @@ use SilverStripe\View\Requirements; use SilverStripe\Core\Config\Config; use SilverStripe\Control\Director; use SilverStripe\Core\Path; +use SilverStripe\FontAwesome\FontAwesomeField; class DeferredRequirements implements TemplateGlobalProvider { @@ -21,7 +22,6 @@ class DeferredRequirements implements TemplateGlobalProvider private static $nojquery = false; private static $jquery_version = '3.4.1'; private static $nofontawesome = false; - private static $fontawesome_version = '5.10.2'; private static $custom_requirements = []; /** @@ -33,6 +33,7 @@ class DeferredRequirements implements TemplateGlobalProvider 'AutoRequirements' => 'Auto', 'DeferedCSS' => 'loadCSS', 'DeferedJS' => 'loadJS', + 'WebpackActive' => 'webpackActive', ]; } @@ -69,10 +70,11 @@ class DeferredRequirements implements TemplateGlobalProvider } // App libs if (!$config['nofontawesome']) { - self::loadCSS( - '//use.fontawesome.com/releases/v' - .$config['fontawesome_version'].'/css/all.css' - ); + $v = !isset($config['fontawesome_version']) || !$config['fontawesome_version'] + ? Config::inst()->get(FontAwesomeField::class, 'version') + : $config['fontawesome_version']; + + self::loadCSS('//use.fontawesome.com/releases/v'.$v.'/css/all.css'); } self::loadCSS($mainTheme.'.css'); @@ -116,7 +118,7 @@ class DeferredRequirements implements TemplateGlobalProvider public static function loadCSS($css): void { $external = (mb_strpos($css, '//') === 0 || mb_strpos($css, 'http') === 0); - if ($external || (self::getDeferred() && !self::_webpackActive())) { + if ($external || (self::getDeferred() && !self::webpackActive())) { self::$css[] = $css; } else { WebpackTemplateProvider::loadCSS($css); @@ -128,14 +130,14 @@ class DeferredRequirements implements TemplateGlobalProvider /*$external = (mb_substr($js, 0, 2) === '//' || mb_substr($js, 0, 4) === 'http'); if ($external || (self::getDeferred() && !self::_webpackActive())) {*/ // webpack supposed to load external JS - if (self::getDeferred() && !self::_webpackActive()) { + if (self::getDeferred() && !self::webpackActive()) { self::$js[] = $js; } else { WebpackTemplateProvider::loadJS($js); } } - protected static function _webpackActive(): bool + public static function webpackActive(): bool { return WebpackTemplateProvider::isActive(); } diff --git a/app/src/Templates/WebpackTemplateProvider.php b/app/src/Templates/WebpackTemplateProvider.php index 230383d..c4b159c 100644 --- a/app/src/Templates/WebpackTemplateProvider.php +++ b/app/src/Templates/WebpackTemplateProvider.php @@ -1,28 +1,36 @@ 'Auto', - 'DeferedCSS' => 'loadCSS', - 'DeferedJS' => 'loadJS', - 'WebpackActive' => '_webpackActive', + 'WebpackDevServer' => 'isActive', + 'WebpackCSS' => 'loadCSS', + 'WebpackJS' => 'loadJS', + 'ResourcesURL' => 'resourcesURL', + 'ProjectName' => 'themeName', ]; } - public static function Auto($class = false): string + /** + * Load CSS file + * @param $path + */ + public static function loadCSS($path): void { - $config = Config::inst()->get(self::class); - $projectName = WebpackTemplateProvider::projectName(); - $mainTheme = WebpackTemplateProvider::mainTheme(); - $mainTheme = $mainTheme ?: $projectName; + if (self::isActive()) { + return; + } - $dir = Path::join( - Director::publicFolder(), - RESOURCES_DIR, - $projectName, - 'client', - 'dist' + Requirements::css(self::_getPath($path)); + } + + /** + * Load JS file + * @param $path + */ + public static function loadJS($path): void + { + Requirements::javascript(self::_getPath($path), ['type' => '']); + } + + public static function projectName(): string + { + return Config::inst()->get(ModuleManifest::class, 'project'); + } + + public static function mainTheme() + { + $themes = Config::inst()->get(SSViewer::class, 'themes'); + return is_array($themes) && $themes[0] !== '$public' && $themes[0] !== '$default' ? $themes[0] : false; + } + + public static function resourcesURL($link = null): string + { + return Controller::join_links(Director::baseURL(), '/resources/'.self::projectName().'/client/dist/img/', $link); + } + + + /** + * Checks if dev mode is enabled and if webpack server is online + * @return bool + */ + public static function isActive(): bool + { + $cfg = self::config(); + return Director::isDev() && @fsockopen( + $cfg['HOSTNAME'], + $cfg['PORT'] ); - $cssPath = Path::join($dir, 'css'); - $jsPath = Path::join($dir, 'js'); - - // Initialization - Requirements::block(THIRDPARTY_DIR.'/jquery/jquery.js'); - /*if (defined('FONT_AWESOME_DIR')) { - Requirements::block(FONT_AWESOME_DIR.'/css/lib/font-awesome.min.css'); - }*/ - Requirements::set_force_js_to_bottom(true); - - // Main libs - if (!$config['nojquery']) { - self::loadJS( - '//ajax.googleapis.com/ajax/libs/jquery/' - .$config['jquery_version'].'/jquery.min.js' - ); - } - // App libs - if (!$config['nofontawesome']) { - self::loadCSS( - '//use.fontawesome.com/releases/v' - .$config['fontawesome_version'].'/css/all.css' - ); - } - - self::loadCSS($mainTheme.'.css'); - self::loadJS($mainTheme.'.js'); - - // Custom controller requirements - $curr_class = $class ?: get_class(Controller::curr()); - if (isset($config['custom_requirements'][$curr_class])) { - foreach ($config['custom_requirements'][$curr_class] as $file) { - if (strpos($file, '.css')) { - self::loadCSS($file); - } - if (strpos($file, '.js')) { - self::loadJS($file); - } - } - } - - $curr_class = str_replace('\\', '.', $curr_class); - - // Controller requirements - $themePath = Path::join($cssPath, $mainTheme.'_'.$curr_class . '.css'); - $projectPath = Path::join($cssPath, $projectName.'_'.$curr_class . '.css'); - if ($mainTheme && file_exists($themePath)) { - self::loadCSS($mainTheme.'_'.$curr_class . '.css'); - } elseif (file_exists($projectPath)) { - self::loadCSS($projectName.'_'.$curr_class . '.css'); - } - - $themePath = Path::join($jsPath, $mainTheme.'_'.$curr_class . '.js'); - $projectPath = Path::join($jsPath, $projectName.'_'.$curr_class . '.js'); - if ($mainTheme && file_exists($themePath)) { - self::loadJS($mainTheme.'_'.$curr_class . '.js'); - } elseif (file_exists($projectPath)) { - self::loadJS($projectName.'_'.$curr_class . '.js'); - } - - return self::forTemplate(); } - public static function loadCSS($css): void + protected static function _getPath($path): string { - $external = (mb_strpos($css, '//') === 0 || mb_strpos($css, 'http') === 0); - if ($external || (self::getDeferred() && !self::_webpackActive())) { - self::$css[] = $css; - } else { - WebpackTemplateProvider::loadCSS($css); - } + return self::isActive() && strpos($path, '//') === false ? + self::_toDevServerPath($path) : + self::toPublicPath($path); } - public static function loadJS($js): void + protected static function _toDevServerPath($path): string { - /*$external = (mb_substr($js, 0, 2) === '//' || mb_substr($js, 0, 4) === 'http'); - if ($external || (self::getDeferred() && !self::_webpackActive())) {*/ - // webpack supposed to load external JS - if (self::getDeferred() && !self::_webpackActive()) { - self::$js[] = $js; - } else { - WebpackTemplateProvider::loadJS($js); - } + $cfg = self::config(); + return sprintf( + '%s%s:%s/%s', + Director::protocol(), + $cfg['HOSTNAME'], + $cfg['PORT'], + basename($path) + ); } - protected static function _webpackActive(): bool + public static function toPublicPath($path): string { - return WebpackTemplateProvider::isActive(); - } - - public static function setDeferred($bool): void - { - Config::inst()->set(__CLASS__, 'deferred', $bool); - } - - public static function getDeferred(): bool - { - return self::config()['deferred']; - } - - public static function forTemplate(): string - { - $result = ''; - self::$css = array_unique(self::$css); - foreach (self::$css as $css) { - $result .= ''; - } - - self::$js = array_unique(self::$js); - foreach (self::$js as $js) { - $result .= ''; - } - - $result .= - ''; - - return $result; - } - - private static function get_url($url): string - { - $config = self::config(); - - // external URL - if (strpos($url, '//') !== false) { - return $url; - } - - $path = WebpackTemplateProvider::toPublicPath($url); - - $absolutePath = Director::getAbsFile($path); - $hash = sha1_file($absolutePath); - - $version = $config['version'] ? '&v='.$config['version'] : ''; - //$static_domain = $config['static_domain']; - //$static_domain = $static_domain ?: ''; - - return Controller::join_links(WebpackTemplateProvider::toPublicPath($url), '?m='.$hash.$version); + $cfg = self::config(); + return strpos($path, '//') === false ? + Controller::join_links( + RESOURCES_DIR, + self::projectName(), + $cfg['DIST'], + (strpos($path, '.css') ? 'css' : 'js'), + $path + ) + : $path; } public static function config(): array