diff --git a/modules/backend/assets/css/october.css b/modules/backend/assets/css/october.css index 478fc8fb2..f8f3d356c 100644 --- a/modules/backend/assets/css/october.css +++ b/modules/backend/assets/css/october.css @@ -252,7 +252,7 @@ .oc-logo{background-image:url(../images/october-logo.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:contain} .layout.control-tabs.oc-logo-transparent:not(.has-tabs),.layout-cell.oc-logo-transparent{background-size:50% auto;background-repeat:no-repeat;background-image:url(../images/october-logo.svg);background-position:50% 50%;position:relative} .layout.control-tabs.oc-logo-transparent:not(.has-tabs):after,.layout-cell.oc-logo-transparent:after{content:'';display:table-cell;position:absolute;left:0;top:0;height:100%;width:100%;background:rgba(249,249,249,0.7)} -.report-widget{padding:15px;background:white;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} +.report-widget{padding:15px;background:white;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-size:13px} .report-widget h3{font-size:14px;color:#7e8c8d;text-transform:uppercase;font-weight:600;margin-top:0;margin-bottom:30px} .report-widget .height-100{height:100px} .report-widget .height-200{height:200px} @@ -260,7 +260,14 @@ .report-widget .height-400{height:400px} .report-widget .height-500{height:500px} .report-widget p.report-description{margin-bottom:0;margin-top:15px;font-size:12px;line-height:190%;color:#7e8c8d} +.report-widget a{color:#7e8c8d;text-decoration:none} +.report-widget a:hover{color:#0181b9;text-decoration:none} .report-widget p.flash-message.static{margin-bottom:0} +.report-widget .icon-circle.success{color:#31ac5f} +.report-widget .icon-circle.primary{color:#34495e} +.report-widget .icon-circle.warning{color:#f0ad4e} +.report-widget .icon-circle.danger{color:#ab2a1c} +.report-widget .icon-circle.info{color:#5bc0de} .control-treelist ol{padding:0;margin:0;list-style:none} .control-treelist ol ol{margin:0;margin-left:15px;padding-left:15px;border-left:1px solid #dbdee0} .control-treelist > ol > li > div.record:before{display:none} diff --git a/modules/backend/assets/less/controls/reportwidgets.less b/modules/backend/assets/less/controls/reportwidgets.less index d044bef37..821a661e1 100644 --- a/modules/backend/assets/less/controls/reportwidgets.less +++ b/modules/backend/assets/less/controls/reportwidgets.less @@ -3,9 +3,10 @@ background: white; .box-sizing(border-box); .border-radius(@border-radius-base); + font-size: @font-size-base - 1; h3 { - font-size: 14px; + font-size: @font-size-base; color: @color-report-widget-title; text-transform: uppercase; font-weight: 600; @@ -27,7 +28,24 @@ color: @color-report-widget-description; } + a { + color: @color-report-widget-link; + text-decoration: none; + &:hover { + color: @link-color; + text-decoration: none; + } + } + p.flash-message.static { margin-bottom: 0; } + + .icon-circle { + &.success { color: @brand-success; } + &.primary { color: @brand-primary; } + &.warning { color: @brand-warning; } + &.danger { color: @brand-danger; } + &.info { color: @brand-info; } + } } \ No newline at end of file diff --git a/modules/backend/assets/less/core/variables.less b/modules/backend/assets/less/core/variables.less index bee68d3cb..8ceb85332 100644 --- a/modules/backend/assets/less/core/variables.less +++ b/modules/backend/assets/less/core/variables.less @@ -119,6 +119,7 @@ @color-report-widget-title: #7e8c8d; @color-report-widget-control-inactive: #b6b6b6; @color-report-widget-description: @color-report-widget-title; +@color-report-widget-link: @color-report-widget-title; @color-treeview-item-bg: #ffffff; @color-treeview-item-title: #2b3e50; diff --git a/modules/backend/controllers/index/_warnings.htm b/modules/backend/controllers/index/_warnings.htm deleted file mode 100644 index db076a269..000000000 --- a/modules/backend/controllers/index/_warnings.htm +++ /dev/null @@ -1,50 +0,0 @@ - extension_loaded('gd'), - 'fileinfo' => extension_loaded('fileinfo'), - 'Zip' => class_exists('ZipArchive'), - 'cURL' => function_exists('curl_init') && defined('CURLOPT_FOLLOWLOCATION'), - 'OpenSSL' => function_exists('openssl_random_pseudo_bytes'), -]; - -foreach ($writablePaths as $path) { - if (!is_writable($path)) - $warnings[] = Lang::get('backend::lang.warnings.permissions', ['name' => ''.$path.'']); -} -foreach ($requiredExtensions as $extension => $installed) { - if (!$installed) - $warnings[] = Lang::get('backend::lang.warnings.extension', ['name' => ''.$extension.'']); -} - -?> - -
-
- -

-

-
- -
- -
-
- diff --git a/modules/backend/controllers/index/config_dashboard.yaml b/modules/backend/controllers/index/config_dashboard.yaml index 1f1b781a2..ade1188b5 100644 --- a/modules/backend/controllers/index/config_dashboard.yaml +++ b/modules/backend/controllers/index/config_dashboard.yaml @@ -3,8 +3,21 @@ # =================================== defaultWidgets: + + welcome: + class: Backend\ReportWidgets\Welcome + sortOrder: 50 + configuration: + ocWidgetWidth: 6 + systemStatus: class: System\ReportWidgets\Status - sortOrder: 1 + sortOrder: 60 configuration: - ocWidgetWidth: 10 + ocWidgetWidth: 6 + + activeTheme: + class: Cms\ReportWidgets\ActiveTheme + sortOrder: 70 + configuration: + ocWidgetWidth: 4 diff --git a/modules/backend/controllers/index/index.htm b/modules/backend/controllers/index/index.htm index 68c213b47..b979b5b5a 100644 --- a/modules/backend/controllers/index/index.htm +++ b/modules/backend/controllers/index/index.htm @@ -1,5 +1,3 @@ -makePartial('warnings') ?> - 'layout-relative dashboard-container']) ?>
diff --git a/modules/backend/lang/cs/lang.php b/modules/backend/lang/cs/lang.php index 96e009313..0cd167cc3 100644 --- a/modules/backend/lang/cs/lang.php +++ b/modules/backend/lang/cs/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'Musíte zadat název widgetu', 'status' => [ 'widget_title_default' => 'Status systému', - 'online' => 'online', - 'maintenance' => 'v údržbě', 'update_available' => '{0} dostupných aktualizací!|{1} dostupná aktualizace!|[2,Inf] dostupných aktualizací!' ] ], diff --git a/modules/backend/lang/el/lang.php b/modules/backend/lang/el/lang.php index 5ed74f0c1..a9b0a369f 100644 --- a/modules/backend/lang/el/lang.php +++ b/modules/backend/lang/el/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'O τίτλος του Widget είναι απαραίτητος.', 'status' => [ 'widget_title_default' => 'Κατάσταση συστήματος', - 'online' => 'ενεργό', - 'maintenance' => 'σε συντήρηση', 'update_available' => '{0} διαθέσιμες ενημερώσεις!|{1} διαθέσιμη ενημέρωση!|[2,Inf] διαθέσιμες ενημερώσεις!', ] ], diff --git a/modules/backend/lang/en/lang.php b/modules/backend/lang/en/lang.php index f417b743e..b30e3830e 100644 --- a/modules/backend/lang/en/lang.php +++ b/modules/backend/lang/en/lang.php @@ -67,11 +67,29 @@ return [ 'widget_title_error' => 'The Widget Title is required.', 'status' => [ 'widget_title_default' => 'System status', - 'online' => 'online', - 'maintenance' => 'in maintenance', - 'update_available' => '{0} updates available!|{1} update available!|[2,Inf] updates available!' + 'update_available' => '{0} updates available!|{1} update available!|[2,Inf] updates available!', + 'updates_pending' => 'Pending software updates', + 'updates_nil' => 'Software is up to date', + 'updates_link' => 'Update', + 'warnings_pending' => 'Some issues need attention', + 'warnings_nil' => 'No warnings to display', + 'warnings_link' => 'View', + 'core_build' => 'System build', + 'event_log' => 'Event log', + 'request_log' => 'Request log', + 'app_birthday' => 'Online since', + ], + 'welcome' => [ + 'widget_title_default' => 'Welcome', + 'welcome_back_name' => 'Welcome back to :app, :name.', + 'welcome_to_name' => 'Welcome to :app, :name.', + 'first_sign_in' => 'This is the first time you have signed in.', + 'last_sign_in' => 'Your last sign in was', + 'view_access_logs' => 'View access logs', + 'nice_message' => 'Have a great day!', ] ], + 'user' => [ 'name' => 'Administrator', 'menu_label' => 'Administrators', diff --git a/modules/backend/lang/es/lang.php b/modules/backend/lang/es/lang.php index 81a81201b..f771a1857 100644 --- a/modules/backend/lang/es/lang.php +++ b/modules/backend/lang/es/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'El título del módulo es obligatorio.', 'status' => [ 'widget_title_default' => 'Estado del sistema', - 'online' => 'en línea', - 'maintenance' => 'en mantenimiento', 'update_available' => '{0} actualizaciones disponibles!|{1} actualización disponible!|[2,Inf] actualizaciones disponibles!' ] ], diff --git a/modules/backend/lang/fa/lang.php b/modules/backend/lang/fa/lang.php index bee25c83a..c87989be6 100644 --- a/modules/backend/lang/fa/lang.php +++ b/modules/backend/lang/fa/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'گزینه "عنوان ابزارک" حتما باید وارد شود.', 'status' => [ 'widget_title_default' => 'وضعیت سیستم', - 'online' => 'online', - 'maintenance' => 'در حال به روز رسانی', 'update_available' => '{0} به روز رسانی موجود است!|{1} به روز رسانی موجود است!|[2,Inf] به روز رسانی موجود است!', ] ], diff --git a/modules/backend/lang/fr/lang.php b/modules/backend/lang/fr/lang.php index 018c5b58a..1f0cda39b 100644 --- a/modules/backend/lang/fr/lang.php +++ b/modules/backend/lang/fr/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'Le titre du Widget est obligatoire.', 'status' => [ 'widget_title_default' => 'État du système', - 'online' => 'en ligne', - 'maintenance' => 'en cours de maintenance', 'update_available' => '{0} mise à jour disponible !|{1} mise à jour disponible !|[2,Inf] mises à jour disponibles !' ] ], diff --git a/modules/backend/lang/hu/lang.php b/modules/backend/lang/hu/lang.php index e3bf5c32f..e1a72cc67 100644 --- a/modules/backend/lang/hu/lang.php +++ b/modules/backend/lang/hu/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'A widget címének megadása kötelező.', 'status' => [ 'widget_title_default' => 'Rendszer állapota', - 'online' => 'online', - 'maintenance' => 'karbantartás', 'update_available' => '{0} frissítés érhető el!|{1} frissítés érhető el!|[2,Inf] frissítés érhető el!' ] ], diff --git a/modules/backend/lang/id/lang.php b/modules/backend/lang/id/lang.php index aaa810054..26a81cd14 100644 --- a/modules/backend/lang/id/lang.php +++ b/modules/backend/lang/id/lang.php @@ -64,8 +64,6 @@ return [ 'widget_title_error' => 'Tajuk gawit diperlukan.', 'status' => [ 'widget_title_default' => 'Status sistem', - 'online' => 'daring', - 'maintenance' => 'dalam perawatan', 'update_available' => '{0} pembaruan tersedia!|{1} pembaruan tersedia!|[2,Inf] pembaruan tersedia!' ] ], diff --git a/modules/backend/lang/it/lang.php b/modules/backend/lang/it/lang.php index 0f9f99703..2cc8edec6 100644 --- a/modules/backend/lang/it/lang.php +++ b/modules/backend/lang/it/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'Il titolo del widget è un campo obbligatorio.', 'status' => [ 'widget_title_default' => 'Stato del sistema', - 'online' => 'online', - 'maintenance' => 'in manutenzione', 'update_available' => '{0} aggiornamenti disponibili!|{1} aggiornamento disponibile!|[2,Inf] aggiornamenti disponibili!' ] ], diff --git a/modules/backend/lang/ja/lang.php b/modules/backend/lang/ja/lang.php index 1f109acfb..e67ec5a8a 100644 --- a/modules/backend/lang/ja/lang.php +++ b/modules/backend/lang/ja/lang.php @@ -64,8 +64,6 @@ return [ 'widget_title_error' => 'ウィジェットタイトルを指定してください。', 'status' => [ 'widget_title_default' => 'システム状態', - 'online' => 'オンライン', - 'maintenance' => 'メンテナンスモード', 'update_available' => '{0}個のアップデートが見つかりました。|{1} 個のアップデートが見つかりました。|[2,Inf] 個のアップデートが見つかりました。' ], ], diff --git a/modules/backend/lang/lv/lang.php b/modules/backend/lang/lv/lang.php index e642f93a0..ebf75f851 100644 --- a/modules/backend/lang/lv/lang.php +++ b/modules/backend/lang/lv/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'Logrīka virsraksts ir obligāts.', 'status' => [ 'widget_title_default' => 'Sistēmas statuss', - 'online' => 'online', - 'maintenance' => 'atkopšana', 'update_available' => '{0} atjauninājumi pieejami!|{1} atjauninājums pieejams!|[2,Inf] atjauninājumi pieejami!' ] ], diff --git a/modules/backend/lang/nb-no/lang.php b/modules/backend/lang/nb-no/lang.php index 6afddd05a..43a114ae5 100644 --- a/modules/backend/lang/nb-no/lang.php +++ b/modules/backend/lang/nb-no/lang.php @@ -64,8 +64,6 @@ return [ 'widget_title_error' => 'Tittel er obligatorisk.', 'status' => [ 'widget_title_default' => 'Systemstatus', - 'online' => 'online', - 'maintenance' => 'in maintenance', 'update_available' => '{0} oppdateringer tilgjengelig!|{1} oppdatering tilgjengelig!|[2,Inf] oppdateringer tilgjengelig!' ] ], diff --git a/modules/backend/lang/nl/lang.php b/modules/backend/lang/nl/lang.php index b8c362d2f..3c22b6e5b 100644 --- a/modules/backend/lang/nl/lang.php +++ b/modules/backend/lang/nl/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'Een widget titel is verplicht.', 'status' => [ 'widget_title_default' => 'Systeemstatus', - 'online' => 'online', - 'maintenance' => 'in onderhoud', 'update_available' => '{0} updates beschikbaar!|{1} update beschikbaar!|[2,Inf] updates beschikbaar!', ], ], diff --git a/modules/backend/lang/pl/lang.php b/modules/backend/lang/pl/lang.php index 0e25d0df8..94beb6909 100644 --- a/modules/backend/lang/pl/lang.php +++ b/modules/backend/lang/pl/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'Nazwa widgetu jest wymagana.', 'status' => [ 'widget_title_default' => 'Status systemu', - 'online' => 'online', - 'maintenance' => 'w konserwacji', 'update_available' => '{0} dostępnych aktualizacji!|{1} dostępna aktualizacja!|[2,Inf] dostępne aktualizacje!' ] ], diff --git a/modules/backend/lang/pt-br/lang.php b/modules/backend/lang/pt-br/lang.php index 4f2676f09..06c644df0 100644 --- a/modules/backend/lang/pt-br/lang.php +++ b/modules/backend/lang/pt-br/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'O título do widget é necessário.', 'status' => [ 'widget_title_default' => 'Status do Sistema', - 'online' => 'online', - 'maintenance' => 'em manutenção', 'update_available' => '{0} atualizações disponíveis!|{1} atualização disponível!|[2,Inf] atualizações disponíveis!', ], ], diff --git a/modules/backend/lang/ru/lang.php b/modules/backend/lang/ru/lang.php index f51d77a9f..995e20f48 100644 --- a/modules/backend/lang/ru/lang.php +++ b/modules/backend/lang/ru/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'Заголовок виджета обязателен.', 'status' => [ 'widget_title_default' => 'Статус системы', - 'online' => 'Онлайн', - 'maintenance' => 'в разработке', 'update_available' => '{0} нет новый обновлений!|{1} доступно новое обновление!|[2,Inf] доступны новые обновления!' ] ], diff --git a/modules/backend/lang/sv/lang.php b/modules/backend/lang/sv/lang.php index e1984bf84..f13adf8a6 100644 --- a/modules/backend/lang/sv/lang.php +++ b/modules/backend/lang/sv/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'En widgets titel är tvingande.', 'status' => [ 'widget_title_default' => 'Systemstatus', - 'online' => 'online', - 'maintenance' => 'i underhåll', 'update_available' => '{0} uppdateringar tillgängliga!|{1} uppdatering tillgänglig!|[2,Inf] uppdateringar tillgängliga!' ] ], diff --git a/modules/backend/lang/tr/lang.php b/modules/backend/lang/tr/lang.php index fb2bc47d6..d0e3162e6 100644 --- a/modules/backend/lang/tr/lang.php +++ b/modules/backend/lang/tr/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => 'Eklenti Başlığı gerekli.', 'status' => [ 'widget_title_default' => 'Sistem durumu', - 'online' => 'yayında', - 'maintenance' => 'bakım modunda', 'update_available' => '{0} güncelleme var!|{1} güncelleme var!|[2,Inf] güncelleme var!' ] ], diff --git a/modules/backend/lang/zh-cn/lang.php b/modules/backend/lang/zh-cn/lang.php index 0abdb9457..785868aa0 100644 --- a/modules/backend/lang/zh-cn/lang.php +++ b/modules/backend/lang/zh-cn/lang.php @@ -67,8 +67,6 @@ return [ 'widget_title_error' => '需要小工具标题.', 'status' => [ 'widget_title_default' => '系统状态', - 'online' => '在线', - 'maintenance' => '维护中', 'update_available' => '{0} 更新可用!|{1} 更新可用!|[2,Inf] 更新可用!' ] ], diff --git a/modules/backend/lang/zh-tw/lang.php b/modules/backend/lang/zh-tw/lang.php index 885e3185f..65dad939d 100644 --- a/modules/backend/lang/zh-tw/lang.php +++ b/modules/backend/lang/zh-tw/lang.php @@ -64,8 +64,6 @@ return [ 'widget_title_error' => '需要元件標題', 'status' => [ 'widget_title_default' => '系統狀態', - 'online' => '在線', - 'maintenance' => '維護中', 'update_available' => '{0} 更新可用!|{1} 更新可用!|[2,Inf] 更新可用!' ] ], diff --git a/modules/backend/models/AccessLog.php b/modules/backend/models/AccessLog.php index 060530b99..72ede7449 100644 --- a/modules/backend/models/AccessLog.php +++ b/modules/backend/models/AccessLog.php @@ -37,4 +37,26 @@ class AccessLog extends Model return $record; } + + /** + * Returns a recent entry, latest entry is not considered recent + * if the creation day is the same as today. + * @return self + */ + public static function getRecent($user) + { + $records = static::where('user_id', $user->id) + ->orderBy('created_at', 'desc') + ->limit(2) + ->get() + ; + + if (!count($records)) { + return null; + } + + $first = $records->first(); + + return !$first->created_at->isToday() ? $first : $records->pop(); + } } diff --git a/modules/backend/reportwidgets/Welcome.php b/modules/backend/reportwidgets/Welcome.php new file mode 100644 index 000000000..8cfa60bff --- /dev/null +++ b/modules/backend/reportwidgets/Welcome.php @@ -0,0 +1,65 @@ +loadData(); + } + catch (Exception $ex) { + traceLog($ex); + $this->vars['error'] = $ex->getMessage(); + } + + return $this->makePartial('widget'); + } + + public function defineProperties() + { + return [ + 'title' => [ + 'title' => 'backend::lang.dashboard.widget_title_label', + 'default' => 'backend::lang.dashboard.welcome.widget_title_default', + 'type' => 'string', + 'validationPattern' => '^.+$', + 'validationMessage' => 'backend::lang.dashboard.widget_title_error', + ] + ]; + } + + /** + * {@inheritDoc} + */ + protected function loadAssets() + { + $this->addCss('css/welcome.css', 'core'); + } + + protected function loadData() + { + $this->vars['user'] = $user = BackendAuth::getUser(); + $this->vars['appName'] = BrandSetting::get('app_name'); + $this->vars['lastSeen'] = AccessLog::getRecent($user); + } +} diff --git a/modules/backend/reportwidgets/welcome/assets/css/welcome.css b/modules/backend/reportwidgets/welcome/assets/css/welcome.css new file mode 100644 index 000000000..457b9ee47 --- /dev/null +++ b/modules/backend/reportwidgets/welcome/assets/css/welcome.css @@ -0,0 +1,24 @@ +.widget-welcome .welcome-container { + margin-top: -15px; + overflow: hidden; /* clearfix */ +} + +.widget-welcome .welcome-message { + margin-left: 220px; + color: #7e8c8d; + margin-top: 15px; +} +.widget-welcome .welcome-message strong { + color: #666; +} + +.widget-welcome .welcome-logo { + background: #f9f9f9; + width: 200px; + padding: 15px; + float: left; +} + +.widget-welcome .welcome-logo .oc-logo { + height: 80px; +} diff --git a/modules/backend/reportwidgets/welcome/partials/_widget.htm b/modules/backend/reportwidgets/welcome/partials/_widget.htm new file mode 100644 index 000000000..5debc2acd --- /dev/null +++ b/modules/backend/reportwidgets/welcome/partials/_widget.htm @@ -0,0 +1,39 @@ +
+

property('title'))) ?>

