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