diff --git a/modules/backend/assets/css/october.css b/modules/backend/assets/css/october.css index 8f1398267..bb8c12f61 100644 --- a/modules/backend/assets/css/october.css +++ b/modules/backend/assets/css/october.css @@ -250,8 +250,8 @@ .tooltip.in{opacity:1;filter:alpha(opacity=100)} .oc-logo-white{background-image:url(../images/october-logo-white.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:contain} .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)} +.layout.control-tabs.oc-logo-transparent:not(.has-tabs),.flex-layout-column.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,.flex-layout-column.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;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} diff --git a/modules/backend/assets/js/october.treeview.js b/modules/backend/assets/js/october.treeview.js index 2e51918b9..1a22d60b9 100644 --- a/modules/backend/assets/js/october.treeview.js +++ b/modules/backend/assets/js/october.treeview.js @@ -71,6 +71,7 @@ TreeView.prototype.dispose = function() { this.unregisterHandlers() + this.clearScrollTimeout() this.options = null this.$el.removeData('oc.treeView') @@ -210,6 +211,7 @@ useAnimation: false, usePlaceholderClone: true, handle: 'span.drag-handle', + onDrag: this.proxy(this.onDrag), tolerance: -20 // Give 20px of carry between containers }) @@ -295,6 +297,66 @@ this.toggleGroup($(ev.currentTarget).closest('li')) return false } + + // TREEVIEW SCROLL ON DRAG + // ============================ + + TreeView.prototype.onDrag = function ($item, position, _super, event) { + + this.dragCallback = function() { + _super($item, position, null, event) + }; + + this.clearScrollTimeout() + this.dragCallback() + + if (!this.$scrollbar || this.$scrollbar.length === 0) + return + + if (position.top < 0) + this.scrollOffset = -10 + Math.floor(position.top / 5) + else if (position.top > this.$scrollbar.height()) + this.scrollOffset = 10 + Math.ceil((position.top - this.$scrollbar.height()) / 5) + else + return + + this.scrollMax = function() { + return this.$el.height() - this.$scrollbar.height() + }; + + this.dragScroll() + } + + TreeView.prototype.dragScroll = function() { + var startScrollTop = this.$scrollbar.scrollTop() + var changed + + this.scrollTimeout = null + + this.$scrollbar.scrollTop( Math.min(startScrollTop + this.scrollOffset, this.scrollMax()) ) + changed = this.$scrollbar.scrollTop() - startScrollTop + if (changed === 0) + return + + this.$el.children('ol').each(function() { + var sortable = $(this).data('oc.sortable') + + sortable.refresh() + sortable.cursorAdjustment.top -= changed // Keep cursor adjustment in sync with scroll + }); + + this.dragCallback() + this.$scrollbar.data('oc.scrollbar').setThumbPosition() // Update scrollbar position + + this.scrollTimeout = window.setTimeout(this.proxy(this.dragScroll), 100) + } + + TreeView.prototype.clearScrollTimeout = function() { + if (this.scrollTimeout) { + window.clearTimeout(this.scrollTimeout) + this.scrollTimeout = null + } + } // TREEVIEW PLUGIN DEFINITION // ============================ diff --git a/modules/backend/assets/less/controls/common.less b/modules/backend/assets/less/controls/common.less index 59346d211..542c6e3a6 100644 --- a/modules/backend/assets/less/controls/common.less +++ b/modules/backend/assets/less/controls/common.less @@ -45,8 +45,8 @@ } .layout.control-tabs.oc-logo-transparent:not(.has-tabs), -.layout-cell.oc-logo-transparent, -.flex-layout-column.oc-logo-transparent { +.flex-layout-column.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); diff --git a/modules/backend/behaviors/ImportExportController.php b/modules/backend/behaviors/ImportExportController.php index 0829a4c4f..be0fc6fb6 100644 --- a/modules/backend/behaviors/ImportExportController.php +++ b/modules/backend/behaviors/ImportExportController.php @@ -8,6 +8,7 @@ use Backend; use BackendAuth; use Backend\Classes\ControllerBehavior; use Backend\Behaviors\ImportExportController\TranscodeFilter; +use Illuminate\Database\Eloquent\MassAssignmentException; use League\Csv\Reader as CsvReader; use League\Csv\Writer as CsvWriter; use ApplicationException; @@ -189,6 +190,12 @@ class ImportExportController extends ControllerBehavior $this->vars['importResults'] = $model->getResultStats(); $this->vars['returnUrl'] = $this->getRedirectUrlForType('import'); } + catch (MassAssignmentException $ex) { + $this->controller->handleError(new ApplicationException(Lang::get( + 'backend::lang.model.mass_assignment_failed', + ['attribute' => $ex->getMessage()] + ))); + } catch (Exception $ex) { $this->controller->handleError($ex); } @@ -411,6 +418,12 @@ class ImportExportController extends ControllerBehavior $this->vars['fileUrl'] = $fileUrl; $this->vars['returnUrl'] = $this->getRedirectUrlForType('export'); } + catch (MassAssignmentException $ex) { + $this->controller->handleError(new ApplicationException(Lang::get( + 'backend::lang.model.mass_assignment_failed', + ['attribute' => $ex->getMessage()] + ))); + } catch (Exception $ex) { $this->controller->handleError($ex); } diff --git a/modules/backend/behaviors/ListController.php b/modules/backend/behaviors/ListController.php index 0d23cfc32..231693695 100644 --- a/modules/backend/behaviors/ListController.php +++ b/modules/backend/behaviors/ListController.php @@ -313,7 +313,7 @@ class ListController extends ControllerBehavior Flash::error(Lang::get('backend::lang.list.delete_selected_empty')); } - return $this->controller->listRefresh(); + return $this->controller->listRefresh($definition); } /** diff --git a/modules/backend/behaviors/RelationController.php b/modules/backend/behaviors/RelationController.php index baf81e02a..51c9aa3f7 100644 --- a/modules/backend/behaviors/RelationController.php +++ b/modules/backend/behaviors/RelationController.php @@ -30,6 +30,11 @@ class RelationController extends ControllerBehavior */ const PARAM_MODE = '_relation_mode'; + /** + * @var const Postback parameter for read only mode. + */ + const PARAM_READ_ONLY = '_relation_read_only'; + /** * @var Backend\Classes\WidgetBase Reference to the search widget object. */ @@ -237,6 +242,7 @@ class RelationController extends ControllerBehavior $this->vars['relationViewWidget'] = $this->viewWidget; $this->vars['relationViewModel'] = $this->viewModel; $this->vars['relationPivotWidget'] = $this->pivotWidget; + $this->vars['relationReadOnly'] = $this->readOnly ? 1 : 0; $this->vars['relationSessionKey'] = $this->relationGetSessionKey(); } @@ -310,7 +316,6 @@ class RelationController extends ControllerBehavior $this->relationObject = $this->model->{$field}(); $this->relationModel = $this->relationObject->getRelated(); - $this->readOnly = $this->getConfig('readOnly'); $this->deferredBinding = $this->getConfig('deferredBinding') || !$this->model->exists; $this->toolbarButtons = $this->evalToolbarButtons(); $this->viewMode = $this->evalViewMode(); @@ -358,6 +363,13 @@ class RelationController extends ControllerBehavior $this->pivotWidget->bindToController(); } } + + /* + * Read only mode + */ + if (post(self::PARAM_READ_ONLY, $this->getConfig('readOnly'))) { + $this->makeReadOnly(); + } } /** @@ -374,8 +386,6 @@ class RelationController extends ControllerBehavior $options = ['sessionKey' => $options]; } - $this->prepareVars(); - /* * Session key */ @@ -383,6 +393,15 @@ class RelationController extends ControllerBehavior $this->sessionKey = $options['sessionKey']; } + /* + * Read only mode + */ + if (isset($options['readOnly']) && $options['readOnly']) { + $this->makeReadOnly(); + } + + $this->prepareVars(); + /* * Determine the partial to use based on the supplied section option */ @@ -506,11 +525,9 @@ class RelationController extends ControllerBehavior /* * Add buttons to toolbar */ - $defaultButtons = null; - - if (!$this->readOnly && $this->toolbarButtons) { - $defaultButtons = '~/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm'; - } + $defaultButtons = $this->toolbarButtons + ? '~/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm' + : null; $defaultConfig['buttons'] = $this->getConfig('view[toolbarPartial]', $defaultButtons); @@ -578,14 +595,15 @@ class RelationController extends ControllerBehavior $config->showSorting = $this->getConfig('view[showSorting]', true); $config->defaultSort = $this->getConfig('view[defaultSort]'); $config->recordsPerPage = $this->getConfig('view[recordsPerPage]'); - $config->showCheckboxes = $this->getConfig('view[showCheckboxes]', !$this->readOnly); + $config->showCheckboxes = $this->getConfig('view[showCheckboxes]', true); $config->recordUrl = $this->getConfig('view[recordUrl]', null); $defaultOnClick = sprintf( - "$.oc.relationBehavior.clickViewListRecord(':%s', '%s', '%s')", + "$.oc.relationBehavior.clickViewListRecord(':%s', '%s', '%s', %s)", $this->relationModel->getKeyName(), $this->field, - $this->relationGetSessionKey() + $this->relationGetSessionKey(), + $this->readOnly ? 1 : 0 ); if ($config->recordUrl) { @@ -604,10 +622,30 @@ class RelationController extends ControllerBehavior $config->noRecordsMessage = $emptyMessage; } + $widget = $this->makeWidget('Backend\Widgets\Lists', $config); + + /* + * Apply defined constraints + */ + if ($sqlConditions = $this->getConfig('view[conditions]')) { + $widget->bindEvent('list.extendQueryBefore', function($query) use ($sqlConditions) { + $query->whereRaw($sqlConditions); + }); + } + elseif ($scopeMethod = $this->getConfig('view[scope]')) { + $widget->bindEvent('list.extendQueryBefore', function($query) use ($scopeMethod) { + $query->$scopeMethod(); + }); + } + else { + $widget->bindEvent('list.extendQueryBefore', function($query) { + $this->relationObject->addDefinedConstraintsToQuery($query); + }); + } + /* * Constrain the query by the relationship and deferred items */ - $widget = $this->makeWidget('Backend\Widgets\Lists', $config); $widget->bindEvent('list.extendQuery', function ($query) { $this->relationObject->setQuery($query); @@ -1024,9 +1062,8 @@ class RelationController extends ControllerBehavior */ if ($this->viewMode == 'multi') { if (($checkedIds = post('checked')) && is_array($checkedIds)) { - $relatedModel = $this->relationObject->getRelated(); - foreach ($checkedIds as $relationId) { - if (!$obj = $relatedModel->find($relationId)) { + foreach ($checkedIds as $relationId) { + if (!$obj = $this->relationModel->find($relationId)) { continue; } @@ -1116,6 +1153,8 @@ class RelationController extends ControllerBehavior $this->beforeAjax(); $recordId = post('record_id'); + $sessionKey = $this->deferredBinding ? $this->relationGetSessionKey() : null; + $relatedModel = $this->relationModel; /* * Remove @@ -1125,22 +1164,12 @@ class RelationController extends ControllerBehavior $checkedIds = $recordId ? [$recordId] : post('checked'); if (is_array($checkedIds)) { + $foreignKeyName = $relatedModel->getKeyName(); - if ($this->relationType == 'belongsToMany' - || $this->relationType == 'morphToMany' - || $this->relationType == 'morphedByMany' - ) { - $this->relationObject->detach($checkedIds); + $models = $relatedModel->whereIn($foreignKeyName, $checkedIds)->get(); + foreach ($models as $model) { + $this->relationObject->remove($model, $sessionKey); } - elseif ($this->relationType == 'hasMany' || $this->relationType == 'morphMany') { - $relatedModel = $this->relationObject->getRelated(); - foreach ($checkedIds as $relationId) { - if ($obj = $relatedModel->find($relationId)) { - $this->relationObject->remove($obj); - } - } - } - } } /* @@ -1152,11 +1181,11 @@ class RelationController extends ControllerBehavior $this->relationObject->getParent()->save(); } elseif ($this->relationType == 'hasOne' || $this->relationType == 'morphOne') { - if ($obj = $this->relationModel->find($recordId)) { - $this->relationObject->remove($obj); + if ($obj = $relatedModel->find($recordId)) { + $this->relationObject->remove($obj, $sessionKey); } elseif ($this->viewModel->exists) { - $this->relationObject->remove($this->viewModel); + $this->relationObject->remove($this->viewModel, $sessionKey); } } @@ -1449,6 +1478,22 @@ class RelationController extends ControllerBehavior return $context; } + /** + * Apply read only mode. + */ + protected function makeReadOnly() + { + $this->readOnly = true; + + if ($this->toolbarWidget && !$this->getConfig('view[toolbarPartial]', false)) { + $this->toolbarWidget->buttons = null; + } + + if ($this->viewWidget && $this->viewMode == 'multi' && !$this->getConfig('view[showCheckboxes]', false)) { + $this->viewWidget->showCheckboxes = false; + } + } + /** * Returns the configuration for a mode (view, manage, pivot) for an * expected type (list, form). Uses fallback configuration. diff --git a/modules/backend/behaviors/relationcontroller/assets/js/october.relation.js b/modules/backend/behaviors/relationcontroller/assets/js/october.relation.js index 5e13a2810..85c052814 100644 --- a/modules/backend/behaviors/relationcontroller/assets/js/october.relation.js +++ b/modules/backend/behaviors/relationcontroller/assets/js/october.relation.js @@ -9,7 +9,7 @@ $(el).closest('.control-list').listWidget('toggleChecked', [el]) } - this.clickViewListRecord = function(recordId, relationField, sessionKey) { + this.clickViewListRecord = function(recordId, relationField, sessionKey, readOnly) { var newPopup = $('') newPopup.popup({ @@ -18,7 +18,8 @@ extraData: { 'manage_id': recordId, '_relation_field': relationField, - '_session_key': sessionKey + '_session_key': sessionKey, + '_relation_read_only': readOnly ? 1 : 0 } }) } diff --git a/modules/backend/behaviors/relationcontroller/partials/_container.htm b/modules/backend/behaviors/relationcontroller/partials/_container.htm index 9b2ddc976..e23b39885 100644 --- a/modules/backend/behaviors/relationcontroller/partials/_container.htm +++ b/modules/backend/behaviors/relationcontroller/partials/_container.htm @@ -1,11 +1,12 @@
relationRenderToolbar()): ?>
- +
@@ -14,4 +15,4 @@ relationRenderView() ?>
- \ No newline at end of file + diff --git a/modules/backend/behaviors/reordercontroller/partials/_records.htm b/modules/backend/behaviors/reordercontroller/partials/_records.htm index c85ac1814..a1cdf4fd7 100644 --- a/modules/backend/behaviors/reordercontroller/partials/_records.htm +++ b/modules/backend/behaviors/reordercontroller/partials/_records.htm @@ -1,10 +1,10 @@ -
  • +
  • reorderGetRecordName($record) ?> - +
    diff --git a/modules/backend/classes/Controller.php b/modules/backend/classes/Controller.php index 35426d156..f8230a40f 100644 --- a/modules/backend/classes/Controller.php +++ b/modules/backend/classes/Controller.php @@ -511,7 +511,7 @@ class Controller extends Extendable throw new SystemException(Lang::get('backend::lang.widget.not_bound', ['name'=>$widgetName])); } - if (($widget = $this->widget->{$widgetName}) && method_exists($widget, $handlerName)) { + if (($widget = $this->widget->{$widgetName}) && $widget->methodExists($handlerName)) { $result = call_user_func_array([$widget, $handlerName], $this->params); return ($result) ?: true; } @@ -542,7 +542,7 @@ class Controller extends Extendable $this->execPageAction($this->action, $this->params); foreach ((array) $this->widget as $widget) { - if (method_exists($widget, $handler)) { + if ($widget->methodExists($handler)) { $result = call_user_func_array([$widget, $handler], $this->params); return ($result) ?: true; } diff --git a/modules/backend/formwidgets/DatePicker.php b/modules/backend/formwidgets/DatePicker.php index b02cdb87a..9bf8e1f1f 100644 --- a/modules/backend/formwidgets/DatePicker.php +++ b/modules/backend/formwidgets/DatePicker.php @@ -89,14 +89,10 @@ class DatePicker extends FormWidgetBase if ($value = $this->getLoadValue()) { - $value = $value instanceof Carbon ? $value->toDateTimeString() : $value; - /* - * Time - */ - if (strlen($value) <= 8) { - $value = Carbon::now()->toDateString() . ' ' . $value; - } + $value = DateTimeHelper::makeCarbon($value, false); + + $value = $value instanceof Carbon ? $value->toDateTimeString() : $value; } /* diff --git a/modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/fr.js b/modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/fr.js index 8acdf0dfb..56c26b50d 100644 --- a/modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/fr.js +++ b/modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/fr.js @@ -80,7 +80,7 @@ $.FE.LANGUAGE['fr'] = { "Insert Image": "Ins\u00e9rer une image", "Upload Image": "T\u00e9l\u00e9charger une image", "By URL": "Par URL", - "Browse": "Feuilleter", + "Browse": "Parcourir", "Drop image": "D\u00e9posez l'image", "or click": "ou cliquez", "Manage Images": "Gestion des images", @@ -104,6 +104,9 @@ $.FE.LANGUAGE['fr'] = { "Insert Video": "Ins\u00e9rer une vid\u00e9o", "Embedded Code": "Code embarqu\u00e9", + // Audio + "Insert Audio": "Ins\u00e9rer un m\u00e9dia sonore", + // Tables "Insert Table": "Ins\u00e9rer un tableau", "Table Header": "Ent\u00eate de tableau", @@ -135,6 +138,7 @@ $.FE.LANGUAGE['fr'] = { // Files "Upload File": "T\u00e9l\u00e9charger le fichier", "Drop file": "D\u00e9posez le fichier", + "Insert File": "Ins\u00e9rer un fichier", // Emoticons "Emoticons": "\u00c9motic\u00f4nes", @@ -219,7 +223,7 @@ $.FE.LANGUAGE['fr'] = { "Select All": "Tout s\u00e9lectionner", // Code view - "Code View": "Vue de code", + "Code View": "Voir le code source", // Quote "Quote": "Citer", diff --git a/modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/hu.js b/modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/hu.js index dd46a2ba2..cfc4607cc 100644 --- a/modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/hu.js +++ b/modules/backend/formwidgets/richeditor/assets/vendor/froala/js/languages/hu.js @@ -49,7 +49,7 @@ $.FE.LANGUAGE['hu'] = { "Heading 4": "C\u00edmsor 4", // Style - "Paragraph Style": "Bekezd\u00e9s st\u00edlus\u00e1t", + "Paragraph Style": "Bekezd\u00e9s st\u00edlusa", "Inline Style": " Helyi st\u00edlus", // Alignment @@ -102,7 +102,10 @@ $.FE.LANGUAGE['hu'] = { // Video "Insert Video": "Vide\u00f3 beilleszt\u00e9se", - "Embedded Code": "Vide\u00f3 be\u00e1gyazása", + "Embedded Code": "K\u00f3d bem\u00e1sol\u00e1sa", + + // Audio + "Insert Audio": "Audi\u00f3 beilleszt\u00e9se", // Tables "Insert Table": "T\u00e1bl\u00e1zat beilleszt\u00e9se", @@ -134,7 +137,8 @@ $.FE.LANGUAGE['hu'] = { // Files "Upload File": "F\u00e1jl felt\u00f6lt\u00e9se", - "Drop file": "H\u00fazza ide a f\u00e1jl", + "Drop file": "H\u00fazza ide a f\u00e1jlt", + "Insert File": "F\u00e1jl beilleszt\u00e9se", // Emoticons "Emoticons": "Hangulatjelek", diff --git a/modules/backend/lang/de/lang.php b/modules/backend/lang/de/lang.php index 31949a660..ae66e88a1 100644 --- a/modules/backend/lang/de/lang.php +++ b/modules/backend/lang/de/lang.php @@ -285,7 +285,7 @@ return [ 'locale_comment' => 'Wählen Sie Ihre gewünschte Sprache für das Backend.', ], 'access_log' => [ - 'hint' => 'Dieser Log zeigt eine Liste mit erfolgreichen Anmelde-Verscuhen von Administratoren. Die Aufzeichnungen bleiben erhalten für :days Tage.', + 'hint' => 'Dieser Log zeigt eine Liste mit erfolgreichen Anmelde-Versuchen von Administratoren. Die Aufzeichnungen bleiben erhalten für :days Tage.', 'menu_label' => 'Zugriffslog', 'menu_description' => 'Sehen Sie sich eine Liste mit erfolgreichen Backend Benutzeranmeldungen an.', 'created_at' => 'Datum & Uhrzeit', diff --git a/modules/backend/lang/hu/lang.php b/modules/backend/lang/hu/lang.php index 874d64cc3..6588cd9a8 100644 --- a/modules/backend/lang/hu/lang.php +++ b/modules/backend/lang/hu/lang.php @@ -2,7 +2,7 @@ return [ 'auth' => [ - 'title' => 'Adminisztrációs oldal' + 'title' => 'Admin felület' ], 'field' => [ 'invalid_type' => 'A(z) :type mezőtípus érvénytelen.', @@ -19,6 +19,11 @@ return [ 'help' => 'Ön nem rendelkezik a szükséges engedélyekkel ennek a lapnak a megtekintéséhez.', 'cms_link' => 'Vissza a látogatói oldalra' ], + 'no_database' => [ + 'label' => 'Hiányzó adatbázis', + 'help' => 'Az admin felület eléréséhez szükséges az adatbázis. Kérjük ellenőrizze a hozzáférési adatok helyességét majd próbálja újra.', + 'cms_link' => 'Vissza a weboldalra' + ], 'invalid_token' => [ 'label' => 'Érvénytelen a biztonsági kód.' ] @@ -123,6 +128,10 @@ return [ 'allow' => 'Engedélyezés', 'inherit' => 'Öröklés', 'deny' => 'Tiltás', + 'activated' => 'Aktivált', + 'last_login' => 'Bejelentkezve', + 'created_at' => 'Létrehozva', + 'updated_at' => 'Módosítva', 'group' => [ 'name' => 'Csoport', 'name_comment' => 'A név a csoport létrehozásnál és szerkesztésnél jelenik meg.', @@ -165,7 +174,7 @@ return [ 'records_per_page' => 'Listázás', 'records_per_page_help' => 'Adja meg az elemek laponként megjelenítendő számát. Minél nagyobbat választ, annál több időbe kerül a lista frissítése. Az ajánlott érték 20 és 40 közötti.', 'check' => 'Bejelöl', - 'delete_selected' => 'Kiválasztottak törlése', + 'delete_selected' => 'Eltávolítás', 'delete_selected_empty' => 'A törléshez előbb ki kell választani elemet.', 'delete_selected_confirm' => 'Töröljük a kiválasztott elemeket?', 'delete_selected_success' => 'Sikeresen törölve lettek a kiválasztott elemek.', @@ -322,16 +331,16 @@ return [ 'theme' => 'Színséma', 'markup_styles' => 'Stílusok', 'custom_styles' => 'Egyéni megjelenés', - 'custom styles_comment' => 'Saját stílusok megadása, amik a HTML szerkesztőre is vonatkoznak.', - 'markup_classes' => 'CSS osztályok', + 'custom styles_comment' => 'Saját stílusok és megjelenések megadása.', + 'markup_classes' => 'Értékek', 'paragraph' => 'Bekezdés', 'link' => 'Hivatkozás', 'table' => 'Táblázat', 'table_cell' => 'Táblázat cella', 'image' => 'Kép', - 'label' => 'Címke', - 'class_name' => 'Osztály neve', - 'markup_tags' => 'HTML elemek', + 'label' => 'Megnevezés', + 'class_name' => 'CSS osztály', + 'markup_tags' => 'Szabályok', 'allowed_empty_tags' => 'Engedélyezett üres elemek', 'allowed_empty_tags_comment' => 'Azon HTML elemek, amik üres érték esetén sem lesznek eltávolítva.', 'allowed_tags' => 'Engedélyezett elemek', @@ -381,7 +390,7 @@ return [ 'region' => 'Régió', 'code_editor' => 'Kódszerkesztő', 'timezone' => 'Időzóna', - 'timezone_comment' => 'Dátumok megjelenítése a választott időzóna alapján.', + 'timezone_comment' => 'Válassza ki az alapértelmezett időzónát.', 'locale' => 'Nyelv', 'locale_comment' => 'Válassza ki az alapértelmezett nyelvet.' ], @@ -447,7 +456,7 @@ return [ 'required_match_column_error' => 'Please specify a match for the required field :label.', 'empty_export_columns_error' => 'Kérjük adjon meg néhány oszlopot az exportáláshoz.', 'behavior_missing_uselist_error' => 'You must implement the controller behavior ListController with the export "useList" option enabled.', - 'missing_model_class_error' => 'Please specify the modelClass property for :type', + 'missing_model_class_error' => 'Kérjük adja meg a modelClass tulajdonságát ehhez: :type', 'missing_column_id_error' => 'Hiányzó oszlop azonosító', 'unknown_column_error' => 'Ismeretlen oszlop', 'encoding_not_supported_error' => 'Source file encoding is not recognized. Please select the custom file format option with the proper encoding to import your file.', diff --git a/modules/backend/lang/zh-cn/lang.php b/modules/backend/lang/zh-cn/lang.php index 785868aa0..d7ecd4ddb 100644 --- a/modules/backend/lang/zh-cn/lang.php +++ b/modules/backend/lang/zh-cn/lang.php @@ -79,7 +79,7 @@ return [ 'login' => '登录', 'first_name' => '名', 'last_name' => '姓', - 'full_name' => '全民', + 'full_name' => '全名', 'email' => '邮件', 'groups' => '团队', 'groups_comment' => '指明这个人属于哪个组.', @@ -99,9 +99,11 @@ return [ 'deny' => '拒绝', 'group' => [ 'name' => '组', + 'name_comment' => '该名字将在群组列表中展示', 'name_field' => '名字', 'description_field' => '描述', - 'is_new_user_default_field' => '默认增加新管理员到这个组', + 'is_new_user_default_field_label' => '默认组', + 'is_new_user_default_field_comment' => '默认增加新管理员到这个组', 'code_field' => '代码', 'code_comment' => '如果你想访问 API, 请输入唯一码.', 'menu_label' => '群组', diff --git a/modules/backend/layouts/_custom_styles.htm b/modules/backend/layouts/_custom_styles.htm index f6f8e564e..8eec0413b 100644 --- a/modules/backend/layouts/_custom_styles.htm +++ b/modules/backend/layouts/_custom_styles.htm @@ -2,7 +2,7 @@ use Backend\Models\BrandSetting; use Backend\Models\EditorSetting; ?> - + diff --git a/modules/backend/layouts/_head.htm b/modules/backend/layouts/_head.htm index 703aec579..25ba87ed4 100644 --- a/modules/backend/layouts/_head.htm +++ b/modules/backend/layouts/_head.htm @@ -1,4 +1,5 @@ + diff --git a/modules/backend/layouts/auth.htm b/modules/backend/layouts/auth.htm index 4fe2bec22..141268a91 100644 --- a/modules/backend/layouts/auth.htm +++ b/modules/backend/layouts/auth.htm @@ -2,6 +2,7 @@ + diff --git a/modules/backend/models/BrandSetting.php b/modules/backend/models/BrandSetting.php index 718ecc880..253d537a1 100644 --- a/modules/backend/models/BrandSetting.php +++ b/modules/backend/models/BrandSetting.php @@ -1,9 +1,12 @@ app_name = Lang::get('system::lang.app.name'); - $this->app_tagline = Lang::get('system::lang.app.tagline'); + $config = App::make('config'); - $this->primary_color = self::PRIMARY_COLOR; - $this->secondary_color = self::SECONDARY_COLOR; - $this->accent_color = self::ACCENT_COLOR; - - $this->menu_mode = self::INLINE_MENU; + $this->app_name = $config->get('brand.appName', Lang::get('system::lang.app.name')); + $this->app_tagline = $config->get('brand.tagline', Lang::get('system::lang.app.tagline')); + $this->primary_color = $config->get('brand.primaryColor', self::PRIMARY_COLOR); + $this->secondary_color = $config->get('brand.secondaryColor', self::SECONDARY_COLOR); + $this->accent_color = $config->get('brand.accentColor', self::ACCENT_COLOR); + $this->menu_mode = $config->get('brand.menuMode', self::INLINE_MENU); } public function afterSave() @@ -66,11 +69,12 @@ class BrandSetting extends Model public static function getLogo() { $settings = self::instance(); - if (!$settings->logo) { - return null; + + if ($settings->logo) { + return $settings->logo->getPath(); } - return $settings->logo->getPath(); + return self::getDefaultLogo() ?: null; } public static function renderCss() @@ -93,22 +97,21 @@ class BrandSetting extends Model public static function compileCss() { $parser = new Less_Parser(['compress' => true]); + $basePath = base_path('modules/backend/models/brandsetting'); $primaryColor = self::get('primary_color', self::PRIMARY_COLOR); $secondaryColor = self::get('secondary_color', self::PRIMARY_COLOR); $accentColor = self::get('accent_color', self::ACCENT_COLOR); - $vars = [ + $parser->ModifyVars([ 'logo-image' => "'".self::getLogo()."'", 'brand-primary' => $primaryColor, 'brand-secondary' => $secondaryColor, 'brand-accent' => $accentColor, - ]; - - $parser->ModifyVars($vars); + ]); $parser->parse( - File::get(base_path().'/modules/backend/models/brandsetting/custom.less') . + File::get($basePath . '/custom.less') . self::get('custom_css') ); @@ -116,4 +119,25 @@ class BrandSetting extends Model return $css; } + + // + // Base line configuration + // + + public static function isBaseConfigured() + { + return !!Config::get('brand'); + } + + public static function getDefaultLogo() + { + $logoPath = File::symbolizePath(Config::get('brand.logoPath')); + + if ($logoPath && File::exists($logoPath)) { + return Url::asset(File::localToPublic($logoPath)); + } + + return null; + } + } diff --git a/modules/backend/models/brandsetting/custom.less b/modules/backend/models/brandsetting/custom.less index 582ca4372..c383b306f 100644 --- a/modules/backend/models/brandsetting/custom.less +++ b/modules/backend/models/brandsetting/custom.less @@ -132,6 +132,13 @@ table.table.data { } } +.fancy-layout .control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed, +.fancy-layout.control-tabs.secondary-tabs.secondary-content-tabs.primary-collapsed { + > div > ul.nav-tabs { + background: @brand-secondary; + } +} + .control-filelist ul li.active > a:after { background: @brand-secondary; } diff --git a/modules/cms/classes/Controller.php b/modules/cms/classes/Controller.php index 3c2b5a255..cecf15180 100644 --- a/modules/cms/classes/Controller.php +++ b/modules/cms/classes/Controller.php @@ -1268,13 +1268,13 @@ class Controller public function findComponentByHandler($handler) { foreach ($this->page->components as $component) { - if (method_exists($component, $handler)) { + if ($component->methodExists($handler)) { return $component; } } foreach ($this->layout->components as $component) { - if (method_exists($component, $handler)) { + if ($component->methodExists($handler)) { return $component; } } diff --git a/modules/cms/lang/hu/lang.php b/modules/cms/lang/hu/lang.php index 62b6f1543..b2b1e13df 100644 --- a/modules/cms/lang/hu/lang.php +++ b/modules/cms/lang/hu/lang.php @@ -94,7 +94,8 @@ return [ 'settings_menu' => 'Karbantartás', 'settings_menu_description' => 'Szolgáltatás aktiválása és testreszabása.', 'is_enabled' => 'Karbantartás engedélyezése', - 'is_enabled_comment' => 'Aktiválása esetén a weboldal látogatói csak a kiválasztott lapot fogják látni.' + 'is_enabled_comment' => 'Aktiválása esetén a weboldal látogatói csak a kiválasztott lapot fogják látni.', + 'hint' => 'Karbantartás módban a lentebb megadott lap fog megjelenni azon látogatók számára, akik nincsennek bejelentkezve az admin felületre.' ], 'page' => [ 'not_found_name' => "A következő lap nem található: ':name'", diff --git a/modules/cms/lang/zh-cn/lang.php b/modules/cms/lang/zh-cn/lang.php index baf99f483..c1ad74dcc 100644 --- a/modules/cms/lang/zh-cn/lang.php +++ b/modules/cms/lang/zh-cn/lang.php @@ -10,7 +10,8 @@ return [ 'invalid_file_extension'=>'不合法的文件扩展: :invalid. 允许的扩展: :allowed.', 'error_deleting' => "删除模板文件 ':name' 错误. 请检查写权限.", 'delete_success' => '模板成功删除: :count.', - 'file_name_required' => '需要文件名字段.' + 'file_name_required' => '需要文件名字段.', + 'safe_mode_enabled' => '安全模式已经启用.', ], 'dashboard' => [ 'active_theme' => [ @@ -91,7 +92,8 @@ return [ 'settings_menu' => '维护模式', 'settings_menu_description' => '配置维护模式页面和开关设置.', 'is_enabled' => '启用维护模式', - 'is_enabled_comment' => '当启用时, 网站访问者会看到下述页面.' + 'is_enabled_comment' => '当启用时, 网站访问者会看到下述页面.', + 'hint' => '维护模式将对未登陆后台的访客展示维护页面.', ], 'page' => [ 'not_found_name' => "页面 ':name' 找不到", @@ -237,7 +239,8 @@ return [ 'manage_pages' => '管理页面', 'manage_layouts' => '管理布局', 'manage_partials' => '管理部件', - 'manage_themes' => '管理主题' + 'manage_themes' => '管理主题', + 'manage_media' => '管理媒体' ], 'media' => [ 'invalid_path' => "不合法的路径: ':path'.", diff --git a/modules/cms/widgets/MediaManager.php b/modules/cms/widgets/MediaManager.php index ae5b23922..1670db4fc 100644 --- a/modules/cms/widgets/MediaManager.php +++ b/modules/cms/widgets/MediaManager.php @@ -279,6 +279,10 @@ class MediaManager extends WidgetBase throw new ApplicationException(Lang::get('cms::lang.asset.invalid_name')); } + if (!$this->validateFileType($newName)) { + throw new ApplicationException(Lang::get('cms::lang.media.type_blocked')); + } + $originalPath = Input::get('originalPath'); $originalPath = MediaLibrary::validatePath($originalPath); @@ -307,6 +311,10 @@ class MediaManager extends WidgetBase throw new ApplicationException(Lang::get('cms::lang.asset.invalid_name')); } + if (!$this->validateFileType($name)) { + throw new ApplicationException(Lang::get('cms::lang.media.type_blocked')); + } + $path = Input::get('path'); $path = MediaLibrary::validatePath($path); @@ -978,14 +986,6 @@ class MediaManager extends WidgetBase $extension = strtolower($uploadedFile->getClientOriginalExtension()); $fileName = File::name($fileName).'.'.$extension; - /* - * Check for unsafe file extensions - */ - $blockedFileTypes = FileDefinitions::get('blockedExtensions'); - if (in_array($extension, $blockedFileTypes)) { - throw new ApplicationException(Lang::get('cms::lang.media.type_blocked')); - } - /* * File name contains non-latin characters, attempt to slug the value */ @@ -994,6 +994,13 @@ class MediaManager extends WidgetBase $fileName = $fileNameClean . '.' . $extension; } + /* + * Check for unsafe file extensions + */ + if (!$this->validateFileType($fileName)) { + throw new ApplicationException(Lang::get('cms::lang.media.type_blocked')); + } + // See mime type handling in the asset manager if (!$uploadedFile->isValid()) { throw new ApplicationException($uploadedFile->getErrorMessage()); @@ -1023,7 +1030,7 @@ class MediaManager extends WidgetBase /** * Validate a proposed media item file name. * @param string - * @return string + * @return bool */ protected function validateFileName($name) { @@ -1038,6 +1045,24 @@ class MediaManager extends WidgetBase return true; } + /** + * Check for blocked / unsafe file extensions + * @param string + * @return bool + */ + protected function validateFileType($name) + { + $extension = strtolower(File::extension($name)); + + $blockedFileTypes = FileDefinitions::get('blockedExtensions'); + + if (in_array($extension, $blockedFileTypes)) { + return false; + } + + return true; + } + /** * Creates a slug form the string. A modified version of Str::slug * with the main difference that it accepts @-signs diff --git a/modules/system/assets/js/lang/lang.hu.js b/modules/system/assets/js/lang/lang.hu.js index 4997cee74..e48488b8d 100644 --- a/modules/system/assets/js/lang/lang.hu.js +++ b/modules/system/assets/js/lang/lang.hu.js @@ -5,7 +5,7 @@ if ($.oc === undefined) $.oc = {} if ($.oc.langMessages === undefined) $.oc.langMessages = {} $.oc.langMessages['hu'] = $.extend( $.oc.langMessages['hu'] || {}, - {"markdowneditor":{"formatting":"Forr\u00e1sk\u00f3d","quote":"Id\u00e9zet","code":"K\u00f3d","header1":"C\u00edmsor 1","header2":"C\u00edmsor 2","header3":"C\u00edmsor 3","header4":"C\u00edmsor 4","header5":"C\u00edmsor 5","header6":"C\u00edmsor 6","bold":"F\u00e9lk\u00f6v\u00e9r","italic":"D\u00f6lt","unorderedlist":"Rendezett lista","orderedlist":"Sz\u00e1mozott lista","video":"Vide\u00f3","image":"K\u00e9p","link":"Hivatkoz\u00e1s","horizontalrule":"Vonal besz\u00far\u00e1sa","fullscreen":"Teljes k\u00e9perny\u0151","preview":"El\u0151n\u00e9zet"},"mediamanager":{"insert_link":"Hivatkoz\u00e1s besz\u00far\u00e1sa","insert_image":"K\u00e9p besz\u00far\u00e1sa","insert_video":"Vide\u00f3 besz\u00far\u00e1sa","insert_audio":"Audi\u00f3 besz\u00far\u00e1sa","invalid_file_empty_insert":"Hivatkoz\u00e1s k\u00e9sz\u00edt\u00e9s\u00e9hez jel\u00f6lj\u00f6n ki egy sz\u00f6vegr\u00e9szt.","invalid_file_single_insert":"K\u00e9rj\u00fck jel\u00f6lj\u00f6n ki egy f\u00e1jlt.","invalid_image_empty_insert":"V\u00e1lasszon ki legal\u00e1bb egy k\u00e9pet a besz\u00far\u00e1shoz.","invalid_video_empty_insert":"V\u00e1lasszon ki legal\u00e1bb egy vide\u00f3t a besz\u00far\u00e1shoz.","invalid_audio_empty_insert":"V\u00e1lasszon ki legal\u00e1bb egy audi\u00f3t a besz\u00far\u00e1shoz."},"alert":{"confirm_button_text":"OK","cancel_button_text":"M\u00e9gsem"},"datepicker":{"previousMonth":"El\u0151z\u0151 h\u00f3nap","nextMonth":"K\u00f6vetkez\u0151 h\u00f3nap","months":["janu\u00e1r","febru\u00e1r","m\u00e1rcius","\u00e1prilis","m\u00e1jus","j\u00fanius","j\u00falius","augusztus","szeptember","okt\u00f3ber","november","december"],"weekdays":["vas\u00e1rnap","h\u00e9tf\u0151","kedd","szerda","cs\u00fct\u00f6rt\u00f6k","p\u00e9ntek","szombat"],"weekdaysShort":["va","h\u00e9","ke","sze","cs","p\u00e9","szo"]},"filter":{"group":{"all":"\u00f6sszes"},"dates":{"all":"\u00f6sszes","filter_button_text":"Sz\u0171r\u00e9s","reset_button_text":"Alaphelyzet","date_placeholder":"D\u00e1tum","after_placeholder":"Ut\u00e1na","before_placeholder":"El\u0151tte"}},"eventlog":{"show_stacktrace":"Mutat\u00e1s","hide_stacktrace":"Rejt\u00e9s","tabs":{"formatted":"Form\u00e1zott","raw":"T\u00f6m\u00f6r\u00edtett"},"editor":{"title":"V\u00e1lassza ki melyik szerkeszt\u0151t szeretn\u00e9 haszn\u00e1lni","description":"Your environnement must be configured to listen to one of these URL schemes.","openWith":"Megnyit\u00e1s mint","remember_choice":"Megnyit\u00e1s \u00e9s munkamenet megjegyz\u00e9se","open":"Megnyit\u00e1s","cancel":"M\u00e9gsem"}}} + {"markdowneditor":{"formatting":"Forr\u00e1sk\u00f3d","quote":"Id\u00e9zet","code":"K\u00f3d","header1":"C\u00edmsor 1","header2":"C\u00edmsor 2","header3":"C\u00edmsor 3","header4":"C\u00edmsor 4","header5":"C\u00edmsor 5","header6":"C\u00edmsor 6","bold":"F\u00e9lk\u00f6v\u00e9r","italic":"D\u00f6lt","unorderedlist":"Rendezett lista","orderedlist":"Sz\u00e1mozott lista","video":"Vide\u00f3","image":"K\u00e9p","link":"Hivatkoz\u00e1s","horizontalrule":"Vonal besz\u00far\u00e1sa","fullscreen":"Teljes k\u00e9perny\u0151","preview":"El\u0151n\u00e9zet"},"mediamanager":{"insert_link":"Hivatkoz\u00e1s besz\u00far\u00e1sa","insert_image":"K\u00e9p besz\u00far\u00e1sa","insert_video":"Vide\u00f3 besz\u00far\u00e1sa","insert_audio":"Audi\u00f3 besz\u00far\u00e1sa","invalid_file_empty_insert":"Hivatkoz\u00e1s k\u00e9sz\u00edt\u00e9s\u00e9hez jel\u00f6lj\u00f6n ki egy sz\u00f6vegr\u00e9szt.","invalid_file_single_insert":"K\u00e9rj\u00fck jel\u00f6lj\u00f6n ki egy f\u00e1jlt.","invalid_image_empty_insert":"V\u00e1lasszon ki legal\u00e1bb egy k\u00e9pet a besz\u00far\u00e1shoz.","invalid_video_empty_insert":"V\u00e1lasszon ki legal\u00e1bb egy vide\u00f3t a besz\u00far\u00e1shoz.","invalid_audio_empty_insert":"V\u00e1lasszon ki legal\u00e1bb egy audi\u00f3t a besz\u00far\u00e1shoz."},"alert":{"confirm_button_text":"OK","cancel_button_text":"M\u00e9gsem"},"datepicker":{"previousMonth":"El\u0151z\u0151 h\u00f3nap","nextMonth":"K\u00f6vetkez\u0151 h\u00f3nap","months":["janu\u00e1r","febru\u00e1r","m\u00e1rcius","\u00e1prilis","m\u00e1jus","j\u00fanius","j\u00falius","augusztus","szeptember","okt\u00f3ber","november","december"],"weekdays":["vas\u00e1rnap","h\u00e9tf\u0151","kedd","szerda","cs\u00fct\u00f6rt\u00f6k","p\u00e9ntek","szombat"],"weekdaysShort":["va","h\u00e9","ke","sze","cs","p\u00e9","szo"]},"filter":{"group":{"all":"\u00f6sszes"},"dates":{"all":"\u00f6sszes","filter_button_text":"Sz\u0171r\u00e9s","reset_button_text":"Alaphelyzet","date_placeholder":"D\u00e1tum","after_placeholder":"Kezdete","before_placeholder":"V\u00e9ge"}},"eventlog":{"show_stacktrace":"R\u00e9szletek","hide_stacktrace":"Rejt\u00e9s","tabs":{"formatted":"Form\u00e1zott","raw":"T\u00f6m\u00f6r\u00edtett"},"editor":{"title":"Forr\u00e1sk\u00f3d szerkeszt\u0151","description":"Your operating system should be configured to listen to one of these URL schemes.","openWith":"Megnyit\u00e1s mint","remember_choice":"Kiv\u00e1lasztott be\u00e1ll\u00edt\u00e1sok megjegyz\u00e9se ebben a munkamenetben","open":"Megnyit\u00e1s","cancel":"M\u00e9gsem"}}} ); //! moment.js locale configuration diff --git a/modules/system/assets/ui/js/input.preset.js b/modules/system/assets/ui/js/input.preset.js index 05d2bc699..4a364d86d 100644 --- a/modules/system/assets/ui/js/input.preset.js +++ b/modules/system/assets/ui/js/input.preset.js @@ -249,7 +249,10 @@ } InputPreset.prototype.formatValue = function() { - if (this.options.inputPresetType == 'namespace') { + if (this.options.inputPresetType == 'exact') { + return this.$src.val(); + } + else if (this.options.inputPresetType == 'namespace') { return this.formatNamespace() } diff --git a/modules/system/assets/ui/storm-min.js b/modules/system/assets/ui/storm-min.js index 127ef9e04..8bf12f1d1 100644 --- a/modules/system/assets/ui/storm-min.js +++ b/modules/system/assets/ui/storm-min.js @@ -3840,7 +3840,7 @@ if(typeof option=='string')data[option].apply(data,args)})} $.fn.hotKey.Constructor=HotKey $.fn.hotKey.noConflict=function(){$.fn.hotKey=old return this} -$(document).render(function(){$('[data-hotkey]').hotKey()})}(window.jQuery);+function($){"use strict";var LATIN_MAP={'À':'A','Á':'A','Â':'A','Ã':'A','Ä':'A','Å':'A','Æ':'AE','Ç':'C','È':'E','É':'E','Ê':'E','Ë':'E','Ì':'I','Í':'I','Î':'I','Ï':'I','Ð':'D','Ñ':'N','Ò':'O','Ó':'O','Ô':'O','Õ':'O','Ö':'O','Ő':'O','Ø':'O','Ù':'U','Ú':'U','Û':'U','Ü':'U','Ű':'U','Ý':'Y','Þ':'TH','Ÿ':'Y','ß':'ss','à':'a','á':'a','â':'a','ã':'a','ä':'a','å':'a','æ':'ae','ç':'c','è':'e','é':'e','ê':'e','ë':'e','ì':'i','í':'i','î':'i','ï':'i','ð':'d','ñ':'n','ò':'o','ó':'o','ô':'o','õ':'o','ö':'o','ő':'o','ø':'o','ō':'o','œ':'oe','ù':'u','ú':'u','û':'u','ü':'u','ű':'u','ý':'y','þ':'th','ÿ':'y'},LATIN_SYMBOLS_MAP={'©':'(c)'},GREEK_MAP={'α':'a','β':'b','γ':'g','δ':'d','ε':'e','ζ':'z','η':'h','θ':'8','ι':'i','κ':'k','λ':'l','μ':'m','ν':'n','ξ':'3','ο':'o','π':'p','ρ':'r','σ':'s','τ':'t','υ':'y','φ':'f','χ':'x','ψ':'ps','ω':'w','ά':'a','έ':'e','ί':'i','ό':'o','ύ':'y','ή':'h','ώ':'w','ς':'s','ϊ':'i','ΰ':'y','ϋ':'y','ΐ':'i','Α':'A','Β':'B','Γ':'G','Δ':'D','Ε':'E','Ζ':'Z','Η':'H','Θ':'8','Ι':'I','Κ':'K','Λ':'L','Μ':'M','Ν':'N','Ξ':'3','Ο':'O','Π':'P','Ρ':'R','Σ':'S','Τ':'T','Υ':'Y','Φ':'F','Χ':'X','Ψ':'PS','Ω':'W','Ά':'A','Έ':'E','Ί':'I','Ό':'O','Ύ':'Y','Ή':'H','Ώ':'W','Ϊ':'I','Ϋ':'Y'},TURKISH_MAP={'ş':'s','Ş':'S','ı':'i','İ':'I','ç':'c','Ç':'C','ü':'u','Ü':'U','ö':'o','Ö':'O','ğ':'g','Ğ':'G'},RUSSIAN_MAP={'а':'a','б':'b','в':'v','г':'g','д':'d','е':'e','ё':'yo','ж':'zh','з':'z','и':'i','й':'j','к':'k','л':'l','м':'m','н':'n','о':'o','п':'p','р':'r','с':'s','т':'t','у':'u','ф':'f','х':'h','ц':'c','ч':'ch','ш':'sh','щ':'sh','ъ':'','ы':'y','ь':'','э':'e','ю':'yu','я':'ya','А':'A','Б':'B','В':'V','Г':'G','Д':'D','Е':'E','Ё':'Yo','Ж':'Zh','З':'Z','И':'I','Й':'J','К':'K','Л':'L','М':'M','Н':'N','О':'O','П':'P','Р':'R','С':'S','Т':'T','У':'U','Ф':'F','Х':'H','Ц':'C','Ч':'Ch','Ш':'Sh','Щ':'Sh','Ъ':'','Ы':'Y','Ь':'','Э':'E','Ю':'Yu','Я':'Ya'},UKRAINIAN_MAP={'Є':'Ye','І':'I','Ї':'Yi','Ґ':'G','є':'ye','і':'i','ї':'yi','ґ':'g'},CZECH_MAP={'č':'c','ď':'d','ě':'e','ň':'n','ř':'r','š':'s','ť':'t','ů':'u','ž':'z','Č':'C','Ď':'D','Ě':'E','Ň':'N','Ř':'R','Š':'S','Ť':'T','Ů':'U','Ž':'Z'},POLISH_MAP={'ą':'a','ć':'c','ę':'e','ł':'l','ń':'n','ó':'o','ś':'s','ź':'z','ż':'z','Ą':'A','Ć':'C','Ę':'E','Ł':'L','Ń':'N','Ó':'O','Ś':'S','Ź':'Z','Ż':'Z'},LATVIAN_MAP={'ā':'a','č':'c','ē':'e','ģ':'g','ī':'i','ķ':'k','ļ':'l','ņ':'n','š':'s','ū':'u','ž':'z','Ā':'A','Č':'C','Ē':'E','Ģ':'G','Ī':'I','Ķ':'K','Ļ':'L','Ņ':'N','Š':'S','Ū':'U','Ž':'Z'},ARABIC_MAP={'أ':'a','ب':'b','ت':'t','ث':'th','ج':'g','ح':'h','خ':'kh','د':'d','ذ':'th','ر':'r','ز':'z','س':'s','ش':'sh','ص':'s','ض':'d','ط':'t','ظ':'th','ع':'aa','غ':'gh','ف':'f','ق':'k','ك':'k','ل':'l','م':'m','ن':'n','ه':'h','و':'o','ي':'y'},PERSIAN_MAP={'آ':'a','ا':'a','پ':'p','چ':'ch','ژ':'zh','ک':'k','گ':'gh','ی':'y'},LITHUANIAN_MAP={'ą':'a','č':'c','ę':'e','ė':'e','į':'i','š':'s','ų':'u','ū':'u','ž':'z','Ą':'A','Č':'C','Ę':'E','Ė':'E','Į':'I','Š':'S','Ų':'U','Ū':'U','Ž':'Z'},SERBIAN_MAP={'ђ':'dj','ј':'j','љ':'lj','њ':'nj','ћ':'c','џ':'dz','đ':'dj','Ђ':'Dj','Ј':'j','Љ':'Lj','Њ':'Nj','Ћ':'C','Џ':'Dz','Đ':'Dj'},AZERBAIJANI_MAP={'ç':'c','ə':'e','ğ':'g','ı':'i','ö':'o','ş':'s','ü':'u','Ç':'C','Ə':'E','Ğ':'G','İ':'I','Ö':'O','Ş':'S','Ü':'U'},SPECIFIC_MAPS={'de':{'Ä':'AE','Ö':'OE','Ü':'UE','ä':'ae','ö':'oe','ü':'ue'}},ALL_MAPS=[LATIN_MAP,LATIN_SYMBOLS_MAP,GREEK_MAP,TURKISH_MAP,RUSSIAN_MAP,UKRAINIAN_MAP,CZECH_MAP,POLISH_MAP,LATVIAN_MAP,ARABIC_MAP,PERSIAN_MAP,LITHUANIAN_MAP,SERBIAN_MAP,AZERBAIJANI_MAP] +$(document).render(function(){$('[data-hotkey]').hotKey()})}(window.jQuery);+function($){"use strict";var LATIN_MAP={'À':'A','Á':'A','Â':'A','Ã':'A','Ä':'A','Å':'A','Æ':'AE','Ç':'C','È':'E','É':'E','Ê':'E','Ë':'E','Ì':'I','Í':'I','Î':'I','Ï':'I','Ð':'D','Ñ':'N','Ò':'O','Ó':'O','Ô':'O','Õ':'O','Ö':'O','Ő':'O','Ø':'O','Ù':'U','Ú':'U','Û':'U','Ü':'U','Ű':'U','Ý':'Y','Þ':'TH','Ÿ':'Y','ß':'ss','à':'a','á':'a','â':'a','ã':'a','ä':'a','å':'a','æ':'ae','ç':'c','è':'e','é':'e','ê':'e','ë':'e','ì':'i','í':'i','î':'i','ï':'i','ð':'d','ñ':'n','ò':'o','ó':'o','ô':'o','õ':'o','ö':'o','ő':'o','ø':'o','ō':'o','œ':'oe','ù':'u','ú':'u','û':'u','ü':'u','ű':'u','ý':'y','þ':'th','ÿ':'y'},LATIN_SYMBOLS_MAP={'©':'(c)'},GREEK_MAP={'α':'a','β':'b','γ':'g','δ':'d','ε':'e','ζ':'z','η':'h','θ':'8','ι':'i','κ':'k','λ':'l','μ':'m','ν':'n','ξ':'3','ο':'o','π':'p','ρ':'r','σ':'s','τ':'t','υ':'y','φ':'f','χ':'x','ψ':'ps','ω':'w','ά':'a','έ':'e','ί':'i','ό':'o','ύ':'y','ή':'h','ώ':'w','ς':'s','ϊ':'i','ΰ':'y','ϋ':'y','ΐ':'i','Α':'A','Β':'B','Γ':'G','Δ':'D','Ε':'E','Ζ':'Z','Η':'H','Θ':'8','Ι':'I','Κ':'K','Λ':'L','Μ':'M','Ν':'N','Ξ':'3','Ο':'O','Π':'P','Ρ':'R','Σ':'S','Τ':'T','Υ':'Y','Φ':'F','Χ':'X','Ψ':'PS','Ω':'W','Ά':'A','Έ':'E','Ί':'I','Ό':'O','Ύ':'Y','Ή':'H','Ώ':'W','Ϊ':'I','Ϋ':'Y'},TURKISH_MAP={'ş':'s','Ş':'S','ı':'i','İ':'I','ç':'c','Ç':'C','ü':'u','Ü':'U','ö':'o','Ö':'O','ğ':'g','Ğ':'G'},RUSSIAN_MAP={'а':'a','б':'b','в':'v','г':'g','д':'d','е':'e','ё':'yo','ж':'zh','з':'z','и':'i','й':'j','к':'k','л':'l','м':'m','н':'n','о':'o','п':'p','р':'r','с':'s','т':'t','у':'u','ф':'f','х':'h','ц':'c','ч':'ch','ш':'sh','щ':'sh','ъ':'','ы':'y','ь':'','э':'e','ю':'yu','я':'ya','А':'A','Б':'B','В':'V','Г':'G','Д':'D','Е':'E','Ё':'Yo','Ж':'Zh','З':'Z','И':'I','Й':'J','К':'K','Л':'L','М':'M','Н':'N','О':'O','П':'P','Р':'R','С':'S','Т':'T','У':'U','Ф':'F','Х':'H','Ц':'C','Ч':'Ch','Ш':'Sh','Щ':'Sh','Ъ':'','Ы':'Y','Ь':'','Э':'E','Ю':'Yu','Я':'Ya'},UKRAINIAN_MAP={'Є':'Ye','І':'I','Ї':'Yi','Ґ':'G','є':'ye','і':'i','ї':'yi','ґ':'g'},CZECH_MAP={'č':'c','ď':'d','ě':'e','ň':'n','ř':'r','š':'s','ť':'t','ů':'u','ž':'z','Č':'C','Ď':'D','Ě':'E','Ň':'N','Ř':'R','Š':'S','Ť':'T','Ů':'U','Ž':'Z'},POLISH_MAP={'ą':'a','ć':'c','ę':'e','ł':'l','ń':'n','ó':'o','ś':'s','ź':'z','ż':'z','Ą':'A','Ć':'C','Ę':'E','Ł':'L','Ń':'N','Ó':'O','Ś':'S','Ź':'Z','Ż':'Z'},LATVIAN_MAP={'ā':'a','č':'c','ē':'e','ģ':'g','ī':'i','ķ':'k','ļ':'l','ņ':'n','š':'s','ū':'u','ž':'z','Ā':'A','Č':'C','Ē':'E','Ģ':'G','Ī':'I','Ķ':'K','Ļ':'L','Ņ':'N','Š':'S','Ū':'U','Ž':'Z'},ARABIC_MAP={'أ':'a','ب':'b','ت':'t','ث':'th','ج':'g','ح':'h','خ':'kh','د':'d','ذ':'th','ر':'r','ز':'z','س':'s','ش':'sh','ص':'s','ض':'d','ط':'t','ظ':'th','ع':'aa','غ':'gh','ف':'f','ق':'k','ك':'k','ل':'l','م':'m','ن':'n','ه':'h','و':'o','ي':'y'},PERSIAN_MAP={'آ':'a','ا':'a','پ':'p','چ':'ch','ژ':'zh','ک':'k','گ':'gh','ی':'y'},LITHUANIAN_MAP={'ą':'a','č':'c','ę':'e','ė':'e','į':'i','š':'s','ų':'u','ū':'u','ž':'z','Ą':'A','Č':'C','Ę':'E','Ė':'E','Į':'I','Š':'S','Ų':'U','Ū':'U','Ž':'Z'},SERBIAN_MAP={'ђ':'dj','ј':'j','љ':'lj','њ':'nj','ћ':'c','џ':'dz','đ':'dj','Ђ':'Dj','Ј':'j','Љ':'Lj','Њ':'Nj','Ћ':'C','Џ':'Dz','Đ':'Dj'},AZERBAIJANI_MAP={'ç':'c','ə':'e','ğ':'g','ı':'i','ö':'o','ş':'s','ü':'u','Ç':'C','Ə':'E','Ğ':'G','İ':'I','Ö':'O','Ş':'S','Ü':'U'},ROMANIAN_MAP={'ă':'a','â':'a','î':'i','ș':'s','ț':'t','Ă':'A','Â':'A','Î':'I','Ș':'S','Ț':'T'},SPECIFIC_MAPS={'de':{'Ä':'AE','Ö':'OE','Ü':'UE','ä':'ae','ö':'oe','ü':'ue'}},ALL_MAPS=[LATIN_MAP,LATIN_SYMBOLS_MAP,GREEK_MAP,TURKISH_MAP,RUSSIAN_MAP,UKRAINIAN_MAP,CZECH_MAP,POLISH_MAP,LATVIAN_MAP,ARABIC_MAP,PERSIAN_MAP,LITHUANIAN_MAP,SERBIAN_MAP,AZERBAIJANI_MAP,ROMANIAN_MAP] var removeList=["a","an","as","at","before","but","by","for","from","is","in","into","like","of","off","on","onto","per","since","than","the","this","that","to","up","via","with"] var locale=$('meta[name="backend-locale"]').attr('content') var Downcoder={Initialize:function(){if(Downcoder.map){return;} @@ -3883,7 +3883,8 @@ $el.val(prefix+self.formatValue())}) this.$el.on('change',function(){self.cancelled=true})} InputPreset.prototype.formatNamespace=function(){var value=toCamel(this.$src.val()) return value.substr(0,1).toUpperCase()+value.substr(1)} -InputPreset.prototype.formatValue=function(){if(this.options.inputPresetType=='namespace'){return this.formatNamespace()} +InputPreset.prototype.formatValue=function(){if(this.options.inputPresetType=='exact'){return this.$src.val();} +else if(this.options.inputPresetType=='namespace'){return this.formatNamespace()} if(this.options.inputPresetType=='camel'){var value=toCamel(this.$src.val())} else{var value=slugify(this.$src.val())} if(this.options.inputPresetType=='url'){value='/'+value} diff --git a/modules/system/behaviors/SettingsModel.php b/modules/system/behaviors/SettingsModel.php index 9790f7ff3..54b35a110 100644 --- a/modules/system/behaviors/SettingsModel.php +++ b/modules/system/behaviors/SettingsModel.php @@ -100,6 +100,7 @@ class SettingsModel extends ModelBehavior /** * Checks if the model has been set up previously, intended as a static method + * @return bool */ public function isConfigured() { diff --git a/modules/system/classes/CombineAssets.php b/modules/system/classes/CombineAssets.php index e2e4d84f6..93268c5f3 100644 --- a/modules/system/classes/CombineAssets.php +++ b/modules/system/classes/CombineAssets.php @@ -401,7 +401,7 @@ class CombineAssets $key = ''; $assetFiles = array_map(function($file) { - return $this->localPath.'/'.$file; + return File::symbolizePath($file, null) ?: $this->localPath . $file; }, $assets); foreach ($assetFiles as $file) { diff --git a/modules/system/helpers/DateTime.php b/modules/system/helpers/DateTime.php index 43f2e56c4..45522071a 100644 --- a/modules/system/helpers/DateTime.php +++ b/modules/system/helpers/DateTime.php @@ -2,9 +2,9 @@ use Lang; use Carbon\Carbon; -use Exception; use DateTime as PhpDateTime; use InvalidArgumentException; +use Exception; class DateTime { @@ -67,7 +67,9 @@ class DateTime $value = Carbon::createFromFormat('Y-m-d', $value)->startOfDay(); } else { - $value = @Carbon::parse($value); + try { + $value = Carbon::parse($value); + } catch (Exception $ex) {} } if (!$value instanceof Carbon && $throwException) { diff --git a/modules/system/lang/hu/client.php b/modules/system/lang/hu/client.php index 022b6e97d..6d722d0e0 100644 --- a/modules/system/lang/hu/client.php +++ b/modules/system/lang/hu/client.php @@ -68,23 +68,23 @@ return [ 'filter_button_text' => 'Szűrés', 'reset_button_text' => 'Alaphelyzet', 'date_placeholder' => 'Dátum', - 'after_placeholder' => 'Utána', - 'before_placeholder' => 'Előtte' + 'after_placeholder' => 'Kezdete', + 'before_placeholder' => 'Vége' ] ], 'eventlog' => [ - 'show_stacktrace' => 'Mutatás', + 'show_stacktrace' => 'Részletek', 'hide_stacktrace' => 'Rejtés', 'tabs' => [ 'formatted' => 'Formázott', 'raw' => 'Tömörített', ], 'editor' => [ - 'title' => 'Válassza ki melyik szerkesztőt szeretné használni', - 'description' => 'Your environnement must be configured to listen to one of these URL schemes.', + 'title' => 'Forráskód szerkesztő', + 'description' => 'Your operating system should be configured to listen to one of these URL schemes.', 'openWith' => 'Megnyitás mint', - 'remember_choice' => 'Megnyitás és munkamenet megjegyzése', + 'remember_choice' => 'Kiválasztott beállítások megjegyzése ebben a munkamenetben', 'open' => 'Megnyitás', 'cancel' => 'Mégsem' ] diff --git a/modules/system/lang/hu/lang.php b/modules/system/lang/hu/lang.php index 4ae40a265..6c1688b2c 100644 --- a/modules/system/lang/hu/lang.php +++ b/modules/system/lang/hu/lang.php @@ -325,7 +325,7 @@ return [ 'id' => 'Azonosító', 'id_label' => 'Napló azonosító', 'count' => 'Számláló', - 'referer' => 'Hivatkozók', + 'referer' => 'Hivatkozás', 'url' => 'Webcím', 'status_code' => 'Állapotkód', 'preview_title' => 'Kérelem' diff --git a/modules/system/lang/hu/validation.php b/modules/system/lang/hu/validation.php index cdfb28895..b37391bc8 100644 --- a/modules/system/lang/hu/validation.php +++ b/modules/system/lang/hu/validation.php @@ -95,11 +95,20 @@ return [ */ 'attributes' => [ - 'nev' => 'név', - 'email' => 'e-mail', - 'telefon' => 'telefon', - 'targy' => 'tárgy', - 'uzenet' => 'üzenet', + 'nev' => 'név', + 'vnev' => 'vezetéknév', + 'knev' => 'keresztnév', + 'email' => 'e-mail', + 'telefon' => 'telefonszám', + 'mobil' => 'mobilszám', + 'targy' => 'tárgy', + 'uzenet' => 'üzenet', + 'varos' => 'város', + 'telepules' => 'település', + 'cim' => 'cím', + 'utca' => 'útca', + 'irszam' => 'irányítószám', + 'kep' => 'kép', ], ]; diff --git a/modules/system/lang/zh-cn/lang.php b/modules/system/lang/zh-cn/lang.php index 5a17d75cd..ded03b822 100644 --- a/modules/system/lang/zh-cn/lang.php +++ b/modules/system/lang/zh-cn/lang.php @@ -29,7 +29,7 @@ return [ 'sk' => 'Slovak (Slovakia)', 'tr' => 'Turkish', 'zh-cn' => '简体中文', - 'zh-tw' => 'Chinese (Taiwan)', + 'zh-tw' => '繁體中文', 'el' => 'Greek' ], 'directory' => [ @@ -300,7 +300,8 @@ return [ 'count' => '次数', 'referer' => '来源', 'url' => 'URL', - 'status_code' => '状态' + 'status_code' => '状态', + 'preview_title'=> '预览事件日志' ], 'permissions' => [ 'name' => '系统', @@ -310,6 +311,8 @@ return [ 'manage_mail_templates' => '管理邮件模板', 'manage_mail_settings' => '管理邮件设置', 'manage_other_administrators' => '管理其他管理员', + 'manage_preferences' => '管理后台偏好设置', + 'manage_editor' => '管理代码编辑器偏好设置', 'view_the_dashboard' => '查看仪表盘', 'manage_branding' => '自定义后台' ] diff --git a/modules/system/views/exception.php b/modules/system/views/exception.php index d8c24f5ec..4ec127dc1 100644 --- a/modules/system/views/exception.php +++ b/modules/system/views/exception.php @@ -62,6 +62,7 @@