+ + +
+ +
+ +

+ $appName, 'name'=>$user->first_name])) ?> + +

+

+ created_at, ['formatAlias' => 'dateTimeLongMin']) ?> +

+

+ +

+ +

+ $appName, 'name'=>$user->first_name])) ?> +

+

+ +

+

+ +

+ +
+
+ +
+
+
+ +
diff --git a/modules/backend/widgets/reportcontainer/partials/_widget.htm b/modules/backend/widgets/reportcontainer/partials/_widget.htm index 0a92fb4f5..2532271a7 100644 --- a/modules/backend/widgets/reportcontainer/partials/_widget.htm +++ b/modules/backend/widgets/reportcontainer/partials/_widget.htm @@ -30,4 +30,4 @@
- \ No newline at end of file + diff --git a/modules/cms/lang/cs/lang.php b/modules/cms/lang/cs/lang.php index 057ed3712..020580796 100644 --- a/modules/cms/lang/cs/lang.php +++ b/modules/cms/lang/cs/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Šablony úspěšně smazány: :count.', 'file_name_required' => 'Je nutno vyplnit Název souboru.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'online', + 'maintenance' => 'v údržbě', + ] + ], 'theme' => [ 'not_found_name' => "Téma ':name' nebylo nalezeno.", 'active' => [ diff --git a/modules/cms/lang/el/lang.php b/modules/cms/lang/el/lang.php index c7e2d0401..ebdcec794 100644 --- a/modules/cms/lang/el/lang.php +++ b/modules/cms/lang/el/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Τα πρότυπα τα οποία διαγράφηκαν επιτυχώς: :count.', 'file_name_required' => 'Το πεδίο του Ονόματος του Αρχείου είναι υποχρεωτικό.', ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'ενεργό', + 'maintenance' => 'σε συντήρηση', + ] + ], 'theme' => [ 'not_found_name' => "Το θέμα ':name' δεν βρέθηκε.", 'active' => [ diff --git a/modules/cms/lang/en/lang.php b/modules/cms/lang/en/lang.php index addf06873..9169e9376 100644 --- a/modules/cms/lang/en/lang.php +++ b/modules/cms/lang/en/lang.php @@ -13,6 +13,14 @@ return [ 'file_name_required' => 'The File Name field is required.', 'safe_mode_enabled' => 'Safe mode is currently enabled.', ], + 'dashboard' => [ + 'active_theme' => [ + 'widget_title_default' => 'Website', + 'online' => 'Online', + 'maintenance' => 'In maintenance', + 'manage_themes' => 'Manage themes', + ] + ], 'theme' => [ 'not_found_name' => "The theme ':name' is not found.", 'active' => [ diff --git a/modules/cms/lang/es/lang.php b/modules/cms/lang/es/lang.php index 035e991d8..bb4ea204e 100644 --- a/modules/cms/lang/es/lang.php +++ b/modules/cms/lang/es/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Los templates fueron borrados satisfactoriamente: :count.', 'file_name_required' => 'Falta el nombre del campo del archivo.', ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'en línea', + 'maintenance' => 'en mantenimiento', + ] + ], 'theme' => [ 'not_found_name' => "El tema ':name' no se ha encontrado.", 'active' => [ diff --git a/modules/cms/lang/fa/lang.php b/modules/cms/lang/fa/lang.php index fd26d58fa..ae483b846 100644 --- a/modules/cms/lang/fa/lang.php +++ b/modules/cms/lang/fa/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'تعداد :count فایل با موفقیت حذف شد.', 'file_name_required' => 'نام فایل را وارد نمایید.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'online', + 'maintenance' => 'در حال به روز رسانی', + ] + ], 'theme' => [ 'not_found_name' => "یافتن قالبی با نام ':name یافت نشد.'", 'active' => [ diff --git a/modules/cms/lang/fr/lang.php b/modules/cms/lang/fr/lang.php index 8164fcb1c..7e807fd6d 100644 --- a/modules/cms/lang/fr/lang.php +++ b/modules/cms/lang/fr/lang.php @@ -13,6 +13,12 @@ return [ 'file_name_required' => 'Le nom du fichier est requis.', 'safe_mode_enabled' => 'Le mode protégé est activé.', ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'en ligne', + 'maintenance' => 'en cours de maintenance', + ] + ], 'theme' => [ 'not_found_name' => 'Le thème ":name" n’a pas été trouvé.', 'active' => [ diff --git a/modules/cms/lang/hu/lang.php b/modules/cms/lang/hu/lang.php index 5b1ee596a..a5f1ab3f4 100644 --- a/modules/cms/lang/hu/lang.php +++ b/modules/cms/lang/hu/lang.php @@ -13,6 +13,12 @@ return [ 'file_name_required' => 'A Fájlnév mező kitöltése kötelező.', 'safe_mode_enabled' => 'A biztonságos mód jelenleg engedélyezett.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'online', + 'maintenance' => 'karbantartás', + ] + ], 'theme' => [ 'not_found_name' => "A következő sablon nem található: ':name'", 'active' => [ diff --git a/modules/cms/lang/id/lang.php b/modules/cms/lang/id/lang.php index 6e41bbbb1..c7a066d41 100644 --- a/modules/cms/lang/id/lang.php +++ b/modules/cms/lang/id/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Acuan: :count berhasil dihapus.', 'file_name_required' => 'Bidang nama berkas diperlukan.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'daring', + 'maintenance' => 'dalam perawatan', + ] + ], 'theme' => [ 'active' => [ 'not_set' => 'Tema aktif tidak diatur.', diff --git a/modules/cms/lang/it/lang.php b/modules/cms/lang/it/lang.php index 9e7f570a6..e9d792d3c 100644 --- a/modules/cms/lang/it/lang.php +++ b/modules/cms/lang/it/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Template eliminati correttamente: :count.', 'file_name_required' => 'Il campo Nome file è obbligatorio.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'online', + 'maintenance' => 'in manutenzione', + ] + ], 'theme' => [ 'not_found_name' => "Tema ':name' non trovato.", 'active' => [ diff --git a/modules/cms/lang/ja/lang.php b/modules/cms/lang/ja/lang.php index 81bf8ca61..a410309d7 100644 --- a/modules/cms/lang/ja/lang.php +++ b/modules/cms/lang/ja/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => ':count個のテンプレートを削除しました。', 'file_name_required' => 'ファイル名フィールドが必要です。', ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'オンライン', + 'maintenance' => 'メンテナンスモード', + ] + ], 'theme' => [ 'active' => [ 'not_set' => "アクティブなテーマが設定されていません。", diff --git a/modules/cms/lang/lv/lang.php b/modules/cms/lang/lv/lang.php index 0ea5be30f..c6aaacf1e 100644 --- a/modules/cms/lang/lv/lang.php +++ b/modules/cms/lang/lv/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Tika veiksmīgi izdzēstas veidnes: :count.', 'file_name_required' => 'Faila nosaukuma lauks ir obligāts.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'online', + 'maintenance' => 'atkopšana', + ] + ], 'theme' => [ 'not_found_name' => "Tēma ':name' netika atrasta.", 'active' => [ diff --git a/modules/cms/lang/nb-no/lang.php b/modules/cms/lang/nb-no/lang.php index 1d9e461a3..e9e64959f 100644 --- a/modules/cms/lang/nb-no/lang.php +++ b/modules/cms/lang/nb-no/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Templates som ble slettet: :count.', 'file_name_required' => 'Filnavnfeltet er obligatorisk.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'online', + 'maintenance' => 'in maintenance', + ] + ], 'theme' => [ 'not_found_name' => "Tema ':name' ble ikke funnet.", 'active' => [ diff --git a/modules/cms/lang/nl/lang.php b/modules/cms/lang/nl/lang.php index 6c8ac757b..2836c83ca 100644 --- a/modules/cms/lang/nl/lang.php +++ b/modules/cms/lang/nl/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Templates zijn succesvol verwijderd: :count.', 'file_name_required' => 'Het invullen van een bestandsnaam is verplicht.', ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'online', + 'maintenance' => 'in onderhoud', + ] + ], 'theme' => [ 'not_found_name' => 'Het thema \':name\' is niet gevonden.', 'active' => [ diff --git a/modules/cms/lang/pl/lang.php b/modules/cms/lang/pl/lang.php index 5dd7a5921..a433a7158 100644 --- a/modules/cms/lang/pl/lang.php +++ b/modules/cms/lang/pl/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Szablony zostały prawidłowo usunięte: :count.', 'file_name_required' => 'Pole Nazwa Pliku jest wymagane.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'online', + 'maintenance' => 'w konserwacji', + ] + ], 'theme' => [ 'not_found_name' => "Motyw ':name' nie został odnaleziony.", 'active' => [ diff --git a/modules/cms/lang/pt-br/lang.php b/modules/cms/lang/pt-br/lang.php index d4eae593a..b634420fe 100644 --- a/modules/cms/lang/pt-br/lang.php +++ b/modules/cms/lang/pt-br/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Templates apagados com sucesso: :count.', 'file_name_required' => 'O campo de Nome do Arquivo é necessário.', ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'online', + 'maintenance' => 'em manutenção', + ] + ], 'theme' => [ 'not_found_name' => 'O tema ":name" não foi encontrado.', 'active' => [ diff --git a/modules/cms/lang/ru/lang.php b/modules/cms/lang/ru/lang.php index 25f105a7d..4d782f429 100644 --- a/modules/cms/lang/ru/lang.php +++ b/modules/cms/lang/ru/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Шаблоны были успешно удалены: :count.', 'file_name_required' => 'Пожалуйста, укажите имя файла шаблона.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'Онлайн', + 'maintenance' => 'в разработке', + ] + ], 'theme' => [ 'not_found_name' => "Тема ':name' не найдена.", 'active' => [ diff --git a/modules/cms/lang/sv/lang.php b/modules/cms/lang/sv/lang.php index bb7b19faa..61c66ac90 100644 --- a/modules/cms/lang/sv/lang.php +++ b/modules/cms/lang/sv/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => 'Mallarna är nu raderade: :count.', 'file_name_required' => 'Filnamnsfältet är obligatoriskt.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'online', + 'maintenance' => 'i underhåll', + ] + ], 'theme' => [ 'not_found_name' => "Kunde inte hitta temat ':name'.", 'active' => [ diff --git a/modules/cms/lang/tr/lang.php b/modules/cms/lang/tr/lang.php index f64557b2c..acab437ae 100644 --- a/modules/cms/lang/tr/lang.php +++ b/modules/cms/lang/tr/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => ':count şablon başarıyla silindi.', 'file_name_required' => 'Dosya adı alanı gereklidir.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => 'yayında', + 'maintenance' => 'bakım modunda', + ] + ], 'theme' => [ 'not_found_name' => "':name' isimli tema bulunamadı.", 'active' => [ diff --git a/modules/cms/lang/zh-cn/lang.php b/modules/cms/lang/zh-cn/lang.php index 2df542424..baf99f483 100644 --- a/modules/cms/lang/zh-cn/lang.php +++ b/modules/cms/lang/zh-cn/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => '模板成功删除: :count.', 'file_name_required' => '需要文件名字段.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => '在线', + 'maintenance' => '维护中', + ] + ], 'theme' => [ 'not_found_name' => "主题 ':name' 没找到.", 'active' => [ diff --git a/modules/cms/lang/zh-tw/lang.php b/modules/cms/lang/zh-tw/lang.php index 0e95e3c01..47cfedae7 100644 --- a/modules/cms/lang/zh-tw/lang.php +++ b/modules/cms/lang/zh-tw/lang.php @@ -12,6 +12,12 @@ return [ 'delete_success' => '模板成功刪除: :count.', 'file_name_required' => '需要檔案名字串.' ], + 'dashboard' => [ + 'active_theme' => [ + 'online' => '在線', + 'maintenance' => '維護中', + ] + ], 'theme' => [ 'not_found_name' => "主題 ':name' 沒找到.", 'active' => [ diff --git a/modules/cms/reportwidgets/ActiveTheme.php b/modules/cms/reportwidgets/ActiveTheme.php new file mode 100644 index 000000000..d65d91e8b --- /dev/null +++ b/modules/cms/reportwidgets/ActiveTheme.php @@ -0,0 +1,62 @@ +loadData(); + } + catch (Exception $ex) { + $this->vars['error'] = $ex->getMessage(); + } + + return $this->makePartial('widget'); + } + + public function defineProperties() + { + return [ + 'title' => [ + 'title' => 'backend::lang.dashboard.widget_title_label', + 'default' => 'cms::lang.dashboard.active_theme.widget_title_default', + 'type' => 'string', + 'validationPattern' => '^.+$', + 'validationMessage' => 'backend::lang.dashboard.widget_title_error', + ] + ]; + } + + /** + * {@inheritDoc} + */ + protected function loadAssets() + { + $this->addCss('css/activetheme.css', 'core'); + } + + protected function loadData() + { + $this->vars['theme'] = Theme::getActiveTheme(); + $this->vars['inMaintenance'] = MaintenanceSetting::get('is_enabled'); + } +} diff --git a/modules/cms/reportwidgets/activetheme/assets/css/activetheme.css b/modules/cms/reportwidgets/activetheme/assets/css/activetheme.css new file mode 100644 index 000000000..6449e4f67 --- /dev/null +++ b/modules/cms/reportwidgets/activetheme/assets/css/activetheme.css @@ -0,0 +1,4 @@ +.widget-activetheme .theme-thumbnail { + margin-top: -15px; + margin-bottom: 15px; +} diff --git a/modules/cms/reportwidgets/activetheme/partials/_widget.htm b/modules/cms/reportwidgets/activetheme/partials/_widget.htm new file mode 100644 index 000000000..e3174541a --- /dev/null +++ b/modules/cms/reportwidgets/activetheme/partials/_widget.htm @@ -0,0 +1,33 @@ +
+

property('title'))) ?>

+ + +
+ +
+ + +
+
+
+ +
diff --git a/modules/system/assets/ui/less/chart.less b/modules/system/assets/ui/less/chart.less index 8259d1d02..ce980c4eb 100644 --- a/modules/system/assets/ui/less/chart.less +++ b/modules/system/assets/ui/less/chart.less @@ -309,7 +309,7 @@ li { margin: 0; - padding: 7px 15px; + padding: 7px 15px 6px; list-style: none; display: block; font-size: @font-size-base - 1; @@ -322,6 +322,7 @@ a { color: @color-status-list-text; + text-decoration: none; &:hover { color: @link-color; text-decoration: none; @@ -343,7 +344,6 @@ float: right; display: inline-block; padding: 1px 5px; - font-size: @font-size-base; .border-radius(@border-radius-base); &:not(.link) { diff --git a/modules/system/assets/ui/less/flashmessage.less b/modules/system/assets/ui/less/flashmessage.less index 4fdcf15a6..d030c5e56 100644 --- a/modules/system/assets/ui/less/flashmessage.less +++ b/modules/system/assets/ui/less/flashmessage.less @@ -30,10 +30,9 @@ padding: 10px 30px 10px 15px; z-index: @zindex-flashmessage; word-wrap: break-word; - text-shadow: 0 -1px 0px rgba(0,0,0,.25); + text-shadow: 0 -1px 0px rgba(0,0,0,.15); text-align: center; - .box-shadow(inset 0 -2px 0 rgba(0,0,0,.1)); - + .box-shadow(@overlay-box-shadow); .border-radius(@border-radius-base); &.fade { @@ -67,10 +66,11 @@ } &.static { - position: static!important; - width: auto!important; - display: block!important; - margin-left: 0!important; + position: static !important; + width: auto !important; + display: block !important; + margin-left: 0 !important; + .box-shadow(none); } } diff --git a/modules/system/assets/ui/storm.css b/modules/system/assets/ui/storm.css index 2f4f1c106..a209a6a47 100644 --- a/modules/system/assets/ui/storm.css +++ b/modules/system/assets/ui/storm.css @@ -1622,9 +1622,9 @@ to{background-position:0 0} .report-container .title-value span.goal-meter-indicator{height:31px;top:4px;width:15px;margin-right:10px} .report-container .title-value span.goal-meter-indicator span{width:15px} .control-status-list > ul{margin-bottom:0;padding:0} -.control-status-list > ul li{margin:0;padding:7px 15px;list-style:none;display:block;font-size:13px;color:#7e8c8d;border-bottom:1px solid #f0f0f0} +.control-status-list > ul li{margin:0;padding:7px 15px 6px;list-style:none;display:block;font-size:13px;color:#7e8c8d;border-bottom:1px solid #f0f0f0} .control-status-list > ul li:last-child{border-bottom:none} -.control-status-list > ul li a{color:#7e8c8d} +.control-status-list > ul li a{color:#7e8c8d;text-decoration:none} .control-status-list > ul li a:hover{color:#0181b9;text-decoration:none} .control-status-list > ul li .status-text{margin:0 5px} .control-status-list > ul li .status-text.muted{color:#999999} @@ -1638,7 +1638,7 @@ a.control-status-list > ul li .status-text.info:hover{color:#245269} a.control-status-list > ul li .status-text.warning:hover{color:#66512c} .control-status-list > ul li .status-text.danger{color:#a94442} a.control-status-list > ul li .status-text.danger:hover{color:#843534} -.control-status-list > ul li .status-label{float:right;display:inline-block;padding:1px 5px;font-size:14px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} +.control-status-list > ul li .status-label{float:right;display:inline-block;padding:1px 5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} .control-status-list > ul li .status-label:not(.link){color:white;letter-spacing:1px;font-family:monospace} .control-status-list > ul li .status-icon{display:inline-block;text-align:center;color:white;width:22px;height:22px;line-height:22px;position:relative;top:-1px;-webkit-border-radius:100px;-moz-border-radius:100px;border-radius:100px} .control-status-list > ul li .status-icon > i{font-size:10px} @@ -1714,7 +1714,7 @@ div.scoreboard .control-chart .canvas + ul{margin-left:0} div.scoreboard .scoreboard-offset{padding-left:20px} body.slim-container div.scoreboard{padding:0 20px} #layout-canvas .flash-message{display:none} -.flash-message{position:fixed;width:500px;left:50%;top:13px;margin-left:-250px;color:#ffffff;font-size:14px;padding:10px 30px 10px 15px;z-index:10300;word-wrap:break-word;text-shadow:0 -1px 0px rgba(0,0,0,0.25);text-align:center;-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.1);box-shadow:inset 0 -2px 0 rgba(0,0,0,0.1);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} +.flash-message{position:fixed;width:500px;left:50%;top:13px;margin-left:-250px;color:#ffffff;font-size:14px;padding:10px 30px 10px 15px;z-index:10300;word-wrap:break-word;text-shadow:0 -1px 0px rgba(0,0,0,0.15);text-align:center;-webkit-box-shadow:0 1px 6px rgba(0,0,0,0.12),0 1px 4px rgba(0,0,0,0.24);box-shadow:0 1px 6px rgba(0,0,0,0.12),0 1px 4px rgba(0,0,0,0.24);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} .flash-message.fade{opacity:0;filter:alpha(opacity=0);-webkit-transition:all 0.5s,width 0s;transition:all 0.5s,width 0s;-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9)} .flash-message.fade.in{opacity:1;filter:alpha(opacity=100);-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)} .flash-message.success{background:#8da85e} @@ -1723,7 +1723,7 @@ body.slim-container div.scoreboard{padding:0 20px} .flash-message.info{background:#5fb6f5} .flash-message button{float:none;position:absolute;right:10px;top:8px;color:white;outline:none} .flash-message button:hover{color:white} -.flash-message.static{position:static !important;width:auto !important;display:block !important;margin-left:0 !important} +.flash-message.static{position:static !important;width:auto !important;display:block !important;margin-left:0 !important;-webkit-box-shadow:none;box-shadow:none} @media (max-width:768px){.flash-message{left:10px;right:10px;top:10px;margin-left:0;width:auto} } [class^="flag-"],[class*=" flag-"]{background-image:url("images/flag-icons-small.png");width:16px;height:16px;line-height:16px;vertical-align:middle;display:inline-block;margin:-3px 2px 0 2px} diff --git a/modules/system/reportwidgets/Status.php b/modules/system/reportwidgets/Status.php index 938c88617..5755d7a42 100644 --- a/modules/system/reportwidgets/Status.php +++ b/modules/system/reportwidgets/Status.php @@ -1,11 +1,13 @@ vars['canUpdate'] = BackendAuth::getUser()->hasAccess('system.manage_updates'); $this->vars['updates'] = $manager->check(); - $this->vars['warnings'] = false; + $this->vars['warnings'] = $this->getSystemWarnings(); $this->vars['coreBuild'] = Parameters::get('system::core.build'); $this->vars['eventLog'] = EventLog::count(); $this->vars['requestLog'] = RequestLog::count(); + $this->vars['appBirthday'] = PluginVersion::orderBy('created_at')->pluck('created_at'); + } + + public function onLoadWarningsForm() + { + $this->vars['warnings'] = $this->getSystemWarnings(); + return $this->makePartial('warnings_form'); + } + + protected function getSystemWarnings() + { + $warnings = []; + + $writablePaths = [ + temp_path(), + themes_path(), + storage_path(), + storage_path('app'), + storage_path('logs'), + storage_path('framework'), + storage_path('cms'), + storage_path('cms/cache'), + storage_path('cms/twig'), + storage_path('cms/combiner'), + ]; + $requiredExtensions = [ + 'GD' => extension_loaded('gd'), + 'fileinfo' => extension_loaded('fileinfo'), + 'Zip' => class_exists('ZipArchive'), + 'cURL' => function_exists('curl_init') && defined('CURLOPT_FOLLOWLOCATION'), + 'OpenSSL' => function_exists('openssl_random_pseudo_bytes'), + ]; + + foreach ($writablePaths as $path) { + if (!is_writable($path)) { + $warnings[] = Lang::get('backend::lang.warnings.permissions', ['name' => ''.$path.'']); + } + } + foreach ($requiredExtensions as $extension => $installed) { + if (!$installed) { + $warnings[] = Lang::get('backend::lang.warnings.extension', ['name' => ''.$extension.'']); + } + } + + return $warnings; } } diff --git a/modules/system/reportwidgets/status/partials/_warnings_form.htm b/modules/system/reportwidgets/status/partials/_warnings_form.htm new file mode 100644 index 000000000..dbd202910 --- /dev/null +++ b/modules/system/reportwidgets/status/partials/_warnings_form.htm @@ -0,0 +1,24 @@ + + + diff --git a/modules/system/reportwidgets/status/partials/_widget.htm b/modules/system/reportwidgets/status/partials/_widget.htm index 27bbb54f7..1a5def03b 100644 --- a/modules/system/reportwidgets/status/partials/_widget.htm +++ b/modules/system/reportwidgets/status/partials/_widget.htm @@ -7,52 +7,75 @@
  • - Pending software updates + + + - Update + - Software is up to date + + +
  • - Some issues need attention - View + + + + - No warnings to display + + +
  • - System build - + + + +
  • - Event log items - + + + +
  • - Request log items - + + + +
  • - + +
  • + + + + + 'dateLong']) ?> +
  • + -

    +
    +
    +