diff --git a/config/cms.php b/config/cms.php
index 74d924b76..3a173c4c4 100644
--- a/config/cms.php
+++ b/config/cms.php
@@ -38,6 +38,18 @@ return [
'edgeUpdates' => false,
+ /*
+ |--------------------------------------------------------------------------
+ | Back-end timezone
+ |--------------------------------------------------------------------------
+ |
+ | This acts as the default setting for a back-end user's timezone. This can
+ | be changed by the user at any time using the backend preferences.
+ |
+ */
+
+ 'backendTimezone' => 'UTC',
+
/*
|--------------------------------------------------------------------------
| Back-end Skin
diff --git a/modules/backend/ServiceProvider.php b/modules/backend/ServiceProvider.php
index f1d812b1a..06d0f50f8 100644
--- a/modules/backend/ServiceProvider.php
+++ b/modules/backend/ServiceProvider.php
@@ -206,26 +206,16 @@ class ServiceProvider extends ModuleServiceProvider
'context' => 'mysettings',
'keywords' => 'backend::lang.myaccount.menu_keywords'
],
- 'backend_preferences' => [
+ 'preferences' => [
'label' => 'backend::lang.backend_preferences.menu_label',
'description' => 'backend::lang.backend_preferences.menu_description',
'category' => SettingsManager::CATEGORY_MYSETTINGS,
'icon' => 'icon-laptop',
- 'class' => 'Backend\Models\BackendPreferences',
+ 'url' => Backend::URL('backend/preferences'),
'permissions' => ['backend.manage_preferences'],
'order' => 510,
'context' => 'mysettings'
],
- 'editor' => [
- 'label' => 'backend::lang.editor.menu_label',
- 'description' => 'backend::lang.editor.menu_description',
- 'category' => SettingsManager::CATEGORY_MYSETTINGS,
- 'icon' => 'icon-code',
- 'url' => Backend::URL('backend/editorpreferences'),
- 'permissions' => ['backend.manage_editor'],
- 'order' => 520,
- 'context' => 'mysettings'
- ],
'access_logs' => [
'label' => 'backend::lang.access_log.menu_label',
'description' => 'backend::lang.access_log.menu_description',
diff --git a/modules/backend/assets/js/editorpreferences/editorpreferences.js b/modules/backend/assets/js/editorpreferences/editorpreferences.js
deleted file mode 100644
index 093d7c9eb..000000000
--- a/modules/backend/assets/js/editorpreferences/editorpreferences.js
+++ /dev/null
@@ -1,67 +0,0 @@
-$(document).ready(function(){
-
- var editorEl = $('#editorpreferencesCodeeditor'),
- editor = editorEl.codeEditor('getEditorObject'),
- session = editor.getSession(),
- renderer = editor.renderer
-
- editorEl.height($('#editorSettingsForm').height() - 23)
-
- $('#Form-field-EditorPreferences-theme').on('change', function(){
- editorEl.codeEditor('setTheme', $(this).val())
- })
-
- $('#Form-field-EditorPreferences-font_size').on('change', function(){
- editor.setFontSize(parseInt($(this).val()))
- })
-
- $('#Form-field-EditorPreferences-word_wrap').on('change', function(){
- editorEl.codeEditor('setWordWrap', $(this).val())
- })
-
- $('#Form-field-EditorPreferences-code_folding').on('change', function(){
- session.setFoldStyle($(this).val())
- })
-
- $('#Form-field-EditorPreferences-tab_size').on('change', function(){
- session.setTabSize($(this).val())
- })
-
- $('#Form-field-EditorPreferences-show_invisibles').on('change', function(){
- editor.setShowInvisibles($(this).is(':checked'))
- })
-
- $('#Form-field-EditorPreferences-enable_basic_autocompletion').on('change', function(){
- editor.setOption('enableBasicAutocompletion', $(this).is(':checked'))
- })
-
- $('#Form-field-EditorPreferences-enable_snippets').on('change', function(){
- editor.setOption('enableSnippets', $(this).is(':checked'))
- })
-
- $('#Form-field-EditorPreferences-enable_live_autocompletion').on('change', function(){
- editor.setOption('enableLiveAutocompletion', $(this).is(':checked'))
- })
-
- $('#Form-field-EditorPreferences-display_indent_guides').on('change', function(){
- editor.setDisplayIndentGuides($(this).is(':checked'))
- })
-
- $('#Form-field-EditorPreferences-show_print_margin').on('change', function(){
- editor.setShowPrintMargin($(this).is(':checked'))
- })
-
- $('#Form-field-EditorPreferences-highlight_active_line').on('change', function(){
- editor.setHighlightActiveLine($(this).is(':checked'))
- })
-
- $('#Form-field-EditorPreferences-use_hard_tabs').on('change', function(){
- session.setUseSoftTabs(!$(this).is(':checked'))
- })
-
- $('#Form-field-EditorPreferences-show_gutter').on('change', function(){
- renderer.setShowGutter($(this).is(':checked'))
- })
-
-})
-
diff --git a/modules/backend/assets/js/preferences/preferences.js b/modules/backend/assets/js/preferences/preferences.js
new file mode 100644
index 000000000..d710cf075
--- /dev/null
+++ b/modules/backend/assets/js/preferences/preferences.js
@@ -0,0 +1,67 @@
+$(document).ready(function(){
+
+ var editorEl = $('#editorpreferencesCodeeditor'),
+ editor = editorEl.codeEditor('getEditorObject'),
+ session = editor.getSession(),
+ renderer = editor.renderer
+
+ editorEl.height($('#editorSettingsForm').height() - 23)
+
+ $('#Form-field-Preferences-editor_theme').on('change', function(){
+ editorEl.codeEditor('setTheme', $(this).val())
+ })
+
+ $('#Form-field-Preferences-editor_font_size').on('change', function(){
+ editor.setFontSize(parseInt($(this).val()))
+ })
+
+ $('#Form-field-Preferences-editor_word_wrap').on('change', function(){
+ editorEl.codeEditor('setWordWrap', $(this).val())
+ })
+
+ $('#Form-field-Preferences-editor_code_folding').on('change', function(){
+ session.setFoldStyle($(this).val())
+ })
+
+ $('#Form-field-Preferences-editor_tab_size').on('change', function(){
+ session.setTabSize($(this).val())
+ })
+
+ $('#Form-field-Preferences-editor_show_invisibles').on('change', function(){
+ editor.setShowInvisibles($(this).is(':checked'))
+ })
+
+ $('#Form-field-Preferences-editor_enable_basic_autocompletion').on('change', function(){
+ editor.setOption('enableBasicAutocompletion', $(this).is(':checked'))
+ })
+
+ $('#Form-field-Preferences-editor_enable_snippets').on('change', function(){
+ editor.setOption('enableSnippets', $(this).is(':checked'))
+ })
+
+ $('#Form-field-Preferences-editor_enable_live_autocompletion').on('change', function(){
+ editor.setOption('enableLiveAutocompletion', $(this).is(':checked'))
+ })
+
+ $('#Form-field-Preferences-editor_display_indent_guides').on('change', function(){
+ editor.setDisplayIndentGuides($(this).is(':checked'))
+ })
+
+ $('#Form-field-Preferences-editor_show_print_margin').on('change', function(){
+ editor.setShowPrintMargin($(this).is(':checked'))
+ })
+
+ $('#Form-field-Preferences-editor_highlight_active_line').on('change', function(){
+ editor.setHighlightActiveLine($(this).is(':checked'))
+ })
+
+ $('#Form-field-Preferences-editor_use_hard_tabs').on('change', function(){
+ session.setUseSoftTabs(!$(this).is(':checked'))
+ })
+
+ $('#Form-field-Preferences-editor_show_gutter').on('change', function(){
+ renderer.setShowGutter($(this).is(':checked'))
+ })
+
+})
+
diff --git a/modules/backend/classes/Controller.php b/modules/backend/classes/Controller.php
index a8ccd1da6..436a0a1fe 100644
--- a/modules/backend/classes/Controller.php
+++ b/modules/backend/classes/Controller.php
@@ -14,7 +14,7 @@ use Response;
use Exception;
use BackendAuth;
use Backend\Models\UserPreferences;
-use Backend\Models\BackendPreferences;
+use Backend\Models\Preferences as BackendPreferences;
use Cms\Widgets\MediaManager;
use System\Classes\ErrorHandler;
use October\Rain\Exception\AjaxException;
@@ -218,13 +218,8 @@ class Controller extends Extendable
/*
* Set the admin preference locale
*/
- if (Session::has('locale')) {
- App::setLocale(Session::get('locale'));
- }
- elseif ($this->user && ($locale = BackendPreferences::get('locale'))) {
- Session::put('locale', $locale);
- App::setLocale($locale);
- }
+ BackendPreferences::setAppLocale();
+ BackendPreferences::setAppFallbackLocale();
/*
* Execute AJAX event
diff --git a/modules/backend/controllers/EditorPreferences.php b/modules/backend/controllers/EditorPreferences.php
deleted file mode 100644
index 46ad3efa1..000000000
--- a/modules/backend/controllers/EditorPreferences.php
+++ /dev/null
@@ -1,74 +0,0 @@
-addCss('/modules/backend/formwidgets/codeeditor/assets/css/codeeditor.css', 'core');
- $this->addJs('/modules/backend/formwidgets/codeeditor/assets/js/build-min.js', 'core');
- $this->addJs('/modules/backend/assets/js/editorpreferences/editorpreferences.js', 'core');
-
- BackendMenu::setContext('October.System', 'system', 'mysettings');
- SettingsManager::setContext('October.Backend', 'editor');
- }
-
- public function index()
- {
- // Load the editor system settings
- $editorSettings = EditorPreferencesModel::instance();
-
- $this->vars['fontSize'] = $editorSettings->font_size;
- $this->vars['wordWrap'] = $editorSettings->word_wrap;
- $this->vars['codeFolding'] = $editorSettings->code_folding;
- $this->vars['tabSize'] = $editorSettings->tab_size;
- $this->vars['theme'] = $editorSettings->theme;
- $this->vars['showInvisibles'] = $editorSettings->show_invisibles;
- $this->vars['highlightActiveLine'] = $this->highlight_active_line;
- $this->vars['useSoftTabs'] = !$editorSettings->use_hard_tabs;
- $this->vars['showGutter'] = true;
- $this->vars['language'] = 'css';
- $this->vars['margin'] = 0;
- $this->vars['enableBasicAutocompletion'] = $editorSettings->enable_basic_autocompletion;
- $this->vars['enableLiveAutocompletion'] = $editorSettings->enable_live_autocompletion;
- $this->vars['enableSnippets'] = $editorSettings->enable_snippets;
- $this->vars['displayIndentGuides'] = $editorSettings->display_indent_guides;
- $this->vars['showPrintMargin'] = $editorSettings->show_print_margin;
- $this->asExtension('FormController')->update();
- $this->pageTitle = 'backend::lang.editor.menu_label';
- }
-
- public function index_onSave()
- {
- return $this->asExtension('FormController')->update_onSave();
- }
-
- public function formFindModelObject()
- {
- return EditorPreferencesModel::instance();
- }
-}
diff --git a/modules/backend/controllers/Preferences.php b/modules/backend/controllers/Preferences.php
new file mode 100644
index 000000000..dfbf7639c
--- /dev/null
+++ b/modules/backend/controllers/Preferences.php
@@ -0,0 +1,74 @@
+addCss('/modules/backend/formwidgets/codeeditor/assets/css/codeeditor.css', 'core');
+ $this->addJs('/modules/backend/formwidgets/codeeditor/assets/js/build-min.js', 'core');
+ $this->addJs('/modules/backend/assets/js/preferences/preferences.js', 'core');
+
+ BackendMenu::setContext('October.System', 'system', 'mysettings');
+ SettingsManager::setContext('October.Backend', 'preferences');
+ }
+
+ public function index()
+ {
+ $this->pageTitle = 'backend::lang.backend_preferences.menu_label';
+ $this->asExtension('FormController')->update();
+ }
+
+ /**
+ * Remove the code editor tab if there is no permission.
+ */
+ public function formExtendFields($form)
+ {
+ if (!$this->user->hasAccess('backend.manage_editor')) {
+ $form->removeTab('backend::lang.backend_preferences.code_editor');
+ }
+ }
+
+ public function index_onSave()
+ {
+ return $this->asExtension('FormController')->update_onSave();
+ }
+
+ public function index_onResetDefault()
+ {
+ $model = $this->formFindModelObject();
+ $model->resetDefault();
+
+ return Backend::redirect('backend/preferences');
+ }
+
+ public function formFindModelObject()
+ {
+ return PreferencesModel::instance();
+ }
+}
diff --git a/modules/backend/controllers/editorpreferences/config_form.yaml b/modules/backend/controllers/editorpreferences/config_form.yaml
deleted file mode 100644
index 192d0f093..000000000
--- a/modules/backend/controllers/editorpreferences/config_form.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-# ===================================
-# Form Behavior Config
-# ===================================
-
-form: ~/modules/backend/models/editorpreferences/fields.yaml
-modelClass: Backend\Models\EditorPreferences
-defaultRedirect: system/mailtemplates
diff --git a/modules/backend/controllers/editorpreferences/index.htm b/modules/backend/controllers/editorpreferences/index.htm
deleted file mode 100644
index 05fb57317..000000000
--- a/modules/backend/controllers/editorpreferences/index.htm
+++ /dev/null
@@ -1,64 +0,0 @@
-fatalError): ?>
-
- = Form::open(['class'=>'layout']) ?>
-
-
-
-
- = Form::close() ?>
-
-
- = e(trans($this->fatalError)) ?>
- = e(trans('system::lang.settings.return')) ?>
-
\ No newline at end of file
diff --git a/modules/backend/controllers/editorpreferences/_example_code.htm b/modules/backend/controllers/preferences/_example_code.htm
similarity index 76%
rename from modules/backend/controllers/editorpreferences/_example_code.htm
rename to modules/backend/controllers/preferences/_example_code.htm
index dfffe5018..0f95acced 100644
--- a/modules/backend/controllers/editorpreferences/_example_code.htm
+++ b/modules/backend/controllers/preferences/_example_code.htm
@@ -11,12 +11,3 @@ body {
p {
font-size: 12px;
}
-
-optgroup {
- font-style: normal;
- color: #333;
-}
-
-option {
- color: #000;
-}
\ No newline at end of file
diff --git a/modules/backend/controllers/preferences/_field_editor_preview.htm b/modules/backend/controllers/preferences/_field_editor_preview.htm
new file mode 100644
index 000000000..4578395b3
--- /dev/null
+++ b/modules/backend/controllers/preferences/_field_editor_preview.htm
@@ -0,0 +1,23 @@
+
+
+
diff --git a/modules/backend/controllers/preferences/config_form.yaml b/modules/backend/controllers/preferences/config_form.yaml
new file mode 100644
index 000000000..e7f3b457d
--- /dev/null
+++ b/modules/backend/controllers/preferences/config_form.yaml
@@ -0,0 +1,7 @@
+# ===================================
+# Form Behavior Config
+# ===================================
+
+form: ~/modules/backend/models/preferences/fields.yaml
+modelClass: Backend\Models\Preferences
+defaultRedirect: system/settings
diff --git a/modules/backend/controllers/preferences/index.htm b/modules/backend/controllers/preferences/index.htm
new file mode 100644
index 000000000..3b3061a2d
--- /dev/null
+++ b/modules/backend/controllers/preferences/index.htm
@@ -0,0 +1,40 @@
+fatalError): ?>
+
+ = Form::open(['class'=>'layout']) ?>
+
+
+ = $this->formRender() ?>
+
+
+
+ = Form::close() ?>
+
+
+ = e(trans($this->fatalError)) ?>
+ = e(trans('system::lang.settings.return')) ?>
+
\ No newline at end of file
diff --git a/modules/backend/formwidgets/CodeEditor.php b/modules/backend/formwidgets/CodeEditor.php
index e59b7d988..f471f8c68 100644
--- a/modules/backend/formwidgets/CodeEditor.php
+++ b/modules/backend/formwidgets/CodeEditor.php
@@ -1,6 +1,6 @@
vars['name'] = $this->formField->getName();
$this->vars['readOnly'] = $this->readOnly;
$this->vars['enableBasicAutocompletion'] = $this->enableBasicAutocompletion;
- $this->vars['enableSnippets'] = $this->enableSnippets;
+ $this->vars['enableSnippets'] = $this->enableSnippets;
$this->vars['enableLiveAutocompletion'] = $this->enableLiveAutocompletion;
$this->vars['displayIndentGuides'] = $this->displayIndentGuides;
$this->vars['showPrintMargin'] = $this->showPrintMargin;
@@ -189,23 +189,23 @@ class CodeEditor extends FormWidgetBase
protected function applyEditorPreferences()
{
// Load the editor system settings
- $editorSettings = EditorPreferences::instance();
+ $preferences = BackendPreferences::instance();
- $this->fontSize = $editorSettings->font_size;
- $this->wordWrap = $editorSettings->word_wrap;
- $this->codeFolding = $editorSettings->code_folding;
- $this->autoClosing = $editorSettings->auto_closing;
- $this->tabSize = $editorSettings->tab_size;
- $this->theme = $editorSettings->theme;
- $this->showInvisibles = $editorSettings->show_invisibles;
- $this->highlightActiveLine = $editorSettings->highlight_active_line;
- $this->useSoftTabs = !$editorSettings->use_hard_tabs;
- $this->showGutter = $editorSettings->show_gutter;
- $this->enableBasicAutocompletion = $editorSettings->enable_basic_autocompletion;
- $this->enableSnippets = $editorSettings->enable_snippets;
- $this->enableLiveAutocompletion = $editorSettings->enable_live_autocompletion;
- $this->displayIndentGuides = $editorSettings->display_indent_guides;
- $this->showPrintMargin = $editorSettings->show_print_margin;
+ $this->fontSize = $preferences->editor_font_size;
+ $this->wordWrap = $preferences->editor_word_wrap;
+ $this->codeFolding = $preferences->editor_code_folding;
+ $this->autoClosing = $preferences->editor_auto_closing;
+ $this->tabSize = $preferences->editor_tab_size;
+ $this->theme = $preferences->editor_theme;
+ $this->showInvisibles = $preferences->editor_show_invisibles;
+ $this->highlightActiveLine = $preferences->editor_highlight_active_line;
+ $this->useSoftTabs = !$preferences->editor_use_hard_tabs;
+ $this->showGutter = $preferences->editor_show_gutter;
+ $this->enableBasicAutocompletion = $preferences->editor_enable_basic_autocompletion;
+ $this->enableSnippets = $preferences->editor_enable_snippets;
+ $this->enableLiveAutocompletion = $preferences->editor_enable_live_autocompletion;
+ $this->displayIndentGuides = $preferences->editor_display_indent_guides;
+ $this->showPrintMargin = $preferences->editor_show_print_margin;
}
}
diff --git a/modules/backend/lang/en/lang.php b/modules/backend/lang/en/lang.php
index a5f6f2045..ce47fd36b 100644
--- a/modules/backend/lang/en/lang.php
+++ b/modules/backend/lang/en/lang.php
@@ -281,11 +281,11 @@ return [
'auto_closing' => 'Auto close tags and special characters',
'show_invisibles' => 'Show invisible characters',
'show_gutter' => 'Show gutter',
- 'enable_basic_autocompletion'=> 'Enable Basic Autocompletion(Ctrl+Space)',
- 'enable_snippets'=> 'Enable use of Snippets',
- 'enable_live_autocompletion'=> 'Enable Live Autocompletion',
- 'display_indent_guides'=> 'Show Display Indent Guides',
- 'show_print_margin'=> 'Show Print Margin',
+ 'enable_basic_autocompletion'=> 'Enable Basic Autocompletion (Ctrl+Space)',
+ 'enable_snippets'=> 'Enable use of Snippets',
+ 'enable_live_autocompletion'=> 'Enable Live Autocompletion',
+ 'display_indent_guides'=> 'Show Display Indent Guides',
+ 'show_print_margin'=> 'Show Print Margin',
'theme' => 'Color scheme'
],
'tooltips' => [
@@ -311,17 +311,24 @@ return [
'app_tagline' => 'App Tagline',
'app_tagline_description' => 'This name is shown on the sign in screen for the back-end.',
'colors' => 'Colors',
- 'appearance' => 'Appearance',
'primary_color' => 'Primary color',
'secondary_color' => 'Secondary color',
'accent_color' => 'Accent color',
'styles' => 'Styles',
- 'custom_stylesheet' => 'Custom stylesheet'
+ 'custom_stylesheet' => 'Custom stylesheet',
+ 'navigation' => 'Navigation',
+ 'menu_mode' => 'Menu style',
+ 'menu_mode_inline' => 'Inline',
+ 'menu_mode_tile' => 'Tiles',
+ 'menu_mode_collapsed' => 'Collapsed',
],
'backend_preferences' => [
'menu_label' => 'Back-end preferences',
'menu_description' => 'Manage your account preferences such as desired language.',
- 'locale' => 'Language',
+ 'region' => 'Region',
+ 'code_editor' => 'Code editor',
+ 'timezone' => 'Timezone',
+ 'locale' => 'Locale',
'locale_comment' => 'Select your desired locale for language use.'
],
'access_log' => [
diff --git a/modules/backend/models/BackendPreferences.php b/modules/backend/models/BackendPreferences.php
deleted file mode 100644
index 0f4282adf..000000000
--- a/modules/backend/models/BackendPreferences.php
+++ /dev/null
@@ -1,75 +0,0 @@
-locale = Config::get('app.locale', 'en');
- }
-
- public static function applyConfigValues()
- {
- $settings = self::instance();
- Config::set('app.locale', $settings->locale);
- }
-
- /**
- * Returns available options for the "locale" attribute.
- * @return array
- */
- public function getLocaleOptions()
- {
- $locales = Config::get('app.localeOptions', [
- 'cs' => [Lang::get('system::lang.locale.cs'), 'flag-cz'],
- 'en' => [Lang::get('system::lang.locale.en'), 'flag-gb'],
- 'de' => [Lang::get('system::lang.locale.de'), 'flag-de'],
- 'es' => [Lang::get('system::lang.locale.es'), 'flag-es'],
- 'es-ar' => [Lang::get('system::lang.locale.es-ar'), 'flag-ar'],
- 'fa' => [Lang::get('system::lang.locale.fa'), 'flag-ir'],
- 'fr' => [Lang::get('system::lang.locale.fr'), 'flag-fr'],
- 'hu' => [Lang::get('system::lang.locale.hu'), 'flag-hu'],
- 'id' => [Lang::get('system::lang.locale.id'), 'flag-id'],
- 'it' => [Lang::get('system::lang.locale.it'), 'flag-it'],
- 'ja' => [Lang::get('system::lang.locale.ja'), 'flag-jp'],
- 'lv' => [Lang::get('system::lang.locale.lv'), 'flag-lv'],
- 'nl' => [Lang::get('system::lang.locale.nl'), 'flag-nl'],
- 'pt-br' => [Lang::get('system::lang.locale.pt-br'), 'flag-br'],
- 'ro' => [Lang::get('system::lang.locale.ro'), 'flag-ro'],
- 'ru' => [Lang::get('system::lang.locale.ru'), 'flag-ru'],
- 'sv' => [Lang::get('system::lang.locale.sv'), 'flag-se'],
- 'tr' => [Lang::get('system::lang.locale.tr'), 'flag-tr'],
- 'pl' => [Lang::get('system::lang.locale.pl'), 'flag-pl'],
- 'sk' => [Lang::get('system::lang.locale.sk'), 'flag-sk'],
- 'zh-cn' => [Lang::get('system::lang.locale.zh-cn'), 'flag-cn'],
- 'zh-tw' => [Lang::get('system::lang.locale.zh-tw'), 'flag-tw'],
- 'nb-no' => [Lang::get('system::lang.locale.nb-no'), 'flag-no'],
- 'el' => [Lang::get('system::lang.locale.el'), 'flag-gr'],
- ]);
-
- // Sort locales alphabetically
- asort($locales);
-
- return $locales;
- }
-
- public function afterSave()
- {
- Session::put('locale', $this->locale);
- }
-}
diff --git a/modules/backend/models/EditorPreferences.php b/modules/backend/models/EditorPreferences.php
deleted file mode 100644
index 05d8aa491..000000000
--- a/modules/backend/models/EditorPreferences.php
+++ /dev/null
@@ -1,88 +0,0 @@
-font_size = $config->get('editor.font_size', 12);
- $this->word_wrap = $config->get('editor.word_wrap', 'fluid');
- $this->code_folding = $config->get('editor.code_folding', 'manual');
- $this->tab_size = $config->get('editor.tab_size', 4);
- $this->theme = $config->get('editor.theme', static::DEFAULT_THEME);
- $this->show_invisibles = $config->get('editor.show_invisibles', true);
- $this->highlight_active_line = $config->get('editor.highlight_active_line', true);
- $this->use_hard_tabs = $config->get('editor.use_hard_tabs', false);
- $this->show_gutter = $config->get('editor.show_gutter', true);
- $this->auto_closing = $config->get('editor.auto_closing', true);
- $this->enable_basic_autocompletion = $config->get('editor.enable_basic_autocompletion', true);
- $this->enable_snippets = $config->get('editor.enable_snippets', true);
- $this->enable_live_autocompletion = $config->get('editor.enable_live_autocompletion', true);
- $this->display_indent_guides = $config->get('editor.display_indent_guides', true);
- $this->show_print_margin = $config->get('editor.show_print_margin', true);
- }
-
- public static function applyConfigValues()
- {
- $config = App::make('config');
- $settings = self::instance();
- $config->set('editor.font_size', $settings->font_size);
- $config->set('editor.word_wrap', $settings->word_wrap);
- $config->set('editor.code_folding', $settings->code_folding);
- $config->set('editor.tab_size', $settings->tab_size);
- $config->set('editor.theme', $settings->theme);
- $config->set('editor.show_invisibles', $settings->show_invisibles);
- $config->set('editor.highlight_active_line', $settings->highlight_active_line);
- $config->set('editor.use_hard_tabs', $settings->use_hard_tabs);
- $config->set('editor.show_gutter', $settings->show_gutter);
- $config->set('editor.auto_closing', $settings->auto_closing);
- $config->set('editor.enable_basic_autocompletion', $settings->enable_basic_autocompletion);
- $config->set('editor.editor.enable_snippets', $settings->enable_snippets);
- $config->set('editor.enable_live_autocompletion', $settings->enable_live_autocompletion);
- $config->set('editor.display_indent_guides', $settings->display_indent_guides);
- $config->set('editor.show_print_margin', $settings->show_print_margin);
- }
-
- public function getThemeOptions()
- {
- $themeDir = new DirectoryIterator("modules/backend/formwidgets/codeeditor/assets/vendor/ace/");
- $themes = [];
-
- // Iterate through the themes
- foreach ($themeDir as $node) {
-
- // If this file is a theme (starting by "theme-")
- if (!$node->isDir() && substr($node->getFileName(), 0, 6) == 'theme-') {
- // Remove the theme- prefix and the .js suffix, create an user friendly and capitalized name
- $themeId = substr($node->getFileName(), 6, -3);
- $themeName = ucwords(str_replace("_", " ", $themeId));
-
- // Add the values to the themes array
- if ($themeId != static::DEFAULT_THEME) {
- $themes[$themeId] = $themeName;
- }
- }
-
- }
-
- // Sort the theme alphabetically, and push the default theme
- asort($themes);
- return [static::DEFAULT_THEME => ucwords(static::DEFAULT_THEME)] + $themes;
- }
-}
diff --git a/modules/backend/models/Preferences.php b/modules/backend/models/Preferences.php
new file mode 100644
index 000000000..155107450
--- /dev/null
+++ b/modules/backend/models/Preferences.php
@@ -0,0 +1,220 @@
+locale = Config::get('app.locale', 'en');
+ $this->fallback_locale = $this->getFallbackLocale($this->locale);
+ $this->timezone = Config::get('cms.backendTimezone', 'UTC');
+
+ $config = App::make('config');
+ $this->editor_font_size = $config->get('editor.font_size', 12);
+ $this->editor_word_wrap = $config->get('editor.word_wrap', 'fluid');
+ $this->editor_code_folding = $config->get('editor.code_folding', 'manual');
+ $this->editor_tab_size = $config->get('editor.tab_size', 4);
+ $this->editor_theme = $config->get('editor.theme', static::DEFAULT_THEME);
+ $this->editor_show_invisibles = $config->get('editor.show_invisibles', true);
+ $this->editor_highlight_active_line = $config->get('editor.highlight_active_line', true);
+ $this->editor_use_hard_tabs = $config->get('editor.use_hard_tabs', false);
+ $this->editor_show_gutter = $config->get('editor.show_gutter', true);
+ $this->editor_auto_closing = $config->get('editor.auto_closing', true);
+ $this->editor_enable_basic_autocompletion = $config->get('editor.enable_basic_autocompletion', true);
+ $this->editor_enable_live_autocompletion = $config->get('editor.enable_live_autocompletion', true);
+ $this->editor_enable_snippets = $config->get('editor.enable_snippets', true);
+ $this->editor_display_indent_guides = $config->get('editor.display_indent_guides', true);
+ $this->editor_show_print_margin = $config->get('editor.show_print_margin', true);
+ }
+
+ public static function setAppLocale()
+ {
+ if (Session::has('locale')) {
+ App::setLocale(Session::get('locale'));
+ }
+ elseif (
+ ($user = BackendAuth::getUser()) &&
+ ($locale = static::get('locale'))
+ ) {
+ Session::put('locale', $locale);
+ App::setLocale($locale);
+ }
+ }
+
+ public static function setAppFallbackLocale()
+ {
+ if (Session::has('fallback_locale')) {
+ Lang::setFallback(Session::get('fallback_locale'));
+ }
+ elseif (
+ ($user = BackendAuth::getUser()) &&
+ ($locale = static::get('fallback_locale'))
+ ) {
+ Session::put('fallback_locale', $locale);
+ Lang::setFallback($locale);
+ }
+ }
+
+ public function beforeValidate()
+ {
+ $this->fallback_locale = $this->getFallbackLocale($this->locale);
+ }
+
+ public function afterSave()
+ {
+ Session::put('locale', $this->locale);
+ Session::put('fallback_locale', $this->fallback_locale);
+ }
+
+ public function resetDefault()
+ {
+ parent::resetDefault();
+ Session::forget('locale');
+ Session::forget('fallback_locale');
+ }
+
+ public static function applyConfigValues()
+ {
+ $settings = self::instance();
+ Config::set('app.locale', $settings->locale);
+ Config::set('app.fallback_locale', $this->getFallbackLocale($settings->locale));
+ }
+
+ protected function getFallbackLocale($locale)
+ {
+ if ($position = strpos($locale, '-')) {
+ return substr($locale, 0, $position);
+ }
+
+ return Config::get('app.fallback_locale');
+ }
+
+ /**
+ * Returns available options for the "locale" attribute.
+ * @return array
+ */
+ public function getLocaleOptions()
+ {
+ $locales = Config::get('app.localeOptions', [
+ 'cs' => [Lang::get('system::lang.locale.cs'), 'flag-cz'],
+ 'en' => [Lang::get('system::lang.locale.en'), 'flag-gb'],
+ 'en-au' => [Lang::get('system::lang.locale.en-au'), 'flag-au'],
+ 'de' => [Lang::get('system::lang.locale.de'), 'flag-de'],
+ 'es' => [Lang::get('system::lang.locale.es'), 'flag-es'],
+ 'es-ar' => [Lang::get('system::lang.locale.es-ar'), 'flag-ar'],
+ 'fa' => [Lang::get('system::lang.locale.fa'), 'flag-ir'],
+ 'fr' => [Lang::get('system::lang.locale.fr'), 'flag-fr'],
+ 'fr-ca' => [Lang::get('system::lang.locale.fr-ca'), 'flag-fr'],
+ 'hu' => [Lang::get('system::lang.locale.hu'), 'flag-hu'],
+ 'id' => [Lang::get('system::lang.locale.id'), 'flag-id'],
+ 'it' => [Lang::get('system::lang.locale.it'), 'flag-it'],
+ 'ja' => [Lang::get('system::lang.locale.ja'), 'flag-jp'],
+ 'lv' => [Lang::get('system::lang.locale.lv'), 'flag-lv'],
+ 'nl' => [Lang::get('system::lang.locale.nl'), 'flag-nl'],
+ 'pt-br' => [Lang::get('system::lang.locale.pt-br'), 'flag-br'],
+ 'ro' => [Lang::get('system::lang.locale.ro'), 'flag-ro'],
+ 'ru' => [Lang::get('system::lang.locale.ru'), 'flag-ru'],
+ 'sv' => [Lang::get('system::lang.locale.sv'), 'flag-se'],
+ 'tr' => [Lang::get('system::lang.locale.tr'), 'flag-tr'],
+ 'pl' => [Lang::get('system::lang.locale.pl'), 'flag-pl'],
+ 'sk' => [Lang::get('system::lang.locale.sk'), 'flag-sk'],
+ 'zh-cn' => [Lang::get('system::lang.locale.zh-cn'), 'flag-cn'],
+ 'zh-tw' => [Lang::get('system::lang.locale.zh-tw'), 'flag-tw'],
+ 'nb-no' => [Lang::get('system::lang.locale.nb-no'), 'flag-no'],
+ 'el' => [Lang::get('system::lang.locale.el'), 'flag-gr'],
+ ]);
+
+ // Sort locales alphabetically
+ asort($locales);
+
+ return $locales;
+ }
+
+ public function getTimezoneOptions()
+ {
+ $timezoneIdentifiers = DateTimeZone::listIdentifiers();
+ $utcTime = new DateTime('now', new DateTimeZone('UTC'));
+
+ $tempTimezones = [];
+ foreach ($timezoneIdentifiers as $timezoneIdentifier) {
+ $currentTimezone = new DateTimeZone($timezoneIdentifier);
+
+ $tempTimezones[] = [
+ 'offset' => (int) $currentTimezone->getOffset($utcTime),
+ 'identifier' => $timezoneIdentifier
+ ];
+ }
+
+ // Sort the array by offset, identifier ascending
+ usort($tempTimezones, function($a, $b) {
+ return $a['offset'] === $b['offset']
+ ? strcmp($a['identifier'], $b['identifier'])
+ : $a['offset'] - $b['offset'];
+ });
+
+ $timezoneList = [];
+ foreach ($tempTimezones as $tz) {
+ $sign = $tz['offset'] > 0 ? '+' : '-';
+ $offset = gmdate('H:i', abs($tz['offset']));
+ $timezoneList[$tz['identifier']] = '(UTC ' . $sign . $offset . ') ' . $tz['identifier'];
+ }
+
+ return $timezoneList;
+ }
+
+ public function getEditorThemeOptions()
+ {
+ $themeDir = new DirectoryIterator("modules/backend/formwidgets/codeeditor/assets/vendor/ace/");
+ $themes = [];
+
+ // Iterate through the themes
+ foreach ($themeDir as $node) {
+
+ // If this file is a theme (starting by "theme-")
+ if (!$node->isDir() && substr($node->getFileName(), 0, 6) == 'theme-') {
+ // Remove the theme- prefix and the .js suffix, create an user friendly and capitalized name
+ $themeId = substr($node->getFileName(), 6, -3);
+ $themeName = ucwords(str_replace("_", " ", $themeId));
+
+ // Add the values to the themes array
+ if ($themeId != static::DEFAULT_THEME) {
+ $themes[$themeId] = $themeName;
+ }
+ }
+
+ }
+
+ // Sort the theme alphabetically, and push the default theme
+ asort($themes);
+ return [static::DEFAULT_THEME => ucwords(static::DEFAULT_THEME)] + $themes;
+ }
+}
diff --git a/modules/backend/models/backendpreferences/fields.yaml b/modules/backend/models/backendpreferences/fields.yaml
deleted file mode 100644
index ab5c4bd73..000000000
--- a/modules/backend/models/backendpreferences/fields.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-# ===================================
-# Field Definitions
-# ===================================
-
-fields:
- locale:
- label: backend::lang.backend_preferences.locale
- comment: backend::lang.backend_preferences.locale_comment
- type: dropdown
- span: left
diff --git a/modules/backend/models/editorpreferences/fields.yaml b/modules/backend/models/editorpreferences/fields.yaml
deleted file mode 100644
index 9c360d061..000000000
--- a/modules/backend/models/editorpreferences/fields.yaml
+++ /dev/null
@@ -1,93 +0,0 @@
-# ===================================
-# Field Definitions
-# ===================================
-
-fields:
-
- font_size:
- label: backend::lang.editor.font_size
- span: auto
- type: dropdown
- options:
- 11: 11px
- 12: 12px
- 13: 13px
- 14: 14px
- 15: 15px
- 16: 16px
-
- word_wrap:
- label: backend::lang.editor.word_wrap
- type: dropdown
- span: auto
- options:
- off: Off
- 40: 40 Characters
- 80: 80 Characters
- fluid: Fluid
-
- code_folding:
- label: backend::lang.editor.code_folding
- type: dropdown
- span: auto
- options:
- manual: Off
- markbegin: Mark begin
- markbeginend: Mark begin and end
-
- tab_size:
- label: backend::lang.editor.tab_size
- span: auto
- type: dropdown
- options:
- 2: 2
- 3: 3
- 4: 4
- 5: 5
- 6: 6
- 7: 7
- 8: 8
-
- theme:
- label: backend::lang.editor.theme
- type: dropdown
-
- auto_closing:
- label: backend::lang.editor.auto_closing
- type: checkbox
-
- show_invisibles:
- label: backend::lang.editor.show_invisibles
- type: checkbox
-
- highlight_active_line:
- label: backend::lang.editor.highlight_active_line
- type: checkbox
-
- use_hard_tabs:
- label: backend::lang.editor.use_hard_tabs
- type: checkbox
-
- show_gutter:
- label: backend::lang.editor.show_gutter
- type: checkbox
-
- enable_basic_autocompletion:
- label: backend::lang.editor.enable_basic_autocompletion
- type: checkbox
-
- enable_snippets:
- label: backend::lang.editor.enable_snippets
- type: checkbox
-
- enable_live_autocompletion:
- label: backend::lang.editor.enable_live_autocompletion
- type: checkbox
-
- display_indent_guides:
- label: backend::lang.editor.display_indent_guides
- type: checkbox
-
- show_print_margin:
- label: backend::lang.editor.show_print_margin
- type: checkbox
\ No newline at end of file
diff --git a/modules/backend/models/preferences/fields.yaml b/modules/backend/models/preferences/fields.yaml
new file mode 100644
index 000000000..28b876933
--- /dev/null
+++ b/modules/backend/models/preferences/fields.yaml
@@ -0,0 +1,138 @@
+# ===================================
+# Field Definitions
+# ===================================
+#
+tabs:
+ fields:
+
+ locale:
+ tab: backend::lang.backend_preferences.region
+ label: backend::lang.backend_preferences.locale
+ comment: backend::lang.backend_preferences.locale_comment
+ type: dropdown
+ span: left
+
+ timezone:
+ tab: backend::lang.backend_preferences.region
+ label: backend::lang.backend_preferences.timezone
+ comment: Adjust displayed dates to this timezone.
+ type: dropdown
+ span: left
+
+ editor_preview:
+ type: partial
+ tab: backend::lang.backend_preferences.code_editor
+ path: field_editor_preview
+
+ editor_font_size:
+ label: backend::lang.editor.font_size
+ tab: backend::lang.backend_preferences.code_editor
+ span: auto
+ type: dropdown
+ options:
+ 11: 11px
+ 12: 12px
+ 13: 13px
+ 14: 14px
+ 15: 15px
+ 16: 16px
+
+ editor_word_wrap:
+ label: backend::lang.editor.word_wrap
+ tab: backend::lang.backend_preferences.code_editor
+ type: dropdown
+ span: auto
+ options:
+ off: Off
+ 40: 40 Characters
+ 80: 80 Characters
+ fluid: Fluid
+
+ editor_code_folding:
+ label: backend::lang.editor.code_folding
+ tab: backend::lang.backend_preferences.code_editor
+ type: dropdown
+ span: auto
+ options:
+ manual: Off
+ markbegin: Mark begin
+ markbeginend: Mark begin and end
+
+ editor_tab_size:
+ label: backend::lang.editor.tab_size
+ tab: backend::lang.backend_preferences.code_editor
+ span: auto
+ type: dropdown
+ options:
+ 2: 2
+ 3: 3
+ 4: 4
+ 5: 5
+ 6: 6
+ 7: 7
+ 8: 8
+
+ editor_theme:
+ label: backend::lang.editor.theme
+ tab: backend::lang.backend_preferences.code_editor
+ type: dropdown
+
+ editor_auto_closing:
+ label: backend::lang.editor.auto_closing
+ tab: backend::lang.backend_preferences.code_editor
+ type: checkbox
+ span: auto
+
+ editor_show_invisibles:
+ label: backend::lang.editor.show_invisibles
+ tab: backend::lang.backend_preferences.code_editor
+ type: checkbox
+ span: auto
+
+ editor_highlight_active_line:
+ label: backend::lang.editor.highlight_active_line
+ tab: backend::lang.backend_preferences.code_editor
+ type: checkbox
+ span: auto
+
+ editor_use_hard_tabs:
+ label: backend::lang.editor.use_hard_tabs
+ tab: backend::lang.backend_preferences.code_editor
+ type: checkbox
+ span: auto
+
+ editor_show_gutter:
+ label: backend::lang.editor.show_gutter
+ tab: backend::lang.backend_preferences.code_editor
+ type: checkbox
+ span: auto
+
+ editor_enable_basic_autocompletion:
+ label: backend::lang.editor.enable_basic_autocompletion
+ tab: backend::lang.backend_preferences.code_editor
+ type: checkbox
+ span: auto
+
+ editor_enable_snippets:
+ label: backend::lang.editor.enable_snippets
+ tab: backend::lang.backend_preferences.code_editor
+ type: checkbox
+ span: auto
+
+ editor_enable_live_autocompletion:
+ label: backend::lang.editor.enable_live_autocompletion
+ tab: backend::lang.backend_preferences.code_editor
+ type: checkbox
+ span: auto
+
+ editor_display_indent_guides:
+ label: backend::lang.editor.display_indent_guides
+ tab: backend::lang.backend_preferences.code_editor
+ type: checkbox
+ span: auto
+
+ editor_show_print_margin:
+ label: backend::lang.editor.show_print_margin
+ tab: backend::lang.backend_preferences.code_editor
+ type: checkbox
+ span: auto