Merge branch 'develop' into wip/halcyon-db-datasource

This commit is contained in:
Luke Towers 2019-04-11 12:30:29 -06:00
commit 630d543959
474 changed files with 40183 additions and 23069 deletions

View File

@ -1,46 +1,46 @@
# Contributing to OctoberCMS
Thank you for your contributions!
Thank you for your interest in contributing to the OctoberCMS project!
## Reporting a bug with OctoberCMS
## Reporting an issue with OctoberCMS
**Please don't use the main GitHub for reporting bugs with plugins.** If you have found a bug in a plugin, the best place to report it is with the [plugin author](http://octobercms.com/plugins).
**Please don't use the main GitHub for reporting issues with plugins.** If you have found a bug in a plugin, the best place to report it is with the [plugin author](https://octobercms.com/plugins).
We work hard to process bugs that are reported, to assist with this please ensure the following details are always included:
- **Bug summary**: Make sure your summary reflects what the problem is and where it is.
- **Request location**: Enter the URL where this bug occurs, if applicable.
- **Summary**: Make sure your summary reflects what the problem is and where it is. Provide as much detail as possible, the more information we have to work with the more likely it is that your problem can be solved.
- **Reproduce steps**: Clearly mention the steps to reproduce the bug.
- **Expected behavior**: How OctoberCMS should behave on above mentioned steps.
- **Expected behavior**: Describe how OctoberCMS should behave on above mentioned steps.
- **Actual behavior**: What is the actual result on running above steps i.e. the bug behavior - **include any error messages**.
#### Here's how to report a bug on GitHub
>**NOTE:** Screenshots and GIFs are very helpful in visuallizing what exactly is going wrong
#### Here's how to report an issue on GitHub
1. **Register for an account on [GitHub](https://github.com),** if you don't already have one.
2. **Search for similar bugs.** Perhaps someone has already reported your issue! If so, please add clarification and/or more information to the **existing** bug.
2. **Search for similar issues.** Perhaps someone has already reported your issue! If so, please add clarification and/or more information to the **existing** issue.
3. **Create a new bug.** If you don't find any similar issues, you can report your bug via the "new issue" tab once you've logged in.
3. **Create a new issue.** If you don't find any similar issues, you can report your issue via the ["issues" tab](https://github.com/octobercms/october/issues) once you've logged in.
4. **Monitor your issue and respond to questions.** It may be necessary to provide additional information upon request or you might be asked if the bug still occurs after an update.
4. **Monitor your issue and respond to questions.** It may be necessary to provide additional information upon request or you might be asked if the issue still occurs after an update.
5. **Close your bug.** In case you notice that the bug doesn't occur anymore, you can close the issue yourself (don't forget to add a note saying the issue is resolved).
5. **Close your issue.** In case you notice that the issue doesn't occur anymore, you can close the issue yourself (don't forget to add a note saying that the issue is resolved and ideally any additional information on how it was resolved).
If you find out your bug is actually a duplicate of another bug and only notice that after you created it, please also close your bug with a short reference to the other issue that was there before.
#### Reporting security issues
If you wish to contact us privately about any security exploits in OctoberCMS you may find, you can find our email on the [OctoberCMS website](http://octobercms.com).
If you wish to contact us privately about any security exploits in OctoberCMS you may find, you can find our email on the [OctoberCMS website](https://octobercms.com).
## Feature requests
**Please don't use GitHub issues for suggesting a new feature.** If you have a feature idea, the best place to suggest it is the [OctoberCMS website forum](http://octobercms.com/forum/chan/feature-requests).
**Please don't use GitHub issues for suggesting a new feature.** If you have a feature idea, the best place to suggest it is the [OctoberCMS website forum](https://octobercms.com/forum/chan/feature-requests).
Only use GitHub if you are planning on contributing a new feature and developing it. If you want to discuss your idea first, before "officially" posting it anywhere, you can always join us on [IRC](http://octobercms.com/chat).
Only use GitHub if you are planning on contributing a new feature and developing it. If you want to discuss your idea first, before "officially" posting it anywhere, you can always join us on [IRC](https://octobercms.com/chat) or [Slack](https://octobercms.slack.com).
#### GitHub feature requests
@ -54,16 +54,16 @@ Your contributions to the project are very welcome. If you would like to fix a b
To help us merge your Pull Request, please make sure you follow these points:
1. Describe the problem clearly in the Pull Request description
1. Please make your fix on the `develop` branch. This makes merging much easier.
1. Do not edit compiled asset files such as `october.css` Instead, try to edit the LESS files inside the `less/` directory and then use a compiler.
1. For any change that you make, **please try to also add a test case(s)** in the `tests/unit` directory. This helps us understand the issue and make sure that it will stay fixed forever.
- Describe the problem clearly in the Pull Request description
- Please make your fix on the `develop` branch. This makes merging much easier.
- Do not edit compiled asset files such as `october.css`, `framework.css`, etc. directly. Instead, edit the LESS files inside the `less/` directory and then run `php artisan october:util compile assets` from the project root and commit the changed LESS files as well as the recompiled asset files.
- For any change that you make, **please also add a test case(s)** in the `tests/unit` directory. This helps us understand the issue and make sure that it will stay fixed forever.
Thank you for your contributions!
#### PSR Coding standards
Also ensure that your Pull Request satisfies the following coding standards:
Please ensure that your Pull Request satisfies the following coding standards:
- [PSR 2 Coding Style Guide](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
- [PSR 1 Coding Style Guide](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md)
@ -71,13 +71,7 @@ Also ensure that your Pull Request satisfies the following coding standards:
#### Team rules
The October team follows the [developer guidelines](http://octobercms.com/docs/help/developer-guide) as much as possible.
#### Code of conduct
We promise to extend courtesy and respect to everyone opening an issue. We expect anyone using the bug trackers to do the same.
All reported issues to this project are valuable. Please act with respect and avoid demeaning, condescending, racist, sexist and other inappropriate language and conduct. Please ensure comments stay professional and constructive.
The October team follows the [developer guidelines](https://octobercms.com/docs/help/developer-guide) as much as possible.
#### Escalation process

20
.github/ISSUE_TEMPLATE/1_BUG_REPORT.md vendored Normal file
View File

@ -0,0 +1,20 @@
---
name: "🐛 Bug Report"
about: 'Report a general OctoberCMS issue'
labels: 'Status: Review Needed, Type: Unconfirmed Bug'
---
- OctoberCMS Build: ### <!-- Or Commit hash if using composer -->
- PHP Version:
- Database Engine: <!-- Remove if not using a database -->
- Plugins Installed: <!-- In the format of Author.Plugin-v1.2.0 -->
### Description:
<!-- Describe the issue encountered and what should actually be happening instead in as much detail as possible-->
### Steps To Reproduce:
<!-- (Describe the steps to reproduce the problem here) -->

View File

@ -0,0 +1,12 @@
---
name: "⚠️ Support Question"
about: 'This repository is only for reporting bugs or problems. If you need help, see: https://octobercms.com/support'
---
This repository is only for reporting bugs or problems. If you need support, please use the following options:
- Forum: https://octobercms.com/forum
- Slack: https://octobercms.slack.com (Invite link: https://octobercms-slack.herokuapp.com/)
- Stack Overflow: https://stackoverflow.com/questions/tagged/octobercms
Thanks!

View File

@ -0,0 +1,6 @@
---
name: "💡 Feature Request"
about: 'For ideas or feature requests, make a PR or talk to the core members on Slack'
---
If you would like to propose new features, please make a pull request. Alternatively, you may message the core team on the OctoberCMS Slack.

View File

@ -0,0 +1,10 @@
---
name: "📚 Documentation Issue"
about: 'For documentation issues, see: https://github.com/octobercms/docs/issues'
---
The OctoberCMS documentation has its own dedicated repository. Please open your documentation-related issue at https://github.com/octobercms/docs/issues.
> **NOTE:** Since documentation issues are not reviewed very often, it's best to simply make a pull request to correct the issue you have found!**
Thanks!

View File

@ -0,0 +1,8 @@
---
name: "🔒 Security Vulnerabilities"
about: 'For reporting security-related issues, send an email to hello@octobercms.com'
---
PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, SEE BELOW.
If you discover a security vulnerability within OctoberCMS or dependencies, please send an e-mail to Samuel Georges & Luke Towers via hello@octobercms.com and octobercms@luketowers.ca respectively. All security vulnerabilities will be promptly addressed.

7
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,7 @@
<!--
Pull Requests without a descriptive title, thorough description, or tests will be closed.
Please include the benefit to end users; the reasons it does not break any existing features; how it makes building web applications easier, etc. The more detail the better.
If documentation improvements are required, you are expected to make a simultaneous pull request to https://github.com/octobercms/docs to update the documentation
-->

1
.gitignore vendored
View File

@ -13,6 +13,7 @@ nginx-ssl.access.log
nginx-ssl.error.log
php-errors.log
sftp-config.json
.ftpconfig
selenium.php
composer.lock

View File

@ -4,6 +4,7 @@ php:
- 7.0
- 7.1
- 7.2
- 7.3
- nightly
matrix:

View File

@ -1 +1 @@
Changelog can be found here: http://octobercms.com/changelog
View the changelog on the [OctoberCMS website](https://octobercms.com/changelog)

5
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,5 @@
# Code of Conduct
We promise to extend courtesy and respect to everyone opening an issue. We expect anyone using the bug trackers to do the same.
All reported issues to this project are valuable. Please act with respect and avoid demeaning, condescending, racist, sexist and other inappropriate language and conduct. Please ensure comments stay professional and constructive.

View File

@ -1,11 +0,0 @@
##### Expected behavior
(Describe expected behavior here)
##### Actual behavior
(Describe actual behavior here)
##### Reproduce steps
(Describe the steps to reproduce the problem here)
##### October build
(October build number)

View File

@ -56,7 +56,7 @@ The OctoberCMS platform is open-sourced software licensed under the [MIT license
### Contributing
Before sending a Pull Request, be sure to review the [Contributing Guidelines](CONTRIBUTING.md) first.
Before sending a Pull Request, be sure to review the [Contributing Guidelines](.github/CONTRIBUTING.md) first.
### Coding standards

View File

@ -52,6 +52,14 @@ return [
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
|
| -------- STOP! --------
| Before you change this value, consider carefully if that is actually
| what you want to do. It is HIGHLY recommended that this is always set
| to UTC (as your server & DB timezone should be as well) and instead you
| use cms.backendTimezone to set the default timezone used in the backend
| to display dates & times.
|
*/
'timezone' => 'UTC',

View File

@ -125,4 +125,20 @@ return [
],
/*
|--------------------------------------------------------------------------
| Use DB configuration for testing
|--------------------------------------------------------------------------
|
| When running plugin tests OctoberCMS by default uses SQLite in memory.
| You can override this behavior by setting `useConfigForTesting` to true.
|
| After that OctoberCMS will take DB parameters from the config.
| If file `/config/testing/database.php` exists, config will be read from it,
| but remember that when not specified it will use parameters specified in
| `/config/database.php`.
|
*/
'useConfigForTesting' => false,
];

View File

@ -74,6 +74,7 @@ class ServiceProvider extends ModuleServiceProvider
$combiner->registerBundle('~/modules/backend/formwidgets/repeater/assets/less/repeater.less');
$combiner->registerBundle('~/modules/backend/formwidgets/codeeditor/assets/js/build.js');
$combiner->registerBundle('~/modules/backend/formwidgets/fileupload/assets/less/fileupload.less');
$combiner->registerBundle('~/modules/backend/formwidgets/nestedform/assets/less/nestedform.less');
/*
* Rich Editor is protected by DRM
@ -136,6 +137,10 @@ class ServiceProvider extends ModuleServiceProvider
'label' => 'system::lang.permissions.view_the_dashboard',
'tab' => 'system::lang.permissions.name'
],
'backend.manage_default_dashboard' => [
'label' => 'system::lang.permissions.manage_default_dashboard',
'tab' => 'system::lang.permissions.name',
],
'backend.manage_users' => [
'label' => 'system::lang.permissions.manage_other_administrators',
'tab' => 'system::lang.permissions.name'
@ -179,6 +184,7 @@ class ServiceProvider extends ModuleServiceProvider
$manager->registerFormWidget('Backend\FormWidgets\Repeater', 'repeater');
$manager->registerFormWidget('Backend\FormWidgets\TagList', 'taglist');
$manager->registerFormWidget('Backend\FormWidgets\MediaFinder', 'mediafinder');
$manager->registerFormWidget('Backend\FormWidgets\NestedForm', 'nestedform');
});
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
// Only run on HTTPS connections
if (location.protocol === 'https:') {
// Unregister all service workers before signing in to prevent cache issues
navigator.serviceWorker.getRegistrations().then(
function(registrations) {
for (let registration of registrations) {
registration.unregister();
}
});
}

View File

@ -690,7 +690,7 @@ if(!data)$this.data('oc.verticalMenu',(data=new VerticalMenu(this,toggleSelector
if(typeof option=='string')data[option].call($this)})}
$.fn.verticalMenu.Constructor=VerticalMenu
$.fn.verticalMenu.noConflict=function(){$.fn.verticalMenu=old
return this}}(window.jQuery);(function($){$(window).on('load',function(){$('nav.navbar').each(function(){var
return this}}(window.jQuery);(function($){$(document).ready(function(){$('nav.navbar').each(function(){var
navbar=$(this),nav=$('ul.nav',navbar),collapseMode=navbar.hasClass('navbar-mode-collapse'),isMobile=$('html').hasClass('mobile')
nav.verticalMenu($('a.menu-toggle',navbar),{breakpoint:collapseMode?Infinity:769})
$('li.with-tooltip:not(.active) > a',navbar).tooltip({container:'body',placement:'bottom',template:'<div class="tooltip mainmenu-tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'}).on('show.bs.tooltip',function(e){if(isMobile)e.preventDefault()})
@ -740,7 +740,7 @@ $.fn.sideNav.noConflict=function(){$.fn.sideNav=old
return this}
$(document).ready(function(){$('[data-control="sidenav"]').sideNav()})}(window.jQuery);+function($){"use strict";var Base=$.oc.foundation.base,BaseProto=Base.prototype
var Scrollbar=function(element,options){var
$el=this.$el=$(element),el=$el.get(0),self=this,options=this.options=options||{},sizeName=this.sizeName=options.vertical?'height':'width',isNative=$('html').hasClass('mobile'),isTouch=this.isTouch=Modernizr.touch,isScrollable=this.isScrollable=false,isLocked=this.isLocked=false,eventElementName=options.vertical?'pageY':'pageX',dragStart=0,startOffset=0;$.oc.foundation.controlUtils.markDisposable(element)
$el=this.$el=$(element),el=$el.get(0),self=this,options=this.options=options||{},sizeName=this.sizeName=options.vertical?'height':'width',isNative=$('html').hasClass('mobile'),isTouch=this.isTouch=Modernizr.touchevents,isScrollable=this.isScrollable=false,isLocked=this.isLocked=false,eventElementName=options.vertical?'pageY':'pageX',dragStart=0,startOffset=0;$.oc.foundation.controlUtils.markDisposable(element)
Base.call(this)
this.$el.one('dispose-control',this.proxy(this.dispose))
if(isNative){return}
@ -954,12 +954,12 @@ this.$fixButton.click(function(){self.fixPanel()
return false})
$('.fix-button-container',this.$el).append(this.$fixButton)
this.$sideNavItems.click(function(){if($(this).data('no-side-panel')){return}
if(Modernizr.touch&&$(window).width()<self.options.breakpoint){if($(this).data('menu-item')==self.visibleItemId&&self.panelVisible){self.hideSidePanel()
if(Modernizr.touchevents&&$(window).width()<self.options.breakpoint){if($(this).data('menu-item')==self.visibleItemId&&self.panelVisible){self.hideSidePanel()
return}
else{self.displaySidePanel()}}
self.displayTab(this)
return false})
if(!Modernizr.touch){self.$sideNav.mouseleave(function(){clearTimeout(self.panelOpenTimeout)})
if(!Modernizr.touchevents){self.$sideNav.mouseleave(function(){clearTimeout(self.panelOpenTimeout)})
self.$el.mouseleave(function(){self.hideSidePanel()})
self.$sideNavItems.mouseenter(function(){if($(window).width()<self.options.breakpoint||!self.panelFixed()){if($(this).data('no-side-panel')){self.hideSidePanel()
return}
@ -989,7 +989,7 @@ SidePanelTab.prototype.hideSidePanel=function(){$(document.body).removeClass('di
if(this.$el.next('#layout-body').length==0){$('#layout-body').before(this.$el)}
this.panelVisible=false
this.updateActiveTab()}
SidePanelTab.prototype.updatePanelPosition=function(){if(!this.panelFixed()||Modernizr.touch){this.$el.height($(document).height()-this.mainNavHeight)}
SidePanelTab.prototype.updatePanelPosition=function(){if(!this.panelFixed()||Modernizr.touchevents){this.$el.height($(document).height()-this.mainNavHeight)}
else{this.$el.css('height','')}
if(this.panelVisible&&$(window).width()>this.options.breakpoint&&this.panelFixed()){this.hideSidePanel()}}
SidePanelTab.prototype.updateActiveTab=function(){if(!this.panelVisible&&($(window).width()<this.options.breakpoint||!this.panelFixed())){$.oc.sideNav.unsetActiveItem()}
@ -1013,8 +1013,8 @@ if(typeof option=='string')data[option].call(data)})}
$.fn.sidePanelTab.Constructor=SidePanelTab
$.fn.sidePanelTab.noConflict=function(){$.fn.sidePanelTab=old
return this}
$(window).on('load',function(){$('[data-control=layout-sidepanel]').sidePanelTab()})
$(document).ready(function(){if(Modernizr.touch||(typeof(localStorage)!=='undefined')){if(localStorage.ocSidePanelFixed==0){$(document.body).addClass('side-panel-not-fixed')
$(document).ready(function(){$('[data-control=layout-sidepanel]').sidePanelTab()})
$(document).ready(function(){if(Modernizr.touchevents||(typeof(localStorage)!=='undefined')){if(localStorage.ocSidePanelFixed==0){$(document.body).addClass('side-panel-not-fixed')
$(window).trigger('resize')}
else if(localStorage.ocSidePanelFixed==1){$(document.body).removeClass('side-panel-not-fixed')
$(window).trigger('resize')}}})}(window.jQuery);+function($){"use strict";var SimpleList=function(element,options){var $el=this.$el=$(element)
@ -1102,8 +1102,8 @@ self.saveGroupStatus($(group).data('group-code'),true)}})}
SidenavTree.prototype.expandGroup=function(group,duration){var
$list=$('> ul',group),self=this
duration=duration===undefined?100:duration
$list.css({'overflow':'hidden','display':'','height':0})
$list.animate({'height':$list[0].scrollHeight},{duration:duration,queue:false,complete:function(){$list.css({'overflow':'visible','height':'auto'})
$list.css({'overflow':'hidden','height':0})
$list.animate({'height':$list[0].scrollHeight},{duration:duration,queue:false,complete:function(){$list.css({'overflow':'visible','height':'auto','display':''})
$(group).attr('data-status','expanded')
$(window).trigger('oc.updateUi')
self.saveGroupStatus($(group).data('group-code'),false)}})}

View File

@ -33,4 +33,4 @@
=require october.datetime.js
=require backend.js
*/
*/

View File

@ -1,8 +1,8 @@
/*
* Top navigation bar. Features of the bar:
* - Hide content if the display width is less than 768px. In this case the menu icon is displayed.
* - Hide content if the display width is less than 768px. In this case the menu icon is displayed.
* When the icon is clicked, the menu content is displayed on the left side of the page.
* - If the content doesn't fit the navbar, it can be dragged left and right.
* - If the content doesn't fit the navbar, it can be dragged left and right.
*
* Dependences:
* - DragScroll (october.dragscroll.js)
@ -10,7 +10,7 @@
*/
(function($){
$(window).on('load', function() {
$(document).ready(function(){
$('nav.navbar').each(function(){
var
navbar = $(this),
@ -39,4 +39,4 @@
})
})
})
})(jQuery);
})(jQuery);

View File

@ -26,7 +26,7 @@
options = this.options = options || {},
sizeName = this.sizeName = options.vertical ? 'height' : 'width',
isNative = $('html').hasClass('mobile'),
isTouch = this.isTouch = Modernizr.touch,
isTouch = this.isTouch = Modernizr.touchevents,
isScrollable = this.isScrollable = false,
isLocked = this.isLocked = false,
eventElementName = options.vertical ? 'pageY' : 'pageX',

View File

@ -100,13 +100,13 @@
$list.css({
'overflow': 'hidden',
'display': '',
'height': 0
})
$list.animate({'height': $list[0].scrollHeight}, { duration: duration, queue: false, complete: function() {
$list.css({
'overflow': 'visible',
'height': 'auto'
'height': 'auto',
'display': ''
})
$(group).attr('data-status', 'expanded')
$(window).trigger('oc.updateUi')

View File

@ -35,7 +35,7 @@
return
}
if (Modernizr.touch && $(window).width() < self.options.breakpoint) {
if (Modernizr.touchevents && $(window).width() < self.options.breakpoint) {
if ($(this).data('menu-item') == self.visibleItemId && self.panelVisible) {
self.hideSidePanel()
return
@ -50,7 +50,7 @@
return false
})
if (!Modernizr.touch) {
if (!Modernizr.touchevents) {
// The side panel now opens only when a menu item is hovered and
// when the item doesn't have the "data-no-side-panel" attribute.
// TODO: remove the comment and the code below if no issues noticed.
@ -151,7 +151,7 @@
}
SidePanelTab.prototype.updatePanelPosition = function() {
if (!this.panelFixed() || Modernizr.touch) {
if (!this.panelFixed() || Modernizr.touchevents) {
this.$el.height($(document).height() - this.mainNavHeight)
}
else {
@ -230,7 +230,7 @@
// DATA-API
// ============
$(window).on('load', function() {
$(document).ready(function(){
$('[data-control=layout-sidepanel]').sidePanelTab()
})
@ -238,7 +238,7 @@
// ====================
$(document).ready(function() {
if (Modernizr.touch || (typeof(localStorage) !== 'undefined')) {
if (Modernizr.touchevents || (typeof(localStorage) !== 'undefined')) {
if (localStorage.ocSidePanelFixed == 0) {
$(document.body).addClass('side-panel-not-fixed')
$(window).trigger('resize')

File diff suppressed because one or more lines are too long

View File

@ -14,7 +14,7 @@
z-index: @zindex-alert;
h2 {
word-break: word-break;
word-break: break-word;
word-wrap: break-word;
max-height: 350px;
overflow-y: auto;

View File

@ -108,7 +108,7 @@
> ul.submenu {
position: absolute;
left: 20px;
bottom: -37px;
bottom: -36.9px;
padding: 0;
list-style: none;
z-index: 200;
@ -577,7 +577,7 @@ body.dragging .control-treeview {
// Retina
//
@media only screen and (-moz-min-device-pixel-ratio: 1.5), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-devicepixel-ratio: 1.5), only screen and (min-resolution: 1.5dppx) {
@media only screen and (min--moz-device-pixel-ratio: 1.5), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-devicepixel-ratio: 1.5), only screen and (min-resolution: 1.5dppx) {
.control-treeview {
ol {
> li {
@ -619,4 +619,4 @@ body.dragging .control-treeview {
}
}
}
}
}

View File

@ -3,7 +3,7 @@
// --------------------------------------------------
html:not(.mobile) body.drag * {
cursor: drag !important;
cursor: grab !important;
cursor: -webkit-grab !important;
cursor: -moz-grab !important;
}
@ -51,7 +51,7 @@ body {
// Removed for performance reasons
//
// @import url(https://fonts.googleapis.com/css?family=Noto+Sans:400,400italic,700,700italic);
//
//
// body {
// font-family: 'Noto Sans', sans-serif;
// }
@ -137,7 +137,7 @@ body {
}
&.min-size {
height: 0;
height: 0.1px;
}
}

View File

@ -75,6 +75,39 @@ body.mainmenu-open {
}
}
ul.mainmenu-nav {
font-size: @font-size-base;
li {
/* Fix for SVG icons not rendering on initial page load until repaint (hover, move, etc) */
.svg-icon {
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
span.counter {
display: block;
position: absolute;
top: .143em;
right: 0;
padding: .143em .429em .214em .286em;
background-color: @color-sidebarnav-counter-bg;
color: @color-sidebarnav-counter-text;
font-size: .786em;
line-height: 100%;
.border-radius(3px);
.opacity(1);
.scale(1);
.transition(all 0.3s);
&.empty {
.opacity(0);
.scale(0);
}
}
}
}
nav#layout-mainmenu {
background-color: @color-mainmenu;
padding: 0 0 0 20px;
@ -116,10 +149,6 @@ nav#layout-mainmenu {
top: 0;
}
}
&.active a {
// font-weight: bold;
}
}
&.nav {
@ -318,7 +347,8 @@ nav#layout-mainmenu ul li .mainmenu-accountmenu {
// Navbar (Inline mode)
//
nav#layout-mainmenu.navbar-mode-inline {
nav#layout-mainmenu.navbar-mode-inline,
nav#layout-mainmenu.navbar-mode-inline_no_icons {
.mainmenu-set-height(@mainmenu-mode-inline-height);
ul.mainmenu-nav {
@ -361,6 +391,13 @@ nav#layout-mainmenu.navbar-mode-inline {
}
}
//
// Navbar (Inline no icons mode)
//
nav#layout-mainmenu.navbar-mode-inline_no_icons .nav-icon {
display: none !important;
}
//
// Navbar (Tiles mode)
//

View File

@ -139,6 +139,11 @@ class FormController extends ControllerBehavior
*/
$this->formWidget = $this->makeWidget('Backend\Widgets\Form', $config);
// Setup the default preview mode on form initialization if the context is preview
if ($config->context === 'preview') {
$this->formWidget->previewMode = true;
}
$this->formWidget->bindEvent('form.extendFieldsBefore', function () {
$this->controller->formExtendFieldsBefore($this->formWidget);
});
@ -463,7 +468,7 @@ class FormController extends ControllerBehavior
}
if ($model && $redirectUrl) {
$redirectUrl = RouterHelper::parseValues($model, array_keys($model->getAttributes()), $redirectUrl);
$redirectUrl = RouterHelper::replaceParameters($model, $redirectUrl);
}
if (starts_with($redirectUrl, 'http://') || starts_with($redirectUrl, 'https://')) {
@ -531,11 +536,12 @@ class FormController extends ControllerBehavior
* <?= $this->formRenderField('field_name') ?>
*
* @param string $name Field name
* @param array $options (e.g. ['useContainer'=>false])
* @return string HTML markup
*/
public function formRenderField($name)
public function formRenderField($name, $options = [])
{
return $this->formWidget->renderField($name);
return $this->formWidget->renderField($name, $options);
}
/**

View File

@ -35,7 +35,6 @@ use Exception;
*/
class ImportExportController extends ControllerBehavior
{
/**
* @inheritDoc
*/
@ -159,7 +158,9 @@ class ImportExportController extends ControllerBehavior
return $response;
}
$this->checkUseListExportMode();
if ($response = $this->checkUseListExportMode()) {
return $response;
}
$this->addJs('js/october.export.js', 'core');
$this->addCss('css/export.css', 'core');
@ -210,7 +211,7 @@ class ImportExportController extends ControllerBehavior
catch (Exception $ex) {
$this->controller->handleError($ex);
}
$this->vars['sourceIndexOffset'] = $this->getImportSourceIndexOffset($importOptions['firstRowTitles']);
return $this->importExportMakePartial('import_result_form');
@ -334,7 +335,7 @@ class ImportExportController extends ControllerBehavior
return $firstRow;
}
/**
* Get the index offset to add to the reported row number in status messages
*
@ -387,6 +388,7 @@ class ImportExportController extends ControllerBehavior
public function importIsColumnRequired($columnName)
{
$model = $this->importGetModel();
return $model->isAttributeRequired($columnName);
}
@ -398,7 +400,9 @@ class ImportExportController extends ControllerBehavior
$dbColumns = $this->getImportDbColumns();
foreach ($dbColumns as $column => $label) {
if (!$this->importIsColumnRequired($column)) continue;
if (!$this->importIsColumnRequired($column)) {
continue;
}
$found = false;
foreach ($matches as $matchedColumns) {
@ -577,7 +581,7 @@ class ImportExportController extends ControllerBehavior
$listDefinition = $useList;
}
$this->exportFromList($listDefinition);
return $this->exportFromList($listDefinition);
}
/**
@ -597,18 +601,22 @@ class ImportExportController extends ControllerBehavior
*/
$defaultOptions = [
'fileName' => $this->exportFileName,
'delimiter' => ',',
'enclosure' => '"'
'delimiter' => $this->getConfig('defaultFormatOptions[delimiter]', ','),
'enclosure' => $this->getConfig('defaultFormatOptions[enclosure]', '"'),
'escape' => $this->getConfig('defaultFormatOptions[escape]', '\\'),
];
$options = array_merge($defaultOptions, $options);
$filename = filter_var($options['fileName'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
/*
* Prepare CSV
*/
$csv = CsvWriter::createFromFileObject(new SplTempFileObject);
$csv->setDelimiter($options['delimiter']);
$csv->setEnclosure($options['enclosure']);
$csv->setEscape($options['escape']);
/*
* Add headers
@ -627,8 +635,13 @@ class ImportExportController extends ControllerBehavior
? 'getColumnValueRaw'
: 'getColumnValue';
$model = $widget->prepareModel();
$results = $model->get();
$query = $widget->prepareQuery();
$results = $query->get();
if ($event = $widget->fireSystemEvent('backend.list.extendRecords', [&$results])) {
$results = $event;
}
foreach ($results as $result) {
$record = [];
foreach ($columns as $column) {
@ -642,10 +655,14 @@ class ImportExportController extends ControllerBehavior
}
/*
* Output
* Response
*/
$csv->output($options['fileName']);
exit;
$response = Response::make();
$response->header('Content-Type', 'text/csv');
$response->header('Content-Transfer-Encoding', 'binary');
$response->header('Content-Disposition', sprintf('%s; filename="%s"', 'attachment', $filename));
$response->setContent((string) $csv);
return $response;
}
//
@ -661,6 +678,7 @@ class ImportExportController extends ControllerBehavior
public function importExportMakePartial($partial, $params = [])
{
$contents = $this->controller->makePartial('import_export_'.$partial, $params + $this->vars, false);
if (!$contents) {
$contents = $this->makePartial($partial, $params);
}
@ -799,10 +817,10 @@ class ImportExportController extends ControllerBehavior
$presetMode = post('format_preset');
$options = [
'delimiter' => null,
'enclosure' => null,
'escape' => null,
'encoding' => null
'delimiter' => $this->getConfig('defaultFormatOptions[delimiter]'),
'enclosure' => $this->getConfig('defaultFormatOptions[enclosure]'),
'escape' => $this->getConfig('defaultFormatOptions[escape]'),
'encoding' => $this->getConfig('defaultFormatOptions[encoding]'),
];
if ($presetMode == 'custom') {
@ -814,5 +832,4 @@ class ImportExportController extends ControllerBehavior
return $options;
}
}

View File

@ -753,7 +753,7 @@ class RelationController extends ControllerBehavior
if ($this->viewMode == 'single') {
$config->showCheckboxes = false;
$config->recordOnClick = sprintf(
"$.oc.relationBehavior.clickManageListRecord(:%s, '%s', '%s')",
"$.oc.relationBehavior.clickManageListRecord(':%s', '%s', '%s')",
$this->relationModel->getKeyName(),
$this->relationGetId(),
$this->relationGetSessionKey()
@ -764,7 +764,7 @@ class RelationController extends ControllerBehavior
}
elseif ($isPivot) {
$config->recordOnClick = sprintf(
"$.oc.relationBehavior.clickManagePivotListRecord(:%s, '%s', '%s')",
"$.oc.relationBehavior.clickManagePivotListRecord(':%s', '%s', '%s')",
$this->relationModel->getKeyName(),
$this->relationGetId(),
$this->relationGetSessionKey()
@ -1062,7 +1062,7 @@ class RelationController extends ControllerBehavior
$saveData = $this->manageWidget->getSaveData();
if ($this->viewMode == 'multi') {
$model = $this->relationModel->find($this->manageId);
$model = $this->manageWidget->model;
$modelsToSave = $this->prepareModelsToSave($model, $saveData);
foreach ($modelsToSave as $modelToSave) {
$modelToSave->save(null, $this->manageWidget->getSessionKey());

View File

@ -59,6 +59,15 @@
})
}
/*
* This function is called every time a record is created, added, removed
* or deleted using the relation widget. It triggers the change.oc.formwidget
* event to notify other elements on the page about the changed form state.
*/
this.changed = function(relationId, event) {
$('[data-field-name="' + relationId + '"]').trigger('change.oc.formwidget', {event: event});
}
/*
* This function transfers the supplied variables as hidden form inputs,
* to any popup that is spawned within the supplied container. The spawned

View File

@ -3,6 +3,7 @@
class="btn btn-sm btn-secondary oc-icon-trash-o"
data-request="onRelationButtonDelete"
data-request-confirm="<?= e(trans('backend::lang.relation.delete_confirm')) ?>"
data-request-success="$.oc.relationBehavior.changed('<?= e($this->vars['relationField']) ?>', 'deleted')"
data-stripe-load-indicator>
<?= e(trans('backend::lang.relation.delete')) ?>
</button>
@ -15,6 +16,7 @@
disabled="disabled"
data-request="onRelationButtonDelete"
data-request-confirm="<?= e(trans('backend::lang.relation.delete_confirm')) ?>"
data-request-success="$.oc.relationBehavior.changed('<?= e($this->vars['relationField']) ?>', 'deleted')"
data-trigger-action="enable"
data-trigger="#<?= $this->relationGetId('view') ?> .control-list input[type=checkbox]"
data-trigger-condition="checked"

View File

@ -2,6 +2,7 @@
<button
class="btn btn-sm btn-secondary oc-icon-minus"
data-request="onRelationButtonRemove"
data-request-success="$.oc.relationBehavior.changed('<?= e($this->vars['relationField']) ?>', 'removed')"
data-stripe-load-indicator>
<?= e(trans('backend::lang.relation.remove')) ?>
</button>
@ -13,6 +14,7 @@
})"
disabled="disabled"
data-request="onRelationButtonRemove"
data-request-success="$.oc.relationBehavior.changed('<?= e($this->vars['relationField']) ?>', 'removed')"
data-trigger-action="enable"
data-trigger="#<?= $this->relationGetId('view') ?> .control-list input[type=checkbox]"
data-trigger-condition="checked"

View File

@ -2,6 +2,7 @@
href="javascript:;"
class="btn btn-sm btn-secondary oc-icon-unlink"
data-request="onRelationButtonUnlink"
data-request-success="$.oc.relationBehavior.changed('<?= e($this->vars['relationField']) ?>', 'removed')"
data-request-confirm="<?= e(trans('backend::lang.relation.unlink_confirm')) ?>"
data-stripe-load-indicator>
<?= e(trans('backend::lang.relation.unlink')) ?>

View File

@ -47,7 +47,11 @@
<?php else: ?>
<?= Form::ajax('onRelationManageCreate', ['data-popup-load-indicator' => true, 'sessionKey' => $newSessionKey]) ?>
<?= Form::ajax('onRelationManageCreate', [
'data-popup-load-indicator' => true,
'data-request-success' => "$.oc.relationBehavior.changed('" . e($this->vars['relationField']) . "', 'created')",
'sessionKey' => $newSessionKey
]) ?>
<!-- Passable fields -->
<input type="hidden" name="_relation_field" value="<?= $relationField ?>" />

View File

@ -21,6 +21,7 @@
class="btn btn-primary"
data-request="onRelationManageAdd"
data-dismiss="popup"
data-request-success="$.oc.relationBehavior.changed('<?= e($this->vars['relationField']) ?>', 'added')"
data-stripe-load-indicator>
<?= e(trans('backend::lang.relation.add_selected')) ?>
</button>

View File

@ -7,7 +7,7 @@
>
<div class="record">
<a href="javascript:;" class="move"></a>
<span><?= $this->reorderGetRecordName($record) ?></span>
<span><?= e($this->reorderGetRecordName($record)) ?></span>
<input name="record_ids[]" type="hidden" value="<?= $record->getKey() ?>" />
</div>

View File

@ -162,9 +162,38 @@ class AuthManager extends RainAuthManager
return $tabs;
}
/**
* {@inheritdoc}
*/
protected function createUserModelQuery()
{
return parent::createUserModelQuery()->withTrashed();
}
/**
* {@inheritdoc}
*/
protected function validateUserModel($user)
{
if ( ! $user instanceof $this->userModel) {
return false;
}
// Perform the deleted_at check manually since the relevant migrations
// might not have been run yet during the update to build 444.
// @see https://github.com/octobercms/october/issues/3999
if (array_key_exists('deleted_at', $user->getAttributes()) && $user->deleted_at !== null) {
return false;
}
return $user;
}
/**
* Returns an array of registered permissions belonging to a given role code
* @param string $role
* @param bool $includeOrphans
* @return array
*/
public function listPermissionsForRole($role, $includeOrphans = true)

View File

@ -4,11 +4,14 @@ use Str;
use App;
use File;
use View;
use Event;
use Config;
use Request;
use Response;
use Closure;
use Illuminate\Routing\Controller as ControllerBase;
use October\Rain\Router\Helper as RouterHelper;
use Closure;
use System\Classes\PluginManager;
/**
* This is the master controller for all back-end pages.
@ -42,11 +45,57 @@ class BackendController extends ControllerBase
*/
public static $params;
/**
* @var boolean Flag to indicate that the CMS module is handling the current request
*/
protected $cmsHandling = false;
/**
* Stores the requested controller so that the constructor is only run once
*
* @var Backend\Classes\Controller
*/
protected $requestedController;
/**
* Instantiate a new BackendController instance.
*/
public function __construct()
{
$this->middleware(function ($request, $next) {
// Process the request before retrieving controller middleware, to allow for the session and auth data
// to be made available to the controller's constructor.
$response = $next($request);
// Find requested controller to determine if any middleware has been attached
$pathParts = explode('/', str_replace(Request::root() . '/', '', Request::url()));
if (count($pathParts)) {
// Drop off preceding backend URL part if needed
if (!empty(Config::get('cms.backendUri', 'backend'))) {
array_shift($pathParts);
}
$path = implode('/', $pathParts);
$requestedController = $this->getRequestedController($path);
if (!is_null($requestedController) && count($requestedController['controller']->getMiddleware())) {
$action = $requestedController['action'];
// Collect applicable middleware and insert middleware into pipeline
$controllerMiddleware = collect($requestedController['controller']->getMiddleware())
->reject(function ($data) use ($action) {
return static::methodExcludedByOptions($action, $data['options']);
})
->pluck('middleware');
foreach ($controllerMiddleware as $middleware) {
$middleware->call($requestedController['controller'], $request, $response);
}
}
}
return $response;
});
$this->extendableConstruct();
}
@ -58,6 +107,25 @@ class BackendController extends ControllerBase
self::extendableExtendCallback($callback);
}
/**
* Pass unhandled URLs to the CMS Controller, if it exists
*
* @param string $url
* @return Response
*/
protected function passToCmsController($url)
{
if (
in_array('Cms', Config::get('cms.loadModules', [])) &&
class_exists('\Cms\Classes\Controller')
) {
$this->cmsHandling = true;
return App::make('Cms\Classes\Controller')->run($url);
} else {
return Response::make(View::make('backend::404'), 404);
}
}
/**
* Finds and serves the requested backend controller.
* If the controller cannot be found, returns the Cms page with the URL /404.
@ -70,15 +138,50 @@ class BackendController extends ControllerBase
{
$params = RouterHelper::segmentizeUrl($url);
// Handle NotFoundHttpExceptions in the backend (usually triggered by abort(404))
Event::listen('exception.beforeRender', function ($exception, $httpCode, $request) {
if (!$this->cmsHandling && $exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) {
return View::make('backend::404');
}
}, 1);
/*
* Database check
*/
if (!App::hasDatabase()) {
return Config::get('app.debug', false)
? Response::make(View::make('backend::no_database'), 200)
: App::make('Cms\Classes\Controller')->run($url);
: $this->passToCmsController($url);
}
$controllerRequest = $this->getRequestedController($url);
if (!is_null($controllerRequest)) {
return $controllerRequest['controller']->run(
$controllerRequest['action'],
$controllerRequest['params']
);
}
/*
* Fall back on Cms controller
*/
return $this->passToCmsController($url);
}
/**
* Determines the controller and action to load in the backend via a provided URL.
*
* If a suitable controller is found, this will return an array with the controller class name as a string, the
* action to call as a string and an array of parameters. If a suitable controller and action cannot be found,
* this method will return null.
*
* @param string $url A URL to determine the requested controller and action for
* @return array|null A suitable controller, action and parameters in an array if found, otherwise null.
*/
protected function getRequestedController($url)
{
$params = RouterHelper::segmentizeUrl($url);
/*
* Look for a Module controller
*/
@ -92,7 +195,11 @@ class BackendController extends ControllerBase
$action,
base_path().'/modules'
)) {
return $controllerObj->run($action, $controllerParams);
return [
'controller' => $controllerObj,
'action' => $action,
'params' => $controllerParams
];
}
/*
@ -100,6 +207,12 @@ class BackendController extends ControllerBase
*/
if (count($params) >= 2) {
list($author, $plugin) = $params;
$pluginCode = ucfirst($author) . '.' . ucfirst($plugin);
if (PluginManager::instance()->isDisabled($pluginCode)) {
return Response::make(View::make('backend::404'), 404);
}
$controller = $params[2] ?? 'index';
self::$action = $action = isset($params[3]) ? $this->parseAction($params[3]) : 'index';
self::$params = $controllerParams = array_slice($params, 4);
@ -109,14 +222,15 @@ class BackendController extends ControllerBase
$action,
plugins_path()
)) {
return $controllerObj->run($action, $controllerParams);
return [
'controller' => $controllerObj,
'action' => $action,
'params' => $controllerParams
];
}
}
/*
* Fall back on Cms controller
*/
return App::make('Cms\Classes\Controller')->run($url);
return null;
}
/**
@ -129,6 +243,10 @@ class BackendController extends ControllerBase
*/
protected function findController($controller, $action, $inPath)
{
if (isset($this->requestedController)) {
return $this->requestedController;
}
/*
* Workaround: Composer does not support case insensitivity.
*/
@ -141,16 +259,16 @@ class BackendController extends ControllerBase
}
if (!class_exists($controller)) {
return false;
return $this->requestedController = null;
}
$controllerObj = App::make($controller);
if ($controllerObj->actionExists($action)) {
return $controllerObj;
return $this->requestedController = $controllerObj;
}
return false;
return $this->requestedController = null;
}
/**
@ -166,4 +284,17 @@ class BackendController extends ControllerBase
return $actionName;
}
/**
* Determine if the given options exclude a particular method.
*
* @param string $method
* @param array $options
* @return bool
*/
protected static function methodExcludedByOptions($method, array $options)
{
return (isset($options['only']) && !in_array($method, (array) $options['only'])) ||
(!empty($options['except']) && in_array($method, (array) $options['except']));
}
}

View File

@ -4,6 +4,7 @@ use Lang;
use View;
use Flash;
use Config;
use Closure;
use Request;
use Backend;
use Session;
@ -18,9 +19,9 @@ use October\Rain\Exception\AjaxException;
use October\Rain\Exception\SystemException;
use October\Rain\Exception\ValidationException;
use October\Rain\Exception\ApplicationException;
use October\Rain\Extension\Extendable;
use Illuminate\Database\Eloquent\MassAssignmentException;
use Illuminate\Http\RedirectResponse;
use Illuminate\Routing\Controller as ControllerBase;
/**
* The Backend base controller class, used by Backend controllers.
@ -29,7 +30,7 @@ use Illuminate\Http\RedirectResponse;
* @package october\backend
* @author Alexey Bobkov, Samuel Georges
*/
class Controller extends Extendable
class Controller extends ControllerBase
{
use \System\Traits\ViewMaker;
use \System\Traits\AssetMaker;
@ -37,6 +38,12 @@ class Controller extends Extendable
use \System\Traits\EventEmitter;
use \Backend\Traits\ErrorMaker;
use \Backend\Traits\WidgetMaker;
use \October\Rain\Extension\ExtendableTrait;
/**
* @var array Behaviors implemented by this controller.
*/
public $implement;
/**
* @var object Reference the logged in admin user.
@ -111,6 +118,11 @@ class Controller extends Extendable
*/
protected $statusCode = 200;
/**
* @var mixed Override the standard controller response.
*/
protected $responseOverride = null;
/**
* Constructor.
*/
@ -146,8 +158,6 @@ class Controller extends Extendable
*/
$this->user = BackendAuth::getUser();
parent::__construct();
/*
* Media Manager widget is available on all back-end pages
*/
@ -155,6 +165,36 @@ class Controller extends Extendable
$manager = new MediaManager($this, 'ocmediamanager');
$manager->bindToController();
}
$this->extendableConstruct();
}
/**
* Extend this object properties upon construction.
*/
public static function extend(Closure $callback)
{
self::extendableExtendCallback($callback);
}
public function __get($name)
{
return $this->extendableGet($name);
}
public function __set($name, $value)
{
$this->extendableSet($name, $value);
}
public function __call($name, $params)
{
return $this->extendableCall($name, $params);
}
public static function __callStatic($name, $params)
{
return self::extendableCallStatic($name, $params);
}
/**
@ -245,6 +285,10 @@ class Controller extends Extendable
*/
$result = $this->execPageAction($action, $params);
if ($this->responseOverride !== null) {
$result = $this->responseOverride;
}
if (!is_string($result)) {
return $result;
}
@ -339,11 +383,15 @@ class Controller extends Extendable
$result = null;
if (!$this->actionExists($actionName)) {
throw new SystemException(sprintf(
"Action %s is not found in the controller %s",
$actionName,
get_class($this)
));
if (Config::get('app.debug', false)) {
throw new SystemException(sprintf(
"Action %s is not found in the controller %s",
$actionName,
get_class($this)
));
} else {
Response::make(View::make('backend::404'), 404);
}
}
// Execute the action
@ -396,7 +444,7 @@ class Controller extends Extendable
* Validate the handler name
*/
if (!preg_match('/^(?:\w+\:{2})?on[A-Z]{1}[\w+]*$/', $handler)) {
throw new SystemException(Lang::get('cms::lang.ajax_handler.invalid_name', ['name'=>$handler]));
throw new SystemException(Lang::get('backend::lang.ajax_handler.invalid_name', ['name'=>$handler]));
}
/*
@ -407,7 +455,7 @@ class Controller extends Extendable
foreach ($partialList as $partial) {
if (!preg_match('/^(?!.*\/\/)[a-z0-9\_][a-z0-9\_\-\/]*$/i', $partial)) {
throw new SystemException(Lang::get('cms::lang.partial.invalid_name', ['name'=>$partial]));
throw new SystemException(Lang::get('backend::lang.partial.invalid_name', ['name'=>$partial]));
}
}
}
@ -421,7 +469,7 @@ class Controller extends Extendable
* Execute the handler
*/
if (!$result = $this->runAjaxHandler($handler)) {
throw new ApplicationException(Lang::get('cms::lang.ajax_handler.not_found', ['name'=>$handler]));
throw new ApplicationException(Lang::get('backend::lang.ajax_handler.not_found', ['name'=>$handler]));
}
/*
@ -645,6 +693,17 @@ class Controller extends Extendable
return $this;
}
/**
* Sets the response for the current page request cycle, this value takes priority
* over the standard response prepared by the controller.
* @param mixed $response Response object or string
*/
public function setResponse($response)
{
$this->responseOverride = $response;
return $this;
}
//
// Hints
//

View File

@ -178,8 +178,8 @@ class FormField
/**
* Constructor.
* @param string $fieldName
* @param string $label
* @param string $fieldName The name of the field
* @param string $label The label of the field
*/
public function __construct($fieldName, $label)
{
@ -511,7 +511,7 @@ class FormField
'data-trigger' => '[name="'.$fullTriggerField.'"]',
'data-trigger-action' => $triggerAction,
'data-trigger-condition' => $triggerCondition,
'data-trigger-closest-parent' => 'form'
'data-trigger-closest-parent' => 'form, div[data-control="formwidget"]'
];
return $attributes + $newAttributes;

View File

@ -50,6 +50,11 @@ abstract class FormWidgetBase extends WidgetBase
*/
protected $formField;
/**
* @var Backend\Widgets\Form The parent form that contains this field
*/
protected $parentForm = null;
/**
* @var string Form field name.
*/
@ -79,12 +84,23 @@ abstract class FormWidgetBase extends WidgetBase
'data',
'sessionKey',
'previewMode',
'showLabels'
'showLabels',
'parentForm',
]);
parent::__construct($controller, $configuration);
}
/**
* Retrieve the parent form for this formwidget
*
* @return Backend\Widgets\Form|null
*/
public function getParentForm()
{
return $this->parentForm;
}
/**
* Returns the HTML element field name for this widget, used for capturing
* user input, passed back to the getSaveValue method when saving.

View File

@ -81,6 +81,11 @@ class ListColumn
*/
public $cssClass;
/**
* @var string Specify a CSS class to attach to the list header cell element.
*/
public $headCssClass;
/**
* @var string Specify a format or style for the column value, such as a Date.
*/
@ -138,6 +143,9 @@ class ListColumn
if (isset($config['cssClass'])) {
$this->cssClass = $config['cssClass'];
}
if (isset($config['headCssClass'])) {
$this->headCssClass = $config['headCssClass'];
}
if (isset($config['searchable'])) {
$this->searchable = $config['searchable'];
}
@ -250,13 +258,12 @@ class ListColumn
}
else {
if (is_array($result) && array_key_exists($key, $result)) {
return $result[$key];
}
if (!isset($result->{$key})) {
$result = $result[$key];
} elseif (!isset($result->{$key})) {
return $default;
} else {
$result = $result->{$key};
}
$result = $result->{$key};
}
}

View File

@ -35,6 +35,8 @@ class NavigationManager
'label' => null,
'icon' => null,
'iconSvg' => null,
'counter' => null,
'counterLabel'=> null,
'url' => null,
'permissions' => [],
'order' => 500,
@ -168,17 +170,20 @@ class NavigationManager
* - permissions - an array of permissions the back-end user should have, optional.
* The item will be displayed if the user has any of the specified permissions.
* - order - a position of the item in the menu, optional.
* - sideMenu - an array of side menu items, optional. If provided, the array items
* should represent the side menu item code, and each value should be an associative
* array with the following keys:
* - label - specifies the menu label localization string key, required.
* - icon - an icon name from the Font Awesome icon collection, required.
* - url - the back-end relative URL the menu item should point to, required.
* - attributes - an array of attributes and values to apply to the menu item, optional.
* - permissions - an array of permissions the back-end user should have, optional.
* - counter - an optional numeric value to output near the menu icon. The value should be
* a number or a callable returning a number.
* - counterLabel - an optional string value to describe the numeric reference in counter.
* - sideMenu - an array of side menu items, optional. If provided, the array items
* should represent the side menu item code, and each value should be an associative
* array with the following keys:
* - label - specifies the menu label localization string key, required.
* - icon - an icon name from the Font Awesome icon collection, required.
* - url - the back-end relative URL the menu item should point to, required.
* - attributes - an array of attributes and values to apply to the menu item, optional.
* - permissions - an array of permissions the back-end user should have, optional.
* - counter - an optional numeric value to output near the menu icon. The value should be
* a number or a callable returning a number.
* - counterLabel - an optional string value to describe the numeric reference in counter.
* @param string $owner Specifies the menu items owner plugin or module in the format Author.Plugin.
* @param array $definitions An array of the menu item definitions.
*/
@ -306,6 +311,27 @@ class NavigationManager
$this->loadItems();
}
foreach ($this->items as $item) {
if ($item->counter === false) {
continue;
}
if ($item->counter !== null && is_callable($item->counter)) {
$item->counter = call_user_func($item->counter, $item);
} elseif (!empty((int) $item->counter)) {
$item->counter = (int) $item->counter;
} elseif (!empty($sideItems = $this->listSideMenuItems($item->owner, $item->code))) {
$item->counter = 0;
foreach ($sideItems as $sideItem) {
$item->counter += $sideItem->counter;
}
}
if (empty($item->counter)) {
$item->counter = null;
}
}
return $this->items;
}
@ -337,6 +363,9 @@ class NavigationManager
foreach ($items as $item) {
if ($item->counter !== null && is_callable($item->counter)) {
$item->counter = call_user_func($item->counter, $item);
if (empty($item->counter)) {
$item->counter = null;
}
}
}
@ -501,4 +530,4 @@ class NavigationManager
{
return strtoupper($owner).'.'.strtoupper($code);
}
}
}

View File

@ -15,6 +15,14 @@ class ReportWidgetBase extends WidgetBase
{
$this->properties = $this->validateProperties($properties);
/*
* Ensure the provided alias (if present) takes effect as the widget configuration is
* not passed to the WidgetBase constructor which would normally take care of that
*/
if (!isset($this->alias)) {
$this->alias = $properties['alias'] ?? $this->defaultAlias;
}
parent::__construct($controller);
}
}

View File

@ -1,6 +1,7 @@
<?php namespace Backend\Classes;
use Str;
use BackendAuth;
use System\Classes\PluginManager;
use Event;
@ -206,6 +207,15 @@ class WidgetManager
*/
Event::fire('system.reportwidgets.extendItems', [$this]);
$user = BackendAuth::getUser();
foreach ($this->reportWidgets as $widget => $config) {
if (!empty($config['permissions'])) {
if (!$user->hasAccess($config['permissions'], false)) {
unset($this->reportWidgets[$widget]);
}
}
}
return $this->reportWidgets;
}
@ -247,5 +257,4 @@ class WidgetManager
unset($this->reportWidgets[$className]);
}
}
}

View File

@ -32,6 +32,22 @@ class Auth extends Controller
public function __construct()
{
parent::__construct();
$this->middleware(function ($request, $response) {
// Clear Cache and any previous data to fix Invalid security token issue, see github: #3707
$response->headers->set('Cache-Control', 'no-cache, no-store, must-revalidate');
})->only('signin');
// Only run on HTTPS connections
if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] === "on") {
$this->middleware(function ($request, $response) {
// Add HTTP Header 'Clear Site Data' to remove all Sensitive Data when signout, see github issue: #3707
$response->headers->set('Clear-Site-Data', 'cache, cookies, storage, executionContexts');
})->only('signout');
}
// Add JS File to un-install SW to avoid Cookie Cache Issues when Signin, see github issue: #3707
$this->addJs(url("/modules/backend/assets/js/auth/uninstall-sw.js"));
$this->layout = 'auth';
}

View File

@ -1,7 +1,8 @@
<?php namespace Backend\Controllers;
use App;
use View;
use Backend;
use Response;
use System\Models\File as FileModel;
use Backend\Classes\Controller;
use ApplicationException;
@ -25,12 +26,11 @@ class Files extends Controller
public function get($code = null)
{
try {
echo $this->findFileObject($code)->output();
exit;
return $this->findFileObject($code)->output('inline', true);
}
catch (Exception $ex) {}
return App::make('Cms\Classes\Controller')->setStatusCode(404)->run('/404');
return Response::make(View::make('backend::404'), 404);
}
/**
@ -39,16 +39,16 @@ class Files extends Controller
public function thumb($code = null, $width = 100, $height = 100, $mode = 'auto', $extension = 'auto')
{
try {
echo $this->findFileObject($code)->outputThumb(
return $this->findFileObject($code)->outputThumb(
$width,
$height,
compact('mode', 'extension')
compact('mode', 'extension'),
true
);
exit;
}
catch (Exception $ex) {}
return App::make('Cms\Classes\Controller')->setStatusCode(404)->run('/404');
return Response::make(View::make('backend::404'), 404);
}
/**
@ -110,7 +110,7 @@ class Files extends Controller
if (!$file = FileModel::find((int) $id)) {
throw new ApplicationException('Unable to find file');
}
/**
* Ensure that the file model utilized for this request is
* the one specified in the relationship configuration

View File

@ -1,6 +1,9 @@
<?php namespace Backend\Controllers;
use Lang;
use Flash;
use Backend;
use Redirect;
use BackendMenu;
use BackendAuth;
use Backend\Models\UserGroup;
@ -68,7 +71,7 @@ class Users extends Controller
$query->where('is_superuser', false);
}
}
/**
* Prevents non-superusers from even seeing the is_superuser filter
*/
@ -79,6 +82,16 @@ class Users extends Controller
}
}
/**
* Strike out deleted records
*/
public function listInjectRowClass($record, $definition = null)
{
if ($record->trashed()) {
return 'strike';
}
}
/**
* Extends the form query to prevent non-superusers from accessing superusers at all
*/
@ -87,6 +100,9 @@ class Users extends Controller
if (!$this->user->isSuperUser()) {
$query->where('is_superuser', false);
}
// Ensure soft-deleted records can still be managed
$query->withTrashed();
}
/**
@ -102,6 +118,18 @@ class Users extends Controller
return $this->asExtension('FormController')->update($recordId, $context);
}
/**
* Handle restoring users
*/
public function update_onRestore($recordId)
{
$this->formFindModelObject($recordId)->restore();
Flash::success(Lang::get('backend::lang.form.restore_success', ['name' => Lang::get('backend::lang.user.name')]));
return Redirect::refresh();
}
/**
* My Settings controller
*/
@ -158,7 +186,9 @@ class Users extends Controller
$defaultGroupIds = UserGroup::where('is_new_user_default', true)->lists('id');
$groupField = $form->getField('groups');
$groupField->value = $defaultGroupIds;
if ($groupField) {
$groupField->value = $defaultGroupIds;
}
}
}

View File

@ -2,8 +2,8 @@
<?= Form::open() ?>
<input type="hidden" name="postback" value="1" />
<input type="hidden" name="id" value="<?= $id ?>" />
<input type="hidden" name="code" value="<?= $code ?>" />
<input type="hidden" name="id" value="<?= e($id) ?>" />
<input type="hidden" name="code" value="<?= e($code) ?>" />
<div class="form-elements" role="form">
<div class="form-group text-field horizontal-form october">

View File

@ -8,16 +8,16 @@ defaultWidgets:
class: Backend\ReportWidgets\Welcome
sortOrder: 50
configuration:
ocWidgetWidth: 6
ocWidgetWidth: 7
systemStatus:
class: System\ReportWidgets\Status
sortOrder: 60
configuration:
ocWidgetWidth: 6
ocWidgetWidth: 7
activeTheme:
class: Cms\ReportWidgets\ActiveTheme
sortOrder: 70
configuration:
ocWidgetWidth: 4
ocWidgetWidth: 5

View File

@ -0,0 +1,9 @@
<div class="layout-row min-size">
<div class="callout callout-danger">
<div class="header">
<i class="icon-trash"></i>
<h3><?= e(trans('backend::lang.user.trashed_hint_title')) ?></h3>
<p><?= e(trans('backend::lang.user.trashed_hint_desc')) ?></p>
</div>
</div>
</div>

View File

@ -21,3 +21,10 @@ scopes:
modelClass: Backend\Models\UserRole
conditions: role_id in (:filtered)
nameFrom: name
show_deleted:
label: backend::lang.user.show_deleted
type: checkbox
modelClass: Backend\Models\User
scope: withTrashed
default: 0

View File

@ -8,6 +8,10 @@
<?php if (!$this->fatalError): ?>
<?php Block::put('form-contents') ?>
<?php if ($formModel->trashed()): ?>
<?= $this->makePartial('hint_trashed') ?>
<?php endif; ?>
<div class="layout">
<div class="layout-row">
@ -38,13 +42,23 @@
<span class="btn-text">
<?= e(trans('backend::lang.form.or')) ?> <a href="<?= Backend::url('backend/users') ?>"><?= e(trans('backend::lang.form.cancel')) ?></a>
</span>
<button
type="button"
class="oc-icon-trash-o btn-icon danger pull-right"
data-request="onDelete"
data-load-indicator="<?= e(trans('backend::lang.form.deleting')) ?>"
data-request-confirm="<?= e(trans('backend::lang.user.delete_confirm')) ?>">
</button>
<?php if ($formModel->trashed()) : ?>
<button
type="button"
class="oc-icon-user-plus btn-icon info pull-right"
data-request="onRestore"
data-load-indicator="<?= e(trans('backend::lang.form.restoring')) ?>"
data-request-confirm="<?= e(trans('backend::lang.form.confirm_restore')) ?>">
</button>
<?php else: ?>
<button
type="button"
class="oc-icon-trash-o btn-icon danger pull-right"
data-request="onDelete"
data-load-indicator="<?= e(trans('backend::lang.form.deleting')) ?>"
data-request-confirm="<?= e(trans('backend::lang.user.delete_confirm')) ?>">
</button>
<?php endif; ?>
</div>
</div>

View File

@ -24,6 +24,7 @@ class DbBackendUsers extends Migration
$table->timestamp('activated_at')->nullable();
$table->timestamp('last_login')->nullable();
$table->timestamps();
$table->timestamp('deleted_at')->nullable();
});
}

View File

@ -0,0 +1,25 @@
<?php
use October\Rain\Database\Schema\Blueprint;
use October\Rain\Database\Updates\Migration;
class DbBackendAddDeletedAt extends Migration
{
public function up()
{
if (!Schema::hasColumn('backend_users', 'deleted_at')) {
Schema::table('backend_users', function (Blueprint $table) {
$table->timestamp('deleted_at')->nullable()->after('updated_at');
});
}
}
public function down()
{
if (Schema::hasColumn('backend_users', 'deleted_at')) {
Schema::table('backend_users', function (Blueprint $table) {
$table->dropColumn('deleted_at');
});
}
}
}

View File

@ -149,8 +149,13 @@ class DataTable extends FormWidgetBase
$config = $this->makeConfig((array) $this->config);
$config->dataSource = 'client';
$config->alias = studly_case(HtmlHelper::nameToId($this->fieldName)) . 'datatable';
$config->fieldName = $this->fieldName;
if (isset($this->getParentForm()->arrayName)) {
$config->alias = studly_case(HtmlHelper::nameToId($this->getParentForm()->arrayName . '[' . $this->fieldName . ']')) . 'datatable';
$config->fieldName = $this->getParentForm()->arrayName . '[' . $this->fieldName . ']';
} else {
$config->alias = studly_case(HtmlHelper::nameToId($this->fieldName)) . 'datatable';
$config->fieldName = $this->fieldName;
}
$table = new Table($this->controller, $config);

View File

@ -1,5 +1,6 @@
<?php namespace Backend\FormWidgets;
use Config;
use Carbon\Carbon;
use Backend\Classes\FormField;
use Backend\Classes\FormWidgetBase;
@ -120,8 +121,14 @@ class DatePicker extends FormWidgetBase
if ($value = $this->getLoadValue()) {
$value = DateTimeHelper::makeCarbon($value, false);
if ($this->mode === 'date' ) {
$backendTimeZone = \Backend\Models\Preference::get('timezone');
$value->setTimezone($backendTimeZone);
$value->setTime(0,0,0);
$value->setTimezone(Config::get('app.timezone'));
}
$value = $value->toDateTimeString();
$value = $value instanceof Carbon ? $value->toDateTimeString() : $value;
}
$this->vars['name'] = $this->getFieldName();

View File

@ -121,6 +121,10 @@ class FileUpload extends FormWidgetBase
*/
protected function prepareVars()
{
if ($this->formField->disabled) {
$this->previewMode = true;
}
if ($this->previewMode) {
$this->useCaption = false;
}
@ -406,7 +410,8 @@ class FileUpload extends FormWidgetBase
$parent = $fileRelation->getParent();
if ($this->attachOnUpload && $parent && $parent->exists) {
$fileRelation->add($file);
} else {
}
else {
$fileRelation->add($file, $this->sessionKey);
}
@ -418,14 +423,14 @@ class FileUpload extends FormWidgetBase
'path' => $file->pathUrl
];
Response::json($result, 200)->send();
$response = Response::make($result, 200);
}
catch (Exception $ex) {
Response::json($ex->getMessage(), 400)->send();
$response = Response::make($ex->getMessage(), 400);
}
exit;
// Override the controller response
$this->controller->setResponse($response);
}
/**

View File

@ -84,8 +84,11 @@ class MediaFinder extends FormWidgetBase
public function prepareVars()
{
$value = $this->getLoadValue();
$isImage = $this->mode === 'image';
$this->vars['value'] = $value;
$this->vars['imageUrl'] = $value ? MediaLibrary::url($value) : '';
$this->vars['imageUrl'] = $isImage && $value ? MediaLibrary::url($value) : '';
$this->vars['imageExists'] = $isImage && $value ? MediaLibrary::instance()->exists($value) : '';
$this->vars['field'] = $this->formField;
$this->vars['prompt'] = str_replace('%s', '<i class="icon-folder"></i>', trans($this->prompt));
$this->vars['mode'] = $this->mode;

View File

@ -0,0 +1,74 @@
<?php namespace Backend\FormWidgets;
use Backend\Classes\FormWidgetBase;
use Backend\Widgets\Form;
/**
* Nested Form
* Renders a nested form bound to a jsonable field of a model.
*
* @package october\backend
* @author Sascha Aeppli
*/
class NestedForm extends FormWidgetBase
{
/**
* @inheritDoc
*/
protected $defaultAlias = 'nestedform';
/**
* @var [] Form configuration
*/
public $form;
/**
* @var bool defines if the nested form is styled like a panel (default true).
*/
public $usePanelStyles = true;
/**
* @var Form form widget reference
*/
protected $formWidget;
/**
* @inheritDoc
*/
public function init() {
$this->fillFromConfig([
'form',
'usePanelStyles',
]);
$config = $this->makeConfig($this->form);
$config->model = $this->model;
$config->data = $this->getLoadValue();
$config->alias = $this->alias . $this->defaultAlias;
$config->arrayName = $this->getFieldName();
$config->isNested = true;
$widget = $this->makeWidget(Form::class, $config);
$widget->bindToController();
$this->formWidget = $widget;
}
protected function loadAssets()
{
$this->addCss('css/nestedform.css', 'core');
}
/**
* @inheritdoc
*/
function render()
{
$this->prepareVars();
return $this->makePartial('nestedform');
}
function prepareVars() {
$this->formWidget->previewMode = $this->previewMode;
}
}

View File

@ -1,5 +1,7 @@
<?php namespace Backend\FormWidgets;
use Lang;
use ApplicationException;
use Backend\Classes\FormWidgetBase;
/**
@ -10,10 +12,18 @@ use Backend\Classes\FormWidgetBase;
* label: User
* type: recordfinder
* list: ~/plugins/rainlab/user/models/user/columns.yaml
* recordsPerPage: 10
* title: Find Record
* prompt: Click the Find button to find a user
* keyFrom: id
* nameFrom: name
* descriptionFrom: email
* conditions: email = "bob@example.com"
* scope: whereActive
* searchMode: all
* searchScope: searchUsers
* useRelation: false
* modelClass: RainLab\User\Models\User
*
* @package october\backend
* @author Alexey Bobkov, Samuel Georges
@ -34,7 +44,7 @@ class RecordFinder extends FormWidgetBase
/**
* @var string Relation column to display for the name
*/
public $nameFrom;
public $nameFrom = 'name';
/**
* @var string Relation column to display for the description
@ -79,6 +89,16 @@ class RecordFinder extends FormWidgetBase
*/
public $searchScope;
/**
* @var boolean Flag for using the name of the field as a relation name to interact with directly on the parent model. Default: true. Disable to return just the selected model's ID
*/
public $useRelation = true;
/**
* @var string Class of the model to use for listing records when useRelation = false
*/
public $modelClass;
//
// Object properties
//
@ -119,8 +139,14 @@ class RecordFinder extends FormWidgetBase
'searchMode',
'searchScope',
'recordsPerPage',
'useRelation',
'modelClass',
]);
if (!$this->useRelation && !class_exists($this->modelClass)) {
throw new ApplicationException(Lang::get('backend::lang.recordfinder.invalid_model_class', ['modelClass' => $this->modelClass]));
}
if (post('recordfinder_flag')) {
$this->listWidget = $this->makeListWidget();
$this->listWidget->bindToController();
@ -151,8 +177,13 @@ class RecordFinder extends FormWidgetBase
public function onRefresh()
{
list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
$model->{$attribute} = post($this->getFieldName());
$value = post($this->getFieldName());
if ($this->useRelation) {
list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
$model->{$attribute} = $value;
} else {
$this->formField->value = $value;
}
$this->prepareVars();
return ['#'.$this->getId('container') => $this->makePartial('recordfinder')];
@ -160,8 +191,12 @@ class RecordFinder extends FormWidgetBase
public function onClearRecord()
{
list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
$model->{$attribute} = null;
if ($this->useRelation) {
list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
$model->{$attribute} = null;
} else {
$this->formField->value = null;
}
$this->prepareVars();
return ['#'.$this->getId('container') => $this->makePartial('recordfinder')];
@ -209,13 +244,18 @@ class RecordFinder extends FormWidgetBase
*/
public function getLoadValue()
{
list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
$value = null;
if ($model !== null) {
return $model->{$attribute};
if ($this->useRelation) {
list($model, $attribute) = $this->resolveModelAttribute($this->valueFrom);
if ($model !== null) {
$value = $model->{$attribute};
}
} else {
$value = $this->modelClass::find(parent::getLoadValue());
}
return null;
return $value;
}
public function getKeyValue()
@ -263,7 +303,13 @@ class RecordFinder extends FormWidgetBase
protected function makeListWidget()
{
$config = $this->makeConfig($this->getConfig('list'));
$config->model = $this->getRelationModel();
if ($this->useRelation) {
$config->model = $this->getRelationModel();
} else {
$config->model = new $this->modelClass;
}
$config->alias = $this->alias . 'List';
$config->showSetup = false;
$config->showCheckboxes = false;
@ -287,9 +333,11 @@ class RecordFinder extends FormWidgetBase
});
}
else {
$widget->bindEvent('list.extendQueryBefore', function ($query) {
$this->getRelationObject()->addDefinedConstraintsToQuery($query);
});
if ($this->useRelation) {
$widget->bindEvent('list.extendQueryBefore', function ($query) {
$this->getRelationObject()->addDefinedConstraintsToQuery($query);
});
}
}
return $widget;

View File

@ -3,6 +3,7 @@
use Lang;
use ApplicationException;
use Backend\Classes\FormWidgetBase;
use October\Rain\Html\Helper as HtmlHelper;
/**
* Repeater Form Widget
@ -108,8 +109,8 @@ class Repeater extends FormWidgetBase
}
$fieldName = $this->formField->getName(false);
$this->indexInputName = self::INDEX_PREFIX.$fieldName;
$this->groupInputName = self::GROUP_PREFIX.$fieldName;
$this->indexInputName = $this->alias.self::INDEX_PREFIX.$fieldName;
$this->groupInputName = $this->alias.self::GROUP_PREFIX.$fieldName;
$this->processGroupMode();
@ -189,6 +190,9 @@ class Repeater extends FormWidgetBase
foreach ($value as $index => &$data) {
$data['_group'] = $this->getGroupCodeFromIndex($index);
}
// Make sure the $data reference is removed from memory so that the next loop won't modify it
// which would cause the last item to receive the group code of the second-last item
unset($data);
}
if ($this->minItems && count($value) < $this->minItems) {
@ -198,6 +202,19 @@ class Repeater extends FormWidgetBase
throw new ApplicationException(Lang::get('backend::lang.repeater.max_items_failed', ['name' => $this->fieldName, 'max' => $this->maxItems, 'items' => count($value)]));
}
/*
* Give repeated form field widgets an opportunity to process the data.
*/
foreach ($value as $index => $data) {
if (isset($this->formWidgets[$index])) {
if ($this->useGroups) {
$value[$index] = array_merge($this->formWidgets[$index]->getSaveData(), ['_group' => $data['_group']]);
} else {
$value[$index] = $this->formWidgets[$index]->getSaveData();
}
}
}
return array_values($value);
}
@ -268,6 +285,9 @@ class Repeater extends FormWidgetBase
$config->alias = $this->alias . 'Form'.$index;
$config->arrayName = $this->getFieldName().'['.$index.']';
$config->isNested = true;
if (self::$onAddItemCalled || $this->minItems > 0) {
$config->enableDefaults = true;
}
$widget = $this->makeWidget('Backend\Widgets\Form', $config);
$widget->bindToController();
@ -349,7 +369,7 @@ class Repeater extends FormWidgetBase
return null;
}
return ['fields' => $fields];
return ['fields' => $fields, 'enableDefaults' => object_get($this->config, 'enableDefaults')];
}
/**

View File

@ -47,6 +47,11 @@ class TagList extends FormWidgetBase
*/
public $useKey = false;
/**
* @var string Placeholder for empty TagList widget
*/
public $placeholder = '';
//
// Object properties
//
@ -68,6 +73,7 @@ class TagList extends FormWidgetBase
'mode',
'nameFrom',
'useKey',
'placeholder'
]);
}
@ -86,6 +92,7 @@ class TagList extends FormWidgetBase
*/
public function prepareVars()
{
$this->vars['placeholder'] = $this->placeholder;
$this->vars['useKey'] = $this->useKey;
$this->vars['field'] = $this->formField;
$this->vars['fieldOptions'] = $this->getFieldOptions();

View File

@ -1,23 +1,27 @@
.field-codeeditor{width:100%;position:relative;border:2px solid #d1d6d9;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
.field-codeeditor textarea{opacity:0;filter:alpha(opacity=0)}
.field-codeeditor.editor-focus{border:2px solid #d1d6d9}
.field-codeeditor.size-tiny{min-height:50px}
.field-codeeditor.size-small{min-height:100px}
.field-codeeditor.size-large{min-height:200px}
.field-codeeditor.size-huge{min-height:250px}
.field-codeeditor.size-giant{min-height:350px}
.field-codeeditor .ace_search{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px;color:#333333;z-index:13}
.field-codeeditor .editor-code{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
.field-codeeditor .editor-toolbar{position:absolute;top:10px;right:25px;z-index:10}
.field-codeeditor .editor-toolbar > ul,.field-codeeditor .editor-toolbar ul > li{list-style-type:none;padding:0;margin:0}
.field-codeeditor .editor-toolbar > ul > li{float:left}
.field-codeeditor .editor-toolbar > ul > li .tooltip.left{margin-right:25px}
.field-codeeditor .editor-toolbar > ul > li > a{display:block;height:25px;width:25px;color:#666;font-size:20px;text-align:center;text-decoration:none}
.field-codeeditor .editor-toolbar > ul > li > a > abbr{position:absolute;font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}
.field-codeeditor .editor-toolbar > ul > li > a > i{opacity:0.7;filter:alpha(opacity=70);display:block}
.field-codeeditor .editor-toolbar > ul > li > a > i:before{font-size:15px}
.field-codeeditor .editor-toolbar > ul > li > a:hover > i,.field-codeeditor .editor-toolbar > ul > li > a:focus > i{opacity:1;filter:alpha(opacity=100)}
.field-codeeditor.editor-fullscreen{z-index:301;position:fixed !important;top:0;left:0;height:100%;border-width:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
.field-codeeditor.editor-fullscreen .editor-code{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
.field-codeeditor.editor-fullscreen .editor-toolbar{z-index:302}
.field-codeeditor.editor-fullscreen .ace_search{z-index:303}
.field-codeeditor {width:100%;position:relative;border:2px solid #d1d6d9;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
.field-codeeditor textarea {opacity:0;filter:alpha(opacity=0)}
.field-codeeditor.editor-focus {border:2px solid #d1d6d9}
.field-codeeditor.size-tiny {min-height:50px}
.field-codeeditor.size-small {min-height:100px}
.field-codeeditor.size-large {min-height:200px}
.field-codeeditor.size-huge {min-height:250px}
.field-codeeditor.size-giant {min-height:350px}
.field-codeeditor .ace_search {font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px;color:#333;z-index:13}
.field-codeeditor .editor-code {-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}
.field-codeeditor .editor-toolbar {position:absolute;top:-30px;right:35px;z-index:10}
.field-codeeditor .editor-toolbar >ul,
.field-codeeditor .editor-toolbar ul >li {list-style-type:none;padding:0;margin:0}
.field-codeeditor .editor-toolbar >ul >li {float:left}
.field-codeeditor .editor-toolbar >ul >li .tooltip.left {margin-right:25px}
.field-codeeditor .editor-toolbar >ul >li >a {display:block;height:25px;width:25px;color:#666;font-size:20px;text-align:center;text-decoration:none}
.field-codeeditor .editor-toolbar >ul >li >a >abbr {position:absolute;font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}
.field-codeeditor .editor-toolbar >ul >li >a >i {opacity:0.7;filter:alpha(opacity=70);display:block}
.field-codeeditor .editor-toolbar >ul >li >a >i:before {font-size:15px}
.field-codeeditor .editor-toolbar >ul >li >a:hover >i,
.field-codeeditor .editor-toolbar >ul >li >a:focus >i {opacity:1;filter:alpha(opacity=100)}
.field-codeeditor.editor-fullscreen {z-index:301;position:fixed !important;top:0;left:0;height:100%;border-width:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
.field-codeeditor.editor-fullscreen .editor-code {-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
.field-codeeditor.editor-fullscreen .editor-toolbar {z-index:302;border-radius:0 0 5px 5px;right:25px;background-color:#ddd;border:1px solid #cbcbcb;border-right-color:#cbcbcb;border-right-style:solid;border-right-width:1px;border-top:0 none;max-width:125px;overflow:hidden;margin:0;padding:4px;position:absolute;top:0;white-space:normal}
.field-codeeditor.editor-fullscreen .editor-toolbar >ul >li >a {color:#666}
.field-codeeditor.editor-fullscreen .ace_search {z-index:303}
.field-codeeditor .secondary-tabs .editor-toolbar >ul >li >a {color:#fff}

View File

@ -4595,7 +4595,7 @@ this.$searchboxDisable.on('click.codeeditor','>a',$.proxy(this.toggleSearchbox,t
this.$replaceboxDisable.hide()
this.$replaceboxEnable.on('click.codeeditor','>a',$.proxy(this.toggleReplacebox,this))
this.$replaceboxDisable.on('click.codeeditor','>a',$.proxy(this.toggleReplacebox,this))
this.$el.hotKey({hotkey:'esc',hotkeyMac:'esc',callback:this.proxy(this.onEscape)})
this.$el.hotKey({hotkey:'esc',callback:this.proxy(this.onEscape)})
editor.commands.addCommand({name:'toggleFullscreen',bindKey:{win:'Ctrl+Shift+F',mac:'Ctrl+Shift+F'},exec:$.proxy(this.toggleFullscreen,this),readOnly:true})}
CodeEditor.prototype.dispose=function(){if(this.$el===null)
return

View File

@ -208,7 +208,6 @@
*/
this.$el.hotKey({
hotkey: 'esc',
hotkeyMac: 'esc',
callback: this.proxy(this.onEscape)
})

View File

@ -1,5 +1,10 @@
@import "../../../../assets/less/core/boot.less";
@color_1: #666;
@color_2: #fff;
@background_color_1: #ddd;
@border_right_color_1: #cbcbcb;
.field-codeeditor {
width: 100%;
position: relative;
@ -28,8 +33,8 @@
.editor-toolbar {
position: absolute;
top: 10px;
right: 25px;
top: -30px;
right: 35px;
z-index: @zindex-form;
> ul, ul > li { list-style-type: none; padding: 0; margin: 0; }
> ul > li {
@ -74,7 +79,44 @@
border-width: 0;
.border-radius(0);
.editor-code { .border-radius(0); }
.editor-toolbar { z-index: @zindex-fullscreen + 2; }
.editor-toolbar {
z-index: @zindex-fullscreen + 2;
border-radius: 0 0 5px 5px;
right: 25px;
background-color: @background_color_1;
border: 1px solid #cbcbcb;
border-right-color: @border_right_color_1;
border-right-style: solid;
border-right-width: 1px;
border-top: 0 none;
max-width: 125px;
overflow: hidden;
margin: 0;
padding: 4px;
position: absolute;
top: 0;
white-space: normal;
>ul {
>li {
>a {
color: @color_1;
}
}
}
}
.ace_search { z-index: @zindex-fullscreen + 3; }
}
.secondary-tabs {
.editor-toolbar {
>ul {
>li {
>a {
color: @color_2;
}
}
}
}
}
}

View File

@ -56,6 +56,7 @@
color: this.$customColor.data('hexColor'),
chooseText: $.oc.lang.get('colorpicker.choose', 'Ok'),
cancelText: '',
appendTo: 'parent',
hide: function(color) {
var hex = color ? color.toHexString() : ''
self.$customColorSpan.css('background', hex)

View File

@ -13,6 +13,7 @@
<?php if ($formatMoment): ?>data-format="<?= $formatMoment ?>"<?php endif ?>
<?php if ($minDate): ?>data-min-date="<?= $minDate ?>"<?php endif ?>
<?php if ($maxDate): ?>data-max-date="<?= $maxDate ?>"<?php endif ?>
data-mode="<?= $mode ?>"
<?php if ($yearRange): ?>data-year-range="<?= $yearRange ?>"<?php endif ?>
<?php if ($firstDay): ?>data-first-day="<?= $firstDay ?>"<?php endif ?>
data-show-week-number="<?= $showWeekNumber ?>"

View File

@ -1,156 +1,157 @@
.field-fileupload .upload-object{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;position:relative;outline:none;overflow:hidden;display:inline-block;vertical-align:top}
.field-fileupload .upload-object img{width:100%;height:100%}
.field-fileupload .upload-object .icon-container{display:table;opacity:.6}
.field-fileupload .upload-object .icon-container i{color:#95a5a6;display:inline-block}
.field-fileupload .upload-object .icon-container div{display:table-cell;text-align:center;vertical-align:middle}
.field-fileupload .upload-object .icon-container.image > div.icon-wrapper{display:none}
.field-fileupload .upload-object h4{font-size:13px;color:#2A3E51;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:150%;margin:15px 0 5px 0;padding-right:0;-webkit-transition:padding 0.1s;transition:padding 0.1s;position:relative}
.field-fileupload .upload-object h4 a{position:absolute;right:0;top:0;display:none;font-weight:400}
.field-fileupload .upload-object p.size{font-size:12px;color:#95a5a6}
.field-fileupload .upload-object p.size strong{font-weight:400}
.field-fileupload .upload-object .meta .drag-handle{position:absolute;bottom:0;right:0;cursor:move;display:block}
.field-fileupload .upload-object .info h4 a,.field-fileupload .upload-object .meta a.upload-remove-button,.field-fileupload .upload-object .meta a.drag-handle{color:#2b3e50;display:none;font-size:13px;text-decoration:none}
.field-fileupload .upload-object .icon-container{position:relative}
.field-fileupload .upload-object .icon-container:after{background-image:url('../../../../../system/assets/ui/images/loader-transparent.svg');position:absolute;content:' ';width:40px;height:40px;left:50%;top:50%;margin-top:-20px;margin-left:-20px;display:block;background-size:40px 40px;background-position:50% 50%;-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}
.field-fileupload .upload-object.is-success .icon-container{opacity:1}
.field-fileupload .upload-object.is-success .icon-container:after{opacity:0;-webkit-transition:opacity 0.3s ease;transition:opacity 0.3s ease}
.field-fileupload .upload-object.is-error .icon-container:after{content:"";background:none;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f071";-webkit-animation:none;animation:none;font-size:40px;color:#ab2a1c;margin-top:-20px;margin-left:-20px;text-shadow:2px 2px 0 #fff}
.field-fileupload .upload-object.is-loading .icon-container{opacity:.6}
.field-fileupload .upload-object.is-loading .icon-container:after{opacity:1;-webkit-transition:opacity 0.3s ease;transition:opacity 0.3s ease}
.field-fileupload .upload-object.is-success{cursor:pointer}
.field-fileupload .upload-object.is-success .progress-bar{opacity:0;-webkit-transition:opacity 0.3s ease;transition:opacity 0.3s ease}
.field-fileupload .upload-object.is-success:hover h4 a,.field-fileupload .upload-object.is-success:hover .meta .upload-remove-button,.field-fileupload .upload-object.is-success:hover .meta .drag-handle{display:block}
.field-fileupload .upload-object.is-error{cursor:pointer}
.field-fileupload .upload-object.is-error .icon-container{opacity:1}
.field-fileupload .upload-object.is-error .icon-container > img,.field-fileupload .upload-object.is-error .icon-container > i{opacity:.5}
.field-fileupload .upload-object.is-error .info h4{color:#ab2a1c}
.field-fileupload .upload-object.is-error .info h4 a{display:none}
.field-fileupload .upload-object.is-error .meta{display:none}
.field-fileupload.is-sortable{position:relative}
.field-fileupload.is-sortable .upload-placeholder{position:relative;border:1px dotted #e0e0e0 !important}
.field-fileupload.is-sortable .upload-object.dragged{position:absolute;opacity:0.5;filter:alpha(opacity=50);z-index:2000}
.field-fileupload.is-sortable .upload-object.dragged .uploader-toolbar{display:none}
.field-fileupload.is-preview .upload-button,.field-fileupload.is-preview .upload-remove-button,.field-fileupload.is-preview .meta a.drag-handle{display:none !important}
@media (max-width:1024px){.field-fileupload .upload-object.is-success h4 a,.field-fileupload .upload-object.is-success .meta .upload-remove-button,.field-fileupload .upload-object.is-success .meta .drag-handle{display:block !important}
}
.fileupload-config-form .fileupload-url-button{padding-left:0}
.fileupload-config-form .fileupload-url-button > i{color:#666}
.fileupload-config-form .file-upload-modal-image-header{background-color:#FEFEFE;background-image:-webkit-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb),-webkit-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb);background-image:-moz-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb),-moz-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb);background-image:-o-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb),-o-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb);background-image:-ms-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb),-ms-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb);background-image:linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb),linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb);-webkit-background-size:20px 20px;-moz-background-size:20px 20px;background-size:20px 20px;background-position:0 0,10px 10px}
.fileupload-config-form .file-upload-modal-image-header,.fileupload-config-form .file-upload-modal-image-header img{border-top-right-radius:2px;border-top-left-radius:2px}
.fileupload-config-form .file-upload-modal-image-header .close{position:absolute;top:20px;right:20px;background:#BDC3C7;opacity:.7;height:24px;width:22px}
.fileupload-config-form .file-upload-modal-image-header .close:hover,.fileupload-config-form .file-upload-modal-image-header .close:focus{opacity:.9}
.fileupload-config-form .file-upload-modal-image-header + .modal-body{padding-top:20px}
.field-fileupload.style-image-multi .upload-button,.field-fileupload.style-image-multi .upload-object{margin:0 10px 10px 0}
.field-fileupload.style-image-multi .upload-button{display:block;border:2px dashed #BDC3C7;background-clip:content-box;background-color:#F9F9F9;position:relative;outline:none;float:left;width:76px;height:76px}
.field-fileupload.style-image-multi .upload-button .upload-button-icon{position:absolute;width:22px;height:22px;top:50%;left:50%;margin-top:-11px;margin-left:-11px}
.field-fileupload.style-image-multi .upload-button .upload-button-icon:before{text-align:center;display:block;font-size:22px;height:22px;width:22px;line-height:22px;color:#BDC3C7}
.field-fileupload.style-image-multi .upload-button .upload-button-icon.large-icon{width:34px;height:34px;top:50%;left:50%;margin-top:-17px;margin-left:-17px}
.field-fileupload.style-image-multi .upload-button .upload-button-icon.large-icon:before{font-size:34px;height:24px;width:24px;line-height:24px}
.field-fileupload.style-image-multi .upload-button:hover{border:2px dashed #1F99DC}
.field-fileupload.style-image-multi .upload-button:hover .upload-button-icon:before{color:#1F99DC}
.field-fileupload.style-image-multi .upload-button:focus{border:2px dashed #1F99DC}
.field-fileupload.style-image-multi .upload-button:focus .upload-button-icon:before{color:#1F99DC}
.field-fileupload.style-image-multi .upload-files-container{margin-left:90px}
.field-fileupload.style-image-multi .upload-object{background:#fff;border:1px solid #ecf0f1;width:260px}
.field-fileupload.style-image-multi .upload-object .progress-bar{display:block;width:100%;overflow:hidden;height:5px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);position:absolute;bottom:10px;left:0}
.field-fileupload.style-image-multi .upload-object .progress-bar .upload-progress{float:left;width:0%;height:100%;line-height:5px;color:#ffffff;background-color:#5fb6f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}
.field-fileupload.style-image-multi .upload-object .icon-container{border-right:1px solid #f6f8f9;float:left;display:inline-block;overflow:hidden;width:75px;height:75px}
.field-fileupload.style-image-multi .upload-object .icon-container i{font-size:35px}
.field-fileupload.style-image-multi .upload-object .icon-container.image img{border-bottom-left-radius:3px;border-top-left-radius:3px;width:auto}
.field-fileupload.style-image-multi .upload-object .info{margin-left:90px}
.field-fileupload.style-image-multi .upload-object .info h4{padding-right:15px}
.field-fileupload.style-image-multi .upload-object .info h4 a{right:15px}
.field-fileupload.style-image-multi .upload-object .meta{position:absolute;bottom:0;left:0;right:0;margin:0 15px 0 90px}
.field-fileupload.style-image-multi .upload-object .meta a.drag-handle{bottom:15px}
.field-fileupload.style-image-multi .upload-object.upload-placeholder{height:75px;background-color:transparent}
.field-fileupload.style-image-multi .upload-object.upload-placeholder:after{opacity:0}
.field-fileupload.style-image-multi .upload-object:hover{background:#4da7e8 !important}
.field-fileupload.style-image-multi .upload-object:hover i,.field-fileupload.style-image-multi .upload-object:hover p.size{color:#ecf0f1}
.field-fileupload.style-image-multi .upload-object:hover h4{color:white}
.field-fileupload.style-image-multi .upload-object:hover .icon-container{border-right-color:#4da7e8 !important}
.field-fileupload.style-image-multi .upload-object:hover h4{padding-right:35px}
.field-fileupload.style-image-multi.is-preview .upload-files-container{margin-left:0}
.form-sidebar .field-fileupload.style-image-multi .upload-files-container{margin-left:0px}
.form-sidebar .field-fileupload.style-image-multi .upload-button{width:100%}
@media (max-width:1280px){.field-fileupload.style-image-multi .upload-object{width:230px}
}
@media (max-width:1024px){.field-fileupload.style-image-multi .upload-button{width:100%}
.field-fileupload.style-image-multi .upload-files-container{margin-left:0}
.field-fileupload.style-image-multi .upload-object{margin-right:0;display:block;width:auto}
}
.field-fileupload.style-image-single.is-populated .upload-button{display:none}
.field-fileupload.style-image-single .upload-button{display:block;border:2px dashed #BDC3C7;background-clip:content-box;background-color:#F9F9F9;position:relative;outline:none;min-height:100px;min-width:100px}
.field-fileupload.style-image-single .upload-button .upload-button-icon{position:absolute;width:22px;height:22px;top:50%;left:50%;margin-top:-11px;margin-left:-11px}
.field-fileupload.style-image-single .upload-button .upload-button-icon:before{text-align:center;display:block;font-size:22px;height:22px;width:22px;line-height:22px;color:#BDC3C7}
.field-fileupload.style-image-single .upload-button .upload-button-icon.large-icon{width:34px;height:34px;top:50%;left:50%;margin-top:-17px;margin-left:-17px}
.field-fileupload.style-image-single .upload-button .upload-button-icon.large-icon:before{font-size:34px;height:24px;width:24px;line-height:24px}
.field-fileupload.style-image-single .upload-button:hover{border:2px dashed #1F99DC}
.field-fileupload.style-image-single .upload-button:hover .upload-button-icon:before{color:#1F99DC}
.field-fileupload.style-image-single .upload-button:focus{border:2px dashed #1F99DC}
.field-fileupload.style-image-single .upload-button:focus .upload-button-icon:before{color:#1F99DC}
.field-fileupload.style-image-single .upload-object{padding-bottom:66px}
.field-fileupload.style-image-single .upload-object .icon-container{border:1px solid #f6f8f9;background:rgba(255,255,255,0.5)}
.field-fileupload.style-image-single .upload-object .icon-container.image img{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;display:block;max-width:100%;height:auto;min-height:100px;min-width:100px}
.field-fileupload.style-image-single .upload-object .progress-bar{display:block;width:100%;overflow:hidden;height:5px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);position:absolute;bottom:10px;left:0}
.field-fileupload.style-image-single .upload-object .progress-bar .upload-progress{float:left;width:0%;height:100%;line-height:5px;color:#ffffff;background-color:#5fb6f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}
.field-fileupload.style-image-single .upload-object .info{position:absolute;left:0;right:0;bottom:0;height:66px}
.field-fileupload.style-image-single .upload-object .meta{position:absolute;bottom:65px;left:0;right:0;margin:0 15px}
.field-fileupload.style-image-single .upload-object:hover h4{padding-right:20px}
@media (max-width:1024px){.field-fileupload.style-image-single .upload-object h4{padding-right:20px !important}
}
.field-fileupload.style-file-multi .upload-button{margin-bottom:10px}
.field-fileupload.style-file-multi .upload-files-container{border:1px solid #eeeeee;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;border-bottom:none;display:none}
.field-fileupload.style-file-multi.is-populated .upload-files-container{display:block}
.field-fileupload.style-file-multi .upload-object{display:block;width:100%;border-bottom:1px solid #eeeeee;padding-left:10px}
.field-fileupload.style-file-multi .upload-object:nth-child(even){background-color:#f5f5f5}
.field-fileupload.style-file-multi .upload-object .icon-container{position:absolute;top:0;left:10px;width:15px;padding:11px 7px}
.field-fileupload.style-file-multi .upload-object .icon-container i{line-height:150%;font-size:15px}
.field-fileupload.style-file-multi .upload-object .icon-container img{display:none}
.field-fileupload.style-file-multi .upload-object .info{margin-left:35px;margin-right:15%}
.field-fileupload.style-file-multi .upload-object .info h4,.field-fileupload.style-file-multi .upload-object .info p{margin:0;padding:11px 0;font-size:12px;font-weight:normal;line-height:150%;color:#666666}
.field-fileupload.style-file-multi .upload-object .info h4{padding-right:15px}
.field-fileupload.style-file-multi .upload-object .info h4 a{padding:10px 0;right:15px}
.field-fileupload.style-file-multi .upload-object .info p.size{position:absolute;top:0;right:0;width:15%;display:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.field-fileupload.style-file-multi .upload-object .progress-bar{display:block;width:100%;overflow:hidden;height:5px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);position:absolute;top:18px;left:0}
.field-fileupload.style-file-multi .upload-object .progress-bar .upload-progress{float:left;width:0%;height:100%;line-height:5px;color:#ffffff;background-color:#5fb6f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}
.field-fileupload.style-file-multi .upload-object .meta{position:absolute;top:0;right:0;margin-right:15px;width:15%}
.field-fileupload.style-file-multi .upload-object .meta a.drag-handle{top:-2px;bottom:auto;line-height:150%;padding:10px 0}
.field-fileupload.style-file-multi .upload-object .icon-container:after{width:20px;height:20px;margin-top:-10px;margin-left:-10px;background-size:20px 20px}
.field-fileupload.style-file-multi .upload-object.is-error .icon-container:after{font-size:20px}
.field-fileupload.style-file-multi .upload-object.is-success .info p.size{display:block}
.field-fileupload.style-file-multi .upload-object.upload-placeholder{height:35px;background-color:transparent}
.field-fileupload.style-file-multi .upload-object.upload-placeholder:after{opacity:0}
.field-fileupload.style-file-multi .upload-object:hover{background:#4da7e8 !important}
.field-fileupload.style-file-multi .upload-object:hover i,.field-fileupload.style-file-multi .upload-object:hover p.size{color:#ecf0f1}
.field-fileupload.style-file-multi .upload-object:hover h4{color:white}
.field-fileupload.style-file-multi .upload-object:hover .icon-container{border-right-color:#4da7e8 !important}
.field-fileupload.style-file-multi .upload-object:hover h4{padding-right:35px}
@media (max-width:1199px){.field-fileupload.style-file-multi .info{margin-right:20% !important}
.field-fileupload.style-file-multi .info p.size{width:20% !important}
.field-fileupload.style-file-multi .meta{width:20% !important}
}
@media (max-width:991px){.field-fileupload.style-file-multi .upload-object h4{padding-right:35px !important}
.field-fileupload.style-file-multi .info{margin-right:25% !important}
.field-fileupload.style-file-multi .info p.size{width:25% !important;padding-right:35px !important}
.field-fileupload.style-file-multi .meta{width:25% !important}
}
.field-fileupload.style-file-single{background-color:#ffffff;border:1px solid #d1d6d9;overflow:hidden;position:relative;padding-right:30px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 rgba(209,214,217,0.25),0 1px 0 rgba(255,255,255,.5);box-shadow:inset 0 1px 0 rgba(209,214,217,0.25),0 1px 0 rgba(255,255,255,.5)}
.field-fileupload.style-file-single .upload-button{position:absolute;top:50%;margin-top:-44px;height:88px;background:transparent;right:-2px;color:#595959}
.field-fileupload.style-file-single .upload-button i{font-size:14px}
.field-fileupload.style-file-single .upload-button:hover{color:#333333}
.field-fileupload.style-file-single .upload-empty-message{padding:8px 0 8px 11px;font-size:14px}
.field-fileupload.style-file-single.is-populated .upload-empty-message{display:none}
.field-fileupload.style-file-single .upload-object{display:block;width:100%;padding:7px 0 9px 0}
.field-fileupload.style-file-single .upload-object .icon-container{position:absolute;top:0;left:0;width:15px;padding:0 5px;margin:8px 0 0 7px;text-align:center}
.field-fileupload.style-file-single .upload-object .icon-container i{line-height:150%;font-size:15px}
.field-fileupload.style-file-single .upload-object .icon-container img{display:none}
.field-fileupload.style-file-single .upload-object .info{margin-left:34px;margin-right:15%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.field-fileupload.style-file-single .upload-object .info h4,.field-fileupload.style-file-single .upload-object .info p{display:inline;margin:0;padding:0;font-size:13px;line-height:150%;color:#666666}
.field-fileupload.style-file-single .upload-object .info p.size{font-weight:normal}
.field-fileupload.style-file-single .upload-object .info p.size:before{content:" - "}
.field-fileupload.style-file-single .upload-object .progress-bar{display:block;width:100%;overflow:hidden;height:5px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);position:absolute;top:50%;margin-top:-2px;right:5px}
.field-fileupload.style-file-single .upload-object .progress-bar .upload-progress{float:left;width:0%;height:100%;line-height:5px;color:#ffffff;background-color:#5fb6f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}
.field-fileupload.style-file-single .upload-object .meta{position:absolute;top:50%;margin-top:-44px;height:88px;right:0;width:15%}
.field-fileupload.style-file-single .upload-object .meta .upload-remove-button{position:absolute;top:50%;right:0;height:20px;margin-top:-10px;margin-right:10px;z-index:100}
.field-fileupload.style-file-single .upload-object .icon-container:after{width:20px;height:20px;margin-top:-10px;margin-left:-10px;background-size:20px 20px}
.field-fileupload.style-file-single .upload-object.is-error .icon-container:after{font-size:20px}
.field-fileupload .upload-object {-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;position:relative;outline:none;overflow:hidden;display:inline-block;vertical-align:top}
.field-fileupload .upload-object img {width:100%;height:100%}
.field-fileupload .upload-object .icon-container {display:table;opacity:.6}
.field-fileupload .upload-object .icon-container i {color:#95a5a6;display:inline-block}
.field-fileupload .upload-object .icon-container div {display:table-cell;text-align:center;vertical-align:middle}
.field-fileupload .upload-object .icon-container.image >div.icon-wrapper {display:none}
.field-fileupload .upload-object h4 {font-size:13px;color:#2A3E51;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:150%;margin:15px 0 5px 0;padding-right:0;-webkit-transition:padding 0.1s;transition:padding 0.1s;position:relative}
.field-fileupload .upload-object h4 a {position:absolute;right:0;top:0;display:none;font-weight:400}
.field-fileupload .upload-object p.size {font-size:12px;color:#95a5a6}
.field-fileupload .upload-object p.size strong {font-weight:400}
.field-fileupload .upload-object .meta .drag-handle {position:absolute;bottom:0;right:0;cursor:move;display:block}
.field-fileupload .upload-object .info h4 a,
.field-fileupload .upload-object .meta a.upload-remove-button,
.field-fileupload .upload-object .meta a.drag-handle {color:#2b3e50;display:none;font-size:13px;text-decoration:none}
.field-fileupload .upload-object .icon-container {position:relative}
.field-fileupload .upload-object .icon-container:after {background-image:url('../../../../../system/assets/ui/images/loader-transparent.svg');position:absolute;content:' ';width:40px;height:40px;left:50%;top:50%;margin-top:-20px;margin-left:-20px;display:block;background-size:40px 40px;background-position:50% 50%;-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}
.field-fileupload .upload-object.is-success .icon-container {opacity:1}
.field-fileupload .upload-object.is-success .icon-container:after {opacity:0;-webkit-transition:opacity 0.3s ease;transition:opacity 0.3s ease}
.field-fileupload .upload-object.is-error .icon-container:after {content:"";background:none;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f071";-webkit-animation:none;animation:none;font-size:40px;color:#ab2a1c;margin-top:-20px;margin-left:-20px;text-shadow:2px 2px 0 #fff}
.field-fileupload .upload-object.is-loading .icon-container {opacity:.6}
.field-fileupload .upload-object.is-loading .icon-container:after {opacity:1;-webkit-transition:opacity 0.3s ease;transition:opacity 0.3s ease}
.field-fileupload .upload-object.is-success {cursor:pointer}
.field-fileupload .upload-object.is-success .progress-bar {opacity:0;-webkit-transition:opacity 0.3s ease;transition:opacity 0.3s ease}
.field-fileupload .upload-object.is-success:hover h4 a,
.field-fileupload .upload-object.is-success:hover .meta .upload-remove-button,
.field-fileupload .upload-object.is-success:hover .meta .drag-handle {display:block}
.field-fileupload .upload-object.is-error {cursor:pointer}
.field-fileupload .upload-object.is-error .icon-container {opacity:1}
.field-fileupload .upload-object.is-error .icon-container >img,
.field-fileupload .upload-object.is-error .icon-container >i {opacity:.5}
.field-fileupload .upload-object.is-error .info h4 {color:#ab2a1c}
.field-fileupload .upload-object.is-error .info h4 a {display:none}
.field-fileupload .upload-object.is-error .meta {display:none}
.field-fileupload.is-sortable {position:relative}
.field-fileupload.is-sortable .upload-placeholder {position:relative;border:1px dotted #e0e0e0 !important}
.field-fileupload.is-sortable .upload-object.dragged {position:absolute;opacity:0.5;filter:alpha(opacity=50);z-index:2000}
.field-fileupload.is-sortable .upload-object.dragged .uploader-toolbar {display:none}
.field-fileupload.is-preview .upload-button,
.field-fileupload.is-preview .upload-remove-button,
.field-fileupload.is-preview .meta a.drag-handle {display:none !important}
@media (max-width:1024px) {.field-fileupload .upload-object.is-success h4 a,.field-fileupload .upload-object.is-success .meta .upload-remove-button,.field-fileupload .upload-object.is-success .meta .drag-handle {display:block !important }}
.fileupload-config-form .fileupload-url-button {padding-left:0}
.fileupload-config-form .fileupload-url-button >i {color:#666}
.fileupload-config-form .file-upload-modal-image-header {background-color:#FEFEFE;background-image:-webkit-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb),-webkit-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb);background-image:-moz-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb),-moz-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb);background-image:-o-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb),-o-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb);background-image:-ms-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb),-ms-linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb);background-image:linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb),linear-gradient(45deg,#cbcbcb 25%,transparent 25%,transparent 75%,#cbcbcb 75%,#cbcbcb);-webkit-background-size:20px 20px;-moz-background-size:20px 20px;background-size:20px 20px;background-position:0 0,10px 10px}
.fileupload-config-form .file-upload-modal-image-header,
.fileupload-config-form .file-upload-modal-image-header img {border-top-right-radius:2px;border-top-left-radius:2px}
.fileupload-config-form .file-upload-modal-image-header .close {position:absolute;top:20px;right:20px;background:#BDC3C7;opacity:.7;height:24px;width:22px}
.fileupload-config-form .file-upload-modal-image-header .close:hover,
.fileupload-config-form .file-upload-modal-image-header .close:focus {opacity:.9}
.fileupload-config-form .file-upload-modal-image-header + .modal-body {padding-top:20px}
.field-fileupload.style-image-multi .upload-button,
.field-fileupload.style-image-multi .upload-object {margin:0 10px 10px 0}
.field-fileupload.style-image-multi .upload-button {display:block;border:2px dashed #BDC3C7;background-clip:content-box;background-color:#F9F9F9;position:relative;outline:none;float:left;width:76px;height:76px}
.field-fileupload.style-image-multi .upload-button .upload-button-icon {position:absolute;width:22px;height:22px;top:50%;left:50%;margin-top:-11px;margin-left:-11px}
.field-fileupload.style-image-multi .upload-button .upload-button-icon:before {text-align:center;display:block;font-size:22px;height:22px;width:22px;line-height:22px;color:#BDC3C7}
.field-fileupload.style-image-multi .upload-button .upload-button-icon.large-icon {width:34px;height:34px;top:50%;left:50%;margin-top:-17px;margin-left:-17px}
.field-fileupload.style-image-multi .upload-button .upload-button-icon.large-icon:before {font-size:34px;height:24px;width:24px;line-height:24px}
.field-fileupload.style-image-multi .upload-button:hover {border:2px dashed #1F99DC}
.field-fileupload.style-image-multi .upload-button:hover .upload-button-icon:before {color:#1F99DC}
.field-fileupload.style-image-multi .upload-button:focus {border:2px dashed #1F99DC}
.field-fileupload.style-image-multi .upload-button:focus .upload-button-icon:before {color:#1F99DC}
.field-fileupload.style-image-multi .upload-files-container {margin-left:90px}
.field-fileupload.style-image-multi .upload-object {background:#fff;border:1px solid #ecf0f1;width:260px}
.field-fileupload.style-image-multi .upload-object .progress-bar {display:block;width:100%;overflow:hidden;height:5px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);position:absolute;bottom:10px;left:0}
.field-fileupload.style-image-multi .upload-object .progress-bar .upload-progress {float:left;width:0%;height:100%;line-height:5px;color:#fff;background-color:#5fb6f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}
.field-fileupload.style-image-multi .upload-object .icon-container {border-right:1px solid #f6f8f9;float:left;display:inline-block;overflow:hidden;width:75px;height:75px}
.field-fileupload.style-image-multi .upload-object .icon-container i {font-size:35px}
.field-fileupload.style-image-multi .upload-object .icon-container.image img {border-bottom-left-radius:3px;border-top-left-radius:3px;width:auto}
.field-fileupload.style-image-multi .upload-object .info {margin-left:90px}
.field-fileupload.style-image-multi .upload-object .info h4 {padding-right:15px}
.field-fileupload.style-image-multi .upload-object .info h4 a {right:15px}
.field-fileupload.style-image-multi .upload-object .meta {position:absolute;bottom:0;left:0;right:0;margin:0 15px 0 90px}
.field-fileupload.style-image-multi .upload-object .meta a.drag-handle {bottom:15px}
.field-fileupload.style-image-multi .upload-object.upload-placeholder {height:75px;background-color:transparent}
.field-fileupload.style-image-multi .upload-object.upload-placeholder:after {opacity:0}
.field-fileupload.style-image-multi .upload-object:hover {background:#4da7e8 !important}
.field-fileupload.style-image-multi .upload-object:hover i,
.field-fileupload.style-image-multi .upload-object:hover p.size {color:#ecf0f1}
.field-fileupload.style-image-multi .upload-object:hover h4 {color:white}
.field-fileupload.style-image-multi .upload-object:hover .icon-container {border-right-color:#4da7e8 !important}
.field-fileupload.style-image-multi .upload-object:hover h4 {padding-right:35px}
.field-fileupload.style-image-multi.is-preview .upload-files-container {margin-left:0}
.form-sidebar .field-fileupload.style-image-multi .upload-files-container {margin-left:0}
.form-sidebar .field-fileupload.style-image-multi .upload-button {width:100%}
@media (max-width:1280px) {.field-fileupload.style-image-multi .upload-object {width:230px }}
@media (max-width:1024px) {.field-fileupload.style-image-multi .upload-button {width:100% }.field-fileupload.style-image-multi .upload-files-container {margin-left:0 }.field-fileupload.style-image-multi .upload-object {margin-right:0;display:block;width:auto }}
.field-fileupload.style-image-single.is-populated .upload-button {display:none}
.field-fileupload.style-image-single .upload-button {display:block;border:2px dashed #BDC3C7;background-clip:content-box;background-color:#F9F9F9;position:relative;outline:none;min-height:100px;min-width:100px}
.field-fileupload.style-image-single .upload-button .upload-button-icon {position:absolute;width:22px;height:22px;top:50%;left:50%;margin-top:-11px;margin-left:-11px}
.field-fileupload.style-image-single .upload-button .upload-button-icon:before {text-align:center;display:block;font-size:22px;height:22px;width:22px;line-height:22px;color:#BDC3C7}
.field-fileupload.style-image-single .upload-button .upload-button-icon.large-icon {width:34px;height:34px;top:50%;left:50%;margin-top:-17px;margin-left:-17px}
.field-fileupload.style-image-single .upload-button .upload-button-icon.large-icon:before {font-size:34px;height:24px;width:24px;line-height:24px}
.field-fileupload.style-image-single .upload-button:hover {border:2px dashed #1F99DC}
.field-fileupload.style-image-single .upload-button:hover .upload-button-icon:before {color:#1F99DC}
.field-fileupload.style-image-single .upload-button:focus {border:2px dashed #1F99DC}
.field-fileupload.style-image-single .upload-button:focus .upload-button-icon:before {color:#1F99DC}
.field-fileupload.style-image-single .upload-object {padding-bottom:66px}
.field-fileupload.style-image-single .upload-object .icon-container {border:1px solid #f6f8f9;background:rgba(255,255,255,0.5)}
.field-fileupload.style-image-single .upload-object .icon-container.image img {-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;display:block;max-width:100%;height:auto;min-height:100px;min-width:100px}
.field-fileupload.style-image-single .upload-object .progress-bar {display:block;width:100%;overflow:hidden;height:5px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);position:absolute;bottom:10px;left:0}
.field-fileupload.style-image-single .upload-object .progress-bar .upload-progress {float:left;width:0%;height:100%;line-height:5px;color:#fff;background-color:#5fb6f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}
.field-fileupload.style-image-single .upload-object .info {position:absolute;left:0;right:0;bottom:0;height:66px}
.field-fileupload.style-image-single .upload-object .meta {position:absolute;bottom:65px;left:0;right:0;margin:0 15px}
.field-fileupload.style-image-single .upload-object:hover h4 {padding-right:20px}
@media (max-width:1024px) {.field-fileupload.style-image-single .upload-object h4 {padding-right:20px !important }}
.field-fileupload.style-file-multi .upload-button {margin-bottom:10px}
.field-fileupload.style-file-multi .upload-files-container {border:1px solid #eee;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;border-bottom:none;display:none}
.field-fileupload.style-file-multi.is-populated .upload-files-container {display:block}
.field-fileupload.style-file-multi .upload-object {display:block;width:100%;border-bottom:1px solid #eee;padding-left:10px}
.field-fileupload.style-file-multi .upload-object:nth-child(even) {background-color:#f5f5f5}
.field-fileupload.style-file-multi .upload-object .icon-container {position:absolute;top:0;left:10px;width:15px;padding:11px 7px}
.field-fileupload.style-file-multi .upload-object .icon-container i {line-height:150%;font-size:15px}
.field-fileupload.style-file-multi .upload-object .icon-container img {display:none}
.field-fileupload.style-file-multi .upload-object .info {margin-left:35px;margin-right:15%}
.field-fileupload.style-file-multi .upload-object .info h4,
.field-fileupload.style-file-multi .upload-object .info p {margin:0;padding:11px 0;font-size:12px;font-weight:normal;line-height:150%;color:#666}
.field-fileupload.style-file-multi .upload-object .info h4 {padding-right:15px}
.field-fileupload.style-file-multi .upload-object .info h4 a {padding:10px 0;right:15px}
.field-fileupload.style-file-multi .upload-object .info p.size {position:absolute;top:0;right:0;width:15%;display:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.field-fileupload.style-file-multi .upload-object .progress-bar {display:block;width:100%;overflow:hidden;height:5px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);position:absolute;top:18px;left:0}
.field-fileupload.style-file-multi .upload-object .progress-bar .upload-progress {float:left;width:0%;height:100%;line-height:5px;color:#fff;background-color:#5fb6f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}
.field-fileupload.style-file-multi .upload-object .meta {position:absolute;top:0;right:0;margin-right:15px;width:15%}
.field-fileupload.style-file-multi .upload-object .meta a.drag-handle {top:-2px;bottom:auto;line-height:150%;padding:10px 0}
.field-fileupload.style-file-multi .upload-object .icon-container:after {width:20px;height:20px;margin-top:-10px;margin-left:-10px;background-size:20px 20px}
.field-fileupload.style-file-multi .upload-object.is-error .icon-container:after {font-size:20px}
.field-fileupload.style-file-multi .upload-object.is-success .info p.size {display:block}
.field-fileupload.style-file-multi .upload-object.upload-placeholder {height:35px;background-color:transparent}
.field-fileupload.style-file-multi .upload-object.upload-placeholder:after {opacity:0}
.field-fileupload.style-file-multi .upload-object:hover {background:#4da7e8 !important}
.field-fileupload.style-file-multi .upload-object:hover i,
.field-fileupload.style-file-multi .upload-object:hover p.size {color:#ecf0f1}
.field-fileupload.style-file-multi .upload-object:hover h4 {color:white}
.field-fileupload.style-file-multi .upload-object:hover .icon-container {border-right-color:#4da7e8 !important}
.field-fileupload.style-file-multi .upload-object:hover h4 {padding-right:35px}
@media (max-width:1199px) {.field-fileupload.style-file-multi .info {margin-right:20% !important }.field-fileupload.style-file-multi .info p.size {width:20% !important }.field-fileupload.style-file-multi .meta {width:20% !important }}
@media (max-width:991px) {.field-fileupload.style-file-multi .upload-object h4 {padding-right:35px !important }.field-fileupload.style-file-multi .info {margin-right:25% !important }.field-fileupload.style-file-multi .info p.size {width:25% !important;padding-right:35px !important }.field-fileupload.style-file-multi .meta {width:25% !important }}
.field-fileupload.style-file-single {background-color:#fff;border:1px solid #d1d6d9;overflow:hidden;position:relative;padding-right:30px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 rgba(209,214,217,0.25),0 1px 0 rgba(255,255,255,.5);box-shadow:inset 0 1px 0 rgba(209,214,217,0.25),0 1px 0 rgba(255,255,255,.5)}
.field-fileupload.style-file-single .upload-button {position:absolute;top:50%;margin-top:-44px;height:88px;background:transparent;right:-2px;color:#595959}
.field-fileupload.style-file-single .upload-button i {font-size:14px}
.field-fileupload.style-file-single .upload-button:hover {color:#333}
.field-fileupload.style-file-single .upload-empty-message {padding:8px 0 8px 11px;font-size:14px}
.field-fileupload.style-file-single.is-populated .upload-empty-message {display:none}
.field-fileupload.style-file-single .upload-object {display:block;width:100%;padding:7px 0 9px 0}
.field-fileupload.style-file-single .upload-object .icon-container {position:absolute;top:0;left:0;width:15px;padding:0 5px;margin:8px 0 0 7px;text-align:center}
.field-fileupload.style-file-single .upload-object .icon-container i {line-height:150%;font-size:15px}
.field-fileupload.style-file-single .upload-object .icon-container img {display:none}
.field-fileupload.style-file-single .upload-object .info {margin-left:34px;margin-right:15%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.field-fileupload.style-file-single .upload-object .info h4,
.field-fileupload.style-file-single .upload-object .info p {display:inline;margin:0;padding:0;font-size:13px;line-height:150%;color:#666}
.field-fileupload.style-file-single .upload-object .info p.size {font-weight:normal}
.field-fileupload.style-file-single .upload-object .info p.size:before {content:" - "}
.field-fileupload.style-file-single .upload-object .progress-bar {display:block;width:100%;overflow:hidden;height:5px;background-color:#f5f5f5;border-radius:3px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);position:absolute;top:50%;margin-top:-2px;right:5px}
.field-fileupload.style-file-single .upload-object .progress-bar .upload-progress {float:left;width:0%;height:100%;line-height:5px;color:#fff;background-color:#5fb6f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}
.field-fileupload.style-file-single .upload-object .meta {position:absolute;top:50%;margin-top:-44px;height:88px;right:0;width:15%}
.field-fileupload.style-file-single .upload-object .meta .upload-remove-button {position:absolute;top:50%;right:0;height:20px;margin-top:-10px;margin-right:10px;z-index:100}
.field-fileupload.style-file-single .upload-object .icon-container:after {width:20px;height:20px;margin-top:-10px;margin-left:-10px;background-size:20px 20px}
.field-fileupload.style-file-single .upload-object.is-error .icon-container:after {font-size:20px}

View File

@ -176,7 +176,11 @@
}
FileUpload.prototype.onUploadAddedFile = function(file) {
var $object = $(file.previewElement).data('dzFileObject', file)
var $object = $(file.previewElement).data('dzFileObject', file),
filesize = this.getFilesize(file)
// Change filesize format to match October\Rain\Filesystem\Filesystem::sizeToString() format
$(file.previewElement).find('[data-dz-size]').html('<strong>' + filesize.size + '</strong> ' + filesize.units)
// Remove any exisiting objects for single variety
if (!this.options.isMulti) {
@ -386,6 +390,42 @@
}
}
/*
* Replicates the formatting of October\Rain\Filesystem\Filesystem::sizeToString(). This method will return
* an object with the file size amount and the unit used as `size` and `units` respectively.
*/
FileUpload.prototype.getFilesize = function (file) {
var formatter = new Intl.NumberFormat('en', {
style: 'decimal',
minimumFractionDigits: 2,
maximumFractionDigits: 2
}),
size = 0,
units = 'bytes'
if (file.size >= 1073741824) {
size = formatter.format(file.size / 1073741824)
units = 'GB'
} else if (file.size >= 1048576) {
size = formatter.format(file.size / 1048576)
units = 'MB'
} else if (file.size >= 1024) {
size = formatter.format(file.size / 1024)
units = 'KB'
} else if (file.size > 1) {
size = file.size
units = 'bytes'
} else if (file.size == 1) {
size = 1
units = 'byte'
}
return {
size: size,
units: units
}
}
FileUpload.DEFAULTS = {
url: window.location,
configHandler: null,

View File

@ -1,5 +1,5 @@
<?php if ($this->previewMode): ?>
<div class="form-control"><?= e($value) ?></div>
<div class="form-control"><?= Markdown::parse(e($value)) ?></div>
<?php else: ?>
<div
id="<?= $this->getId() ?>"

View File

@ -78,8 +78,15 @@
BaseProto.dispose.call(this)
}
MediaFinder.prototype.setValue = function(value) {
// set value and trigger change event, so that wrapping implementations
// like mlmediafinder can listen for changes.
this.$findValue.val(value).trigger('change')
}
MediaFinder.prototype.onClickRemoveButton = function() {
this.$findValue.val('')
this.setValue('')
this.evalIsPopulated()
}
@ -106,7 +113,7 @@
publicUrl = items[i].publicUrl
}
self.$findValue.val(path)
self.setValue(path)
if (self.options.isImage) {
$('[data-find-image]', self.$el).attr('src', publicUrl)

View File

@ -13,9 +13,13 @@
<!-- Existing value -->
<div class="find-object">
<div class="icon-container">
<img data-find-image src="<?= $imageUrl ?>" alt="" />
</div>
<?php if ($imageExists): ?>
<div class="icon-container">
<img data-find-image src="<?= $imageUrl ?>" alt="" />
</div>
<?php else: ?>
<p class="help-block"><?= e(trans('backend::lang.mediafinder.no_image')) ?></p>
<?php endif ?>
<div class="info">
<h4 class="filename">
<span data-find-file-name><?= ltrim($value, '/') ?></span>

View File

@ -0,0 +1,6 @@
.nested-form {position:relative;min-height:30px}
.nested-form .control-tabs.primary-tabs .nav-tabs {margin:0 !important}
.nested-form.panel-styles {margin-top:5px;padding:1em 1.25em 0 1.25em !important;background:#f5f5f5;border:1px solid #d1d6d9;border-radius:3px;box-shadow:inset 0 1px 0 rgba(209,214,217,0.25),0 1px 0 rgba(255,255,255,.5)}
.nested-form.panel-styles .control-tabs.primary-tabs .nav-tabs >li.active >a:before {background-color:#f5f5f5;border-color:#f5f5f5}
.nested-form.panel-styles .control-tabs.primary-tabs .nav-tabs >li >a >span.title:before,
.nested-form.panel-styles .control-tabs.primary-tabs .nav-tabs >li >a >span.title:after {background-color:#f5f5f5}

View File

@ -0,0 +1,39 @@
@import "../../../../assets/less/core/boot.less";
@panel-bg-grey: #f5f5f5;
.nested-form {
position: relative;
min-height: 30px;
.control-tabs.primary-tabs {
.nav-tabs {
margin: 0 !important;
}
}
&.panel-styles {
margin-top: 5px;
padding: 1em 1.25em 0 1.25em !important;
background: @panel-bg-grey;
border: 1px solid @input-border;
border-radius: @border-radius-base;
box-shadow: @input-box-shadow;
.control-tabs.primary-tabs {
.nav-tabs {
> li.active > a:before {
background-color: @panel-bg-grey;
border-color: @panel-bg-grey;
}
> li > a > span.title {
&:before, &:after {
background-color: @panel-bg-grey;
}
}
}
}
}
}

View File

@ -0,0 +1,3 @@
<div class="nested-form <?= $this->usePanelStyles ? 'panel-styles' : '' ?>">
<?= $this->formWidget->render() ?>
</div>

View File

@ -1,6 +1,6 @@
<?php if ($this->previewMode && !$value): ?>
<span class="form-control"><?= e(trans('backend::lang.form.preview_no_record_message')) ?></span>
<span class="form-control" disabled="disabled"><?= e(trans('backend::lang.form.preview_no_record_message')) ?></span>
<?php else: ?>
@ -8,4 +8,4 @@
<?= $this->makePartial('recordfinder') ?>
</div>
<?php endif ?>
<?php endif ?>

View File

@ -1,10 +1,16 @@
<?php
$previewMode = false;
if ($this->previewMode || $field->readOnly) {
$previewMode = true;
}
?>
<div
id="<?= $this->getId() ?>"
class="field-recordfinder loading-indicator-container size-input-text"
data-control="recordfinder"
data-refresh-handler="<?= $this->getEventHandler('onRefresh') ?>"
data-data-locker="#<?= $field->getId() ?>">
<span class="form-control">
<span class="form-control" <?= $previewMode ? 'disabled="disabled"' : '' ?>>
<?php if ($value): ?>
<span class="primary"><?= e($nameValue) ?: 'Undefined' ?></span>
<?php if ($descriptionValue): ?>
@ -15,7 +21,7 @@
<?php endif ?>
</span>
<?php if (!$this->previewMode): ?>
<?php if (!$previewMode): ?>
<?php if ($value): ?>
<button
type="button"

View File

@ -1,38 +1,54 @@
.field-repeater{padding-top:5px}
.field-repeater .field-repeater-items{counter-reset:repeater-index-counter}
.field-repeater ul.field-repeater-items,.field-repeater li.field-repeater-item{padding:0;margin:0;list-style:none}
.field-repeater ul.field-repeater-items > li.dragged{opacity:.7;position:absolute;padding-top:15px;padding-right:15px;z-index:2000;background-color:#f9f9f9;border:1px dashed #dbdee0}
.field-repeater ul.field-repeater-items > li.dragged .repeater-item-remove{opacity:0}
.field-repeater ul.field-repeater-items > li.dragged .repeater-item-collapsed-title{top:5px}
.field-repeater ul.field-repeater-items > li.placeholder{display:block;position:relative;height:25px;margin-bottom:5px}
.field-repeater ul.field-repeater-items > li.placeholder:before{display:block;position:absolute;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f054";color:#d35714;left:-10px;top:8px;z-index:2000}
.field-repeater li.field-repeater-item{position:relative;margin:0 0 1em 1em !important;padding:1.5em 1.25em 0 1.25em !important;background:#f5f5f5;border:1px solid #d1d6d9;border-radius:3px;box-shadow:inset 0 1px 0 rgba(209,214,217,0.25),0 1px 0 rgba(255,255,255,.5);min-height:30px}
.field-repeater li.field-repeater-item:before{color:#bdc3c7;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f111";font-size:8px;position:absolute;left:-18px;top:-2px}
.field-repeater li.field-repeater-item:after{counter-increment:repeater-index-counter;content:counter(repeater-index-counter);display:block;position:absolute;font-size:12px;left:-27px;color:#bdc3c7;top:10px;width:24px;text-align:center}
.field-repeater li.field-repeater-item.collapsed .field-repeater-form{display:none}
.field-repeater li.field-repeater-item.collapsed .repeater-item-collapse .repeater-item-collapse-one{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}
.field-repeater li.field-repeater-item.collapsed .repeater-item-collapsed-title{display:block}
.field-repeater li.field-repeater-item .repeater-item-collapsed-title{display:none;position:absolute;font-size:13px;top:50%;left:10px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}
.field-repeater li.field-repeater-item .field-repeater-form{position:relative;top:-7px}
.field-repeater li.field-repeater-item .field-repeater-form:before,.field-repeater li.field-repeater-item .field-repeater-form:after{content:" ";display:table}
.field-repeater li.field-repeater-item .field-repeater-form:after{clear:both}
.field-repeater li.field-repeater-item .repeater-item-handle{position:absolute;top:-6px;left:-25px;color:#bdc3c7;background:#f9f9f9;cursor:move;opacity:0;border-radius:999px;-webkit-transition:opacity 0.5s;transition:opacity 0.5s}
.field-repeater li.field-repeater-item .repeater-item-handle:hover{color:#999}
.field-repeater li.field-repeater-item .repeater-item-collapse{position:absolute;top:5px;right:30px;z-index:90}
.field-repeater li.field-repeater-item .repeater-item-collapse a,.field-repeater li.field-repeater-item .repeater-item-collapse button{-webkit-transition:transform 0.3s;transition:transform 0.3s;color:#bdc3c7;line-height:20px;display:block;font-size:12px}
.field-repeater li.field-repeater-item .repeater-item-collapse a:hover,.field-repeater li.field-repeater-item .repeater-item-collapse button:hover,.field-repeater li.field-repeater-item .repeater-item-collapse a:focus,.field-repeater li.field-repeater-item .repeater-item-collapse button:focus{color:#999;text-decoration:none}
.field-repeater li.field-repeater-item .repeater-item-remove{position:absolute;top:4px;right:5px;z-index:90}
.field-repeater li.field-repeater-item .repeater-item-remove.disabled{display:none}
.field-repeater li.field-repeater-item .repeater-item-remove.disabled + .repeater-item-collapse{right:7px}
.field-repeater li.field-repeater-item .repeater-item-remove .close{float:none;display:inline-block}
.field-repeater li.field-repeater-item .repeater-item-collapse,.field-repeater li.field-repeater-item .repeater-item-handle,.field-repeater li.field-repeater-item .repeater-item-remove{width:20px;height:20px;text-align:center}
.field-repeater li.field-repeater-item:hover .repeater-item-collapse,.field-repeater li.field-repeater-item:active .repeater-item-collapse,.field-repeater li.field-repeater-item:hover .repeater-item-handle,.field-repeater li.field-repeater-item:active .repeater-item-handle,.field-repeater li.field-repeater-item:hover .repeater-item-remove,.field-repeater li.field-repeater-item:active .repeater-item-remove{opacity:1}
.field-repeater .field-repeater-add-item{position:relative;margin-top:10px;margin-left:20px;border:2px dotted #e0e0e0;border-radius:5px}
.field-repeater .field-repeater-add-item:before{color:#bdc3c7;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f067";font-size:16px;position:absolute;left:-23px;top:-11px}
.field-repeater .field-repeater-add-item > a{color:#bdc3c7;text-align:center;display:block;text-decoration:none;padding:13px 15px;text-transform:uppercase;font-weight:600;font-size:12px}
.field-repeater .field-repeater-add-item:hover,.field-repeater .field-repeater-add-item:focus{background-color:#4ea5e0;border-color:transparent}
.field-repeater .field-repeater-add-item:hover:before,.field-repeater .field-repeater-add-item:focus:before{color:#999}
.field-repeater .field-repeater-add-item:hover > a,.field-repeater .field-repeater-add-item:focus > a{color:#ffffff}
.field-repeater .field-repeater-add-item:active{background:#3498db;border-color:transparent}
.field-repeater .field-repeater-add-item:active > a{color:#ffffff}
.field-repeater .field-repeater-add-item.in-progress{border-color:#e0e0e0 !important;background:transparent !important}
.field-repeater {padding-top:5px}
.field-repeater .field-repeater-items {counter-reset:repeater-index-counter}
.field-repeater ul.field-repeater-items,
.field-repeater li.field-repeater-item {padding:0;margin:0;list-style:none}
.field-repeater ul.field-repeater-items >li.dragged {opacity:.7;position:absolute;padding-top:15px;padding-right:15px;z-index:2000;background-color:#f9f9f9;border:1px dashed #dbdee0}
.field-repeater ul.field-repeater-items >li.dragged .repeater-item-remove {opacity:0}
.field-repeater ul.field-repeater-items >li.dragged .repeater-item-collapsed-title {top:5px}
.field-repeater ul.field-repeater-items >li.placeholder {display:block;position:relative;height:25px;margin-bottom:5px}
.field-repeater ul.field-repeater-items >li.placeholder:before {display:block;position:absolute;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f054";color:#d35714;left:-10px;top:8px;z-index:2000}
.field-repeater li.field-repeater-item {position:relative;margin:0 0 1em 1em !important;padding:1.5em 1.25em 0 1.25em !important;background:#f5f5f5;border:1px solid #d1d6d9;border-radius:3px;box-shadow:inset 0 1px 0 rgba(209,214,217,0.25),0 1px 0 rgba(255,255,255,.5);min-height:30px}
.field-repeater li.field-repeater-item:before {color:#bdc3c7;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f111";font-size:8px;position:absolute;left:-18px;top:-2px}
.field-repeater li.field-repeater-item:after {counter-increment:repeater-index-counter;content:counter(repeater-index-counter);display:block;position:absolute;font-size:12px;left:-27px;color:#bdc3c7;top:10px;width:24px;text-align:center}
.field-repeater li.field-repeater-item.collapsed .field-repeater-form {display:none}
.field-repeater li.field-repeater-item.collapsed .repeater-item-collapse .repeater-item-collapse-one {-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}
.field-repeater li.field-repeater-item.collapsed .repeater-item-collapsed-title {display:block}
.field-repeater li.field-repeater-item .repeater-item-collapsed-title {display:none;position:absolute;font-size:13px;top:50%;left:10px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}
.field-repeater li.field-repeater-item .field-repeater-form {position:relative;top:-7px}
.field-repeater li.field-repeater-item .field-repeater-form:before,
.field-repeater li.field-repeater-item .field-repeater-form:after {content:" ";display:table}
.field-repeater li.field-repeater-item .field-repeater-form:after {clear:both}
.field-repeater li.field-repeater-item .repeater-item-handle {position:absolute;top:-6px;left:-25px;color:#bdc3c7;background:#f9f9f9;cursor:move;opacity:0;border-radius:999px;-webkit-transition:opacity 0.5s;transition:opacity 0.5s}
.field-repeater li.field-repeater-item .repeater-item-handle:hover {color:#999}
.field-repeater li.field-repeater-item .repeater-item-collapse {position:absolute;top:5px;right:30px;z-index:90}
.field-repeater li.field-repeater-item .repeater-item-collapse a,
.field-repeater li.field-repeater-item .repeater-item-collapse button {-webkit-transition:transform 0.3s;transition:transform 0.3s;color:#bdc3c7;line-height:20px;display:block;font-size:12px}
.field-repeater li.field-repeater-item .repeater-item-collapse a:hover,
.field-repeater li.field-repeater-item .repeater-item-collapse button:hover,
.field-repeater li.field-repeater-item .repeater-item-collapse a:focus,
.field-repeater li.field-repeater-item .repeater-item-collapse button:focus {color:#999;text-decoration:none}
.field-repeater li.field-repeater-item .repeater-item-remove {position:absolute;top:4px;right:5px;z-index:90}
.field-repeater li.field-repeater-item .repeater-item-remove.disabled {display:none}
.field-repeater li.field-repeater-item .repeater-item-remove.disabled + .repeater-item-collapse {right:7px}
.field-repeater li.field-repeater-item .repeater-item-remove .close {float:none;display:inline-block}
.field-repeater li.field-repeater-item .repeater-item-collapse,
.field-repeater li.field-repeater-item .repeater-item-handle,
.field-repeater li.field-repeater-item .repeater-item-remove {width:20px;height:20px;text-align:center}
.field-repeater li.field-repeater-item:hover .repeater-item-collapse,
.field-repeater li.field-repeater-item:active .repeater-item-collapse,
.field-repeater li.field-repeater-item:hover .repeater-item-handle,
.field-repeater li.field-repeater-item:active .repeater-item-handle,
.field-repeater li.field-repeater-item:hover .repeater-item-remove,
.field-repeater li.field-repeater-item:active .repeater-item-remove {opacity:1}
.field-repeater .field-repeater-add-item {position:relative;margin-top:10px;margin-left:20px;border:2px dotted #e0e0e0;border-radius:5px}
.field-repeater .field-repeater-add-item:before {color:#bdc3c7;font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;content:"\f067";font-size:16px;position:absolute;left:-23px;top:-11px}
.field-repeater .field-repeater-add-item >a {color:#bdc3c7;text-align:center;display:block;text-decoration:none;padding:13px 15px;text-transform:uppercase;font-weight:600;font-size:12px}
.field-repeater .field-repeater-add-item:hover,
.field-repeater .field-repeater-add-item:focus {background-color:#4ea5e0;border-color:transparent}
.field-repeater .field-repeater-add-item:hover:before,
.field-repeater .field-repeater-add-item:focus:before {color:#999}
.field-repeater .field-repeater-add-item:hover >a,
.field-repeater .field-repeater-add-item:focus >a {color:#fff}
.field-repeater .field-repeater-add-item:active {background:#3498db;border-color:transparent}
.field-repeater .field-repeater-add-item:active >a {color:#fff}
.field-repeater .field-repeater-add-item.in-progress {border-color:#e0e0e0 !important;background:transparent !important}

View File

@ -84,6 +84,7 @@
}
Repeater.prototype.clickAddGroupButton = function(ev) {
var $self = this;
var templateHtml = $('> [data-group-palette-template]', this.$el).html(),
$target = $(ev.target),
$form = this.$el.closest('form'),
@ -107,6 +108,7 @@
$form.one('ajaxComplete', function() {
$loadContainer.loadIndicator('hide')
$self.togglePrompt()
})
})
@ -114,6 +116,17 @@
}
Repeater.prototype.onRemoveItemSuccess = function(ev) {
// Allow any widgets inside a deleted item to be disposed
$(ev.target).closest('.field-repeater-item').find('[data-disposable]').each(function () {
var $elem = $(this),
control = $elem.data('control'),
widget = $elem.data('oc.' + control)
if (widget && typeof widget['dispose'] === 'function') {
widget.dispose()
}
})
$(ev.target).closest('.field-repeater-item').remove()
this.togglePrompt()
}

File diff suppressed because one or more lines are too long

View File

@ -7,7 +7,8 @@
* @see build-min.js
*
=require ../vendor/froala_drm/js/froala_editor.min.js
// Cannot be minified twice
=require ../vendor/froala_drm/js/froala_editor.js
// Buttons
=require ../vendor/froala_drm/js/plugins/paragraph_style.min.js
@ -38,6 +39,9 @@
=require ../vendor/froala_drm/js/plugins/draggable.min.js
=require ../vendor/froala_drm/js/plugins/code_beautifier.min.js
// More testing needed
//require ../vendor/froala_drm/js/plugins/quick_insert.js
=require plugins/mediamanager.js
=require plugins/pagelinks.js
=require plugins/figures.js

View File

@ -45,12 +45,17 @@
}
function onInsertImage() {
var $currentImage = editor.image.get()
var $currentImage = editor.image.get(),
selection = editor.selection.get(),
range = editor.selection.ranges(0);
new $.oc.mediaManager.popup({
alias: 'ocmediamanager',
cropAndInsertButton: true,
onInsert: function(items) {
editor.selection.clear();
selection.addRange(range);
if (!items.length) {
$.oc.alert($.oc.lang.get('mediamanager.invalid_image_empty_insert'))
return

View File

@ -12,7 +12,7 @@ $.FroalaEditor.DEFAULTS = $.extend($.FroalaEditor.DEFAULTS, {
pageLinksHandler: 'onLoadPageLinksForm'
});
$.FroalaEditor.DEFAULTS.key = 'HHMDUGENKACTMXQL==';
$.FroalaEditor.DEFAULTS.key = 'JA6B2B5A1qB1F1F4D3I1A15A11D3E6B5dVh1VCQWa1EOQFe1NCb1==';
(function ($) {
$.FroalaEditor.PLUGINS.pageLinks = function (editor) {

View File

@ -172,7 +172,6 @@
this.$textarea.on('froalaEditor.initialized', this.proxy(this.build))
this.$textarea.on('froalaEditor.contentChanged', this.proxy(this.onChange))
this.$textarea.on('froalaEditor.keydown', this.proxy(this.onKeydown))
this.$textarea.on('froalaEditor.html.get', this.proxy(this.onSyncContent))
this.$textarea.on('froalaEditor.html.set', this.proxy(this.onSetContent))
this.$form.on('oc.beforeRequest', this.proxy(this.onFormBeforeRequest))
@ -209,7 +208,6 @@
this.$textarea.off('froalaEditor.initialized', this.proxy(this.build))
this.$textarea.off('froalaEditor.contentChanged', this.proxy(this.onChange))
this.$textarea.off('froalaEditor.keydown', this.proxy(this.onKeydown))
this.$textarea.off('froalaEditor.html.get', this.proxy(this.onSyncContent))
this.$textarea.off('froalaEditor.html.set', this.proxy(this.onSetContent))
this.$form.off('oc.beforeRequest', this.proxy(this.onFormBeforeRequest))
@ -224,6 +222,9 @@
$(window).on('resize', this.proxy(this.updateLayout))
$(window).on('oc.updateUi', this.proxy(this.updateLayout))
// Bind the keydown listener here to ensure it gets handled before the Froala handlers
editor.events.on('keydown', this.proxy(this.onKeydown), true)
this.$textarea.trigger('init.oc.richeditor', [this])
}

View File

@ -26,6 +26,9 @@
@import "../vendor/froala_drm/less/plugins/line_breaker.less";
@import "../vendor/froala_drm/less/plugins/draggable.less";
// More testing needed
//import "../vendor/froala_drm/less/plugins/quick_insert.less";
// Base styles
@import "_base_styles.less";
@ -202,3 +205,14 @@
}
}
}
//
// Quick Insert
//
.fr-quick-insert {
a.fr-floating-btn {
color: @btn-text;
text-decoration: none;
}
}

View File

@ -1,9 +1,35 @@
/*!
* froala_editor v2.4.2 (https://www.froala.com/wysiwyg-editor)
* froala_editor v2.9.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2017 Froala Labs
* Copyright 2014-2019 Froala Labs
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
}
else {
jQuery = require('jquery')(root);
}
}
return factory(jQuery);
};
} else {
// Browser globals
factory(window.jQuery);
}
}(function ($) {
/**
* Arabic
*/
@ -38,6 +64,7 @@ $.FE.LANGUAGE['ar'] = {
"Colors": "\u0627\u0644\u0623\u0644\u0648\u0627\u0646",
"Background": "\u0627\u0644\u062e\u0644\u0641\u064a\u0629",
"Text": "\u0627\u0644\u0646\u0635",
"HEX Color": "عرافة اللون",
// Paragraphs
"Paragraph Format": "\u062a\u0646\u0633\u064a\u0642 \u0627\u0644\u0641\u0642\u0631\u0629",
@ -62,7 +89,22 @@ $.FE.LANGUAGE['ar'] = {
// Lists
"Ordered List": "\u0642\u0627\u0626\u0645\u0629 \u0645\u0631\u062a\u0628\u0629",
"Default": "الافتراضي",
"Lower Alpha": "أقل ألفا",
"Lower Greek": "أقل اليونانية",
"Lower Roman": "انخفاض الروماني",
"Upper Alpha": "العلوي ألفا",
"Upper Roman": "الروماني العلوي",
"Unordered List": "\u0642\u0627\u0626\u0645\u0629 \u063a\u064a\u0631 \u0645\u0631\u062a\u0628\u0629",
"Circle": "دائرة",
"Disc": "القرص",
"Square": "ميدان",
// Line height
"Line Height": "ارتفاع خط",
"Single": "غير مرتبطة",
"Double": "مزدوج",
// Indent
"Decrease Indent": "\u0627\u0646\u062e\u0641\u0627\u0636 \u0627\u0644\u0645\u0633\u0627\u0641\u0629 \u0627\u0644\u0628\u0627\u062f\u0626\u0629",
@ -94,15 +136,21 @@ $.FE.LANGUAGE['ar'] = {
"Display": "\u0639\u0631\u0636",
"Inline": "\u0641\u064a \u062e\u0637",
"Break Text": "\u0646\u0635 \u0627\u0633\u062a\u0631\u0627\u062d\u0629",
"Alternate Text": "\u0646\u0635 \u0628\u062f\u064a\u0644",
"Alternative Text": "\u0646\u0635 \u0628\u062f\u064a\u0644",
"Change Size": "\u062a\u063a\u064a\u064a\u0631 \u062d\u062c\u0645",
"Width": "\u0639\u0631\u0636",
"Height": "\u0627\u0631\u062a\u0641\u0627\u0639",
"Something went wrong. Please try again.": ".\u062d\u062f\u062b \u062e\u0637\u0623 \u0645\u0627. \u062d\u0627\u0648\u0644 \u0645\u0631\u0629 \u0627\u062e\u0631\u0649",
"Image Caption": "تعليق على الصورة",
"Advanced Edit": "تعديل متقدم",
// Video
"Insert Video": "\u0625\u062f\u0631\u0627\u062c \u0641\u064a\u062f\u064a\u0648",
"Embedded Code": "\u0627\u0644\u062a\u0639\u0644\u064a\u0645\u0627\u062a \u0627\u0644\u0628\u0631\u0645\u062c\u064a\u0629 \u0627\u0644\u0645\u0636\u0645\u0646\u0629",
"Paste in a video URL": "لصق في عنوان ورل للفيديو",
"Drop video": "انخفاض الفيديو",
"Your browser does not support HTML5 video.": "متصفحك لا يدعم فيديو HTML5.",
"Upload Video": "رفع فيديو",
// Tables
"Insert Table": "\u0625\u062f\u0631\u0627\u062c \u062c\u062f\u0648\u0644",
@ -211,6 +259,9 @@ $.FE.LANGUAGE['ar'] = {
// Clear formatting
"Clear Formatting": "\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u062a\u0646\u0633\u064a\u0642",
// Save
"Save": "\u062d\u0641\u0638",
// Undo, redo
"Undo": "\u062a\u0631\u0627\u062c\u0639",
"Redo": "\u0625\u0639\u0627\u062f\u0629",
@ -227,7 +278,59 @@ $.FE.LANGUAGE['ar'] = {
"Decrease": "\u0627\u0646\u062e\u0641\u0627\u0636",
// Quick Insert
"Quick Insert": "\u0625\u062f\u0631\u0627\u062c \u0633\u0631\u064a\u0639"
"Quick Insert": "\u0625\u062f\u0631\u0627\u062c \u0633\u0631\u064a\u0639",
// Spcial Characters
"Special Characters": "أحرف خاصة",
"Latin": "لاتينية",
"Greek": "الإغريقي",
"Cyrillic": "السيريلية",
"Punctuation": "علامات ترقيم",
"Currency": "دقة",
"Arrows": "السهام",
"Math": "الرياضيات",
"Misc": "متفرقات",
// Print.
"Print": "طباعة",
// Spell Checker.
"Spell Checker": "مدقق املائي",
// Help
"Help": "مساعدة",
"Shortcuts": "اختصارات",
"Inline Editor": "محرر مضمنة",
"Show the editor": "عرض المحرر",
"Common actions": "الإجراءات المشتركة",
"Copy": "نسخ",
"Cut": "يقطع",
"Paste": "معجون",
"Basic Formatting": "التنسيق الأساسي",
"Increase quote level": "زيادة مستوى الاقتباس",
"Decrease quote level": "انخفاض مستوى الاقتباس",
"Image / Video": "صورة / فيديو",
"Resize larger": "تغيير حجم أكبر",
"Resize smaller": "تغيير حجم أصغر",
"Table": "الطاولة",
"Select table cell": "حدد خلية الجدول",
"Extend selection one cell": "توسيع اختيار خلية واحدة",
"Extend selection one row": "تمديد اختيار صف واحد",
"Navigation": "التنقل",
"Focus popup / toolbar": "التركيز المنبثقة / شريط الأدوات",
"Return focus to previous position": "عودة التركيز إلى الموقف السابق",
// Embed.ly
"Embed URL": "تضمين عنوان ورل",
"Paste in a URL to embed": "الصق في عنوان ورل لتضمينه",
// Word Paste.
"The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?": "المحتوى الذي تم لصقه قادم من وثيقة كلمة ميكروسوفت. هل تريد الاحتفاظ بالتنسيق أو تنظيفه؟",
"Keep": "احتفظ",
"Clean": "نظيف",
"Word Paste Detected": "تم اكتشاف معجون الكلمات"
},
direction: "rtl"
};
}));

View File

@ -1,9 +1,35 @@
/*!
* froala_editor v2.4.2 (https://www.froala.com/wysiwyg-editor)
* froala_editor v2.9.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2017 Froala Labs
* Copyright 2014-2019 Froala Labs
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
}
else {
jQuery = require('jquery')(root);
}
}
return factory(jQuery);
};
} else {
// Browser globals
factory(window.jQuery);
}
}(function ($) {
/**
* Bosnian
*/
@ -38,6 +64,7 @@ $.FE.LANGUAGE['bs'] = {
"Colors": "Boje",
"Background": "Pozadine",
"Text": "Teksta",
"HEX Color": "Hex boje",
// Paragraphs
"Paragraph Format": "Paragraf formatu",
@ -62,7 +89,22 @@ $.FE.LANGUAGE['bs'] = {
// Lists
"Ordered List": "Ure\u0111ena lista",
"Default": "Default",
"Lower Alpha": "Niži alfa",
"Lower Greek": "Niži grčki",
"Lower Roman": "Lower roman",
"Upper Alpha": "Upper alpha",
"Upper Roman": "Upper roman",
"Unordered List": "Nesre\u0111ene lista",
"Circle": "Krug",
"Disc": "Disk",
"Square": "Kvadrat",
// Line height
"Line Height": "Visina linije",
"Single": "Single",
"Double": "Double",
// Indent
"Decrease Indent": "Smanjenje alineja",
@ -94,15 +136,21 @@ $.FE.LANGUAGE['bs'] = {
"Display": "Prikaz",
"Inline": "Inline",
"Break Text": "Break tekst",
"Alternate Text": "Alternativna tekst",
"Alternative Text": "Alternativna tekst",
"Change Size": "Promijeni veli\u010dinu",
"Width": "\u0161irina",
"Height": "Visina",
"Something went wrong. Please try again.": "Ne\u0161to je po\u0161lo po zlu. Molimo vas da poku\u0161ate ponovo.",
"Image Caption": "Caption slika",
"Advanced Edit": "Napredna izmjena",
// Video
"Insert Video": "Umetni video",
"Embedded Code": "Embedded kod",
"Paste in a video URL": "Nalepite u video url",
"Drop video": "Drop video",
"Your browser does not support HTML5 video.": "Vaš pretraživač ne podržava html5 video.",
"Upload Video": "Otpremite video",
// Tables
"Insert Table": "Umetni tabelu",
@ -211,6 +259,9 @@ $.FE.LANGUAGE['bs'] = {
// Clear formatting
"Clear Formatting": "Izbrisati formatiranje",
// Save
"Save":"Spremi",
// Undo, redo
"Undo": "Korak nazad",
"Redo": "Korak naprijed",
@ -227,7 +278,59 @@ $.FE.LANGUAGE['bs'] = {
"Decrease": "Smanjenje",
// Quick Insert
"Quick Insert": "Brzo umetak"
"Quick Insert": "Brzo umetak",
// Spcial Characters
"Special Characters": "Posebni znakovi",
"Latin": "Latin",
"Greek": "Greek",
"Cyrillic": "Ćirilično",
"Punctuation": "Interpunkcija",
"Currency": "Valuta",
"Arrows": "Strelice",
"Math": "Matematika",
"Misc": "Misc",
// Print.
"Print": "Print",
// Spell Checker.
"Spell Checker": "Proveru pravopisa",
// Help
"Help": "Pomoć",
"Shortcuts": "Prečice",
"Inline Editor": "Inline editor",
"Show the editor": "Pokaži urednika",
"Common actions": "Zajedničke akcije",
"Copy": "Kopiraj",
"Cut": "Cut",
"Paste": "Paste",
"Basic Formatting": "Osnovno oblikovanje",
"Increase quote level": "Povećati cijeni",
"Decrease quote level": "Smanjiti nivo ponude",
"Image / Video": "Slika / video",
"Resize larger": "Veće veličine",
"Resize smaller": "Manja promjena veličine",
"Table": "Stol",
"Select table cell": "Izaberite ćeliju tablice",
"Extend selection one cell": "Produžiti izbor jedne ćelije",
"Extend selection one row": "Produžiti izbor jedan red",
"Navigation": "Navigacija",
"Focus popup / toolbar": "Focus popup / toolbar",
"Return focus to previous position": "Vratite fokus na prethodnu poziciju",
// Embed.ly
"Embed URL": "Ugraditi url",
"Paste in a URL to embed": "Paste u URL adresu za ugradnju",
// Word Paste.
"The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?": "Nalepeni sadržaj dolazi iz Microsoft Word dokumenta. da li želite da zadržite format ili da ga očistite?",
"Keep": "Zadržati",
"Clean": "Čist",
"Word Paste Detected": "Otkrivena je slovna reč"
},
direction: "ltr"
};
}));

View File

@ -1,9 +1,35 @@
/*!
* froala_editor v2.4.2 (https://www.froala.com/wysiwyg-editor)
* froala_editor v2.9.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2017 Froala Labs
* Copyright 2014-2019 Froala Labs
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
}
else {
jQuery = require('jquery')(root);
}
}
return factory(jQuery);
};
} else {
// Browser globals
factory(window.jQuery);
}
}(function ($) {
/**
* Czech
*/
@ -38,6 +64,7 @@ $.FE.LANGUAGE['cs'] = {
"Colors": "Barvy",
"Background": "Pozad\u00ed",
"Text": "P\u00edsmo",
"HEX Color": "Hex Barvy",
// Paragraphs
"Paragraph Format": "Form\u00e1t odstavec",
@ -62,7 +89,22 @@ $.FE.LANGUAGE['cs'] = {
// Lists
"Ordered List": "\u010c\u00edslovan\u00fd seznam",
"Default": "Výchozí",
"Lower Alpha": "Nižší alfa",
"Lower Greek": "Nižší řečtina",
"Lower Roman": "Nižší římský",
"Upper Alpha": "Horní alfa",
"Upper Roman": "Horní římský",
"Unordered List": "Ne\u010d\u00edslovan\u00fd seznam",
"Circle": "Kruh",
"Disc": "Disk",
"Square": "Náměstí",
// Line height
"Line Height": "Výška řádku",
"Single": "Singl",
"Double": "Dvojnásobek",
// Indent
"Decrease Indent": "Zmen\u0161it odsazen\u00ed",
@ -94,15 +136,21 @@ $.FE.LANGUAGE['cs'] = {
"Display": "Zobrazit",
"Inline": "Inline",
"Break Text": "P\u0159est\u00e1vka textu",
"Alternate Text": "Alternativn\u00ed textu",
"Alternative Text": "Alternativn\u00ed textu",
"Change Size": "Zm\u011bnit velikost",
"Width": "\u0160\u00ed\u0159ka",
"Height": "V\u00fd\u0161ka",
"Something went wrong. Please try again.": "N\u011bco se pokazilo. Pros\u00edm zkuste to znovu.",
"Image Caption": "Obrázek titulku",
"Advanced Edit": "Pokročilá úprava",
// Video
"Insert Video": "Vlo\u017eit video",
"Embedded Code": "Vlo\u017een\u00fd k\u00f3d",
"Paste in a video URL": "Vložit adresu URL videa",
"Drop video": "Drop video",
"Your browser does not support HTML5 video.": "Váš prohlížeč nepodporuje video html5.",
"Upload Video": "Nahrát video",
// Tables
"Insert Table": "Vlo\u017eit tabulku",
@ -211,6 +259,9 @@ $.FE.LANGUAGE['cs'] = {
// Clear formatting
"Clear Formatting": "Vymazat form\u00e1tov\u00e1n\u00ed",
// Save
"Save": "\u0055\u006c\u006f\u017e\u0069\u0074",
// Undo, redo
"Undo": "Zp\u011bt",
"Redo": "Znovu",
@ -227,7 +278,59 @@ $.FE.LANGUAGE['cs'] = {
"Decrease": "Sn\u00ed\u017een\u00ed",
// Quick Insert
"Quick Insert": "Rychl\u00e1 vlo\u017eka"
"Quick Insert": "Rychl\u00e1 vlo\u017eka",
// Spcial Characters
"Special Characters": "Speciální znaky",
"Latin": "Latinský",
"Greek": "Řecký",
"Cyrillic": "Cyrilice",
"Punctuation": "Interpunkce",
"Currency": "Měna",
"Arrows": "Šipky",
"Math": "Matematika",
"Misc": "Misc",
// Print.
"Print": "Tisk",
// Spell Checker.
"Spell Checker": "Kontrola pravopisu",
// Help
"Help": "Pomoc",
"Shortcuts": "Zkratky",
"Inline Editor": "Inline editor",
"Show the editor": "Zobrazit editor",
"Common actions": "Společné akce",
"Copy": "Kopírovat",
"Cut": "Střih",
"Paste": "Vložit",
"Basic Formatting": "Základní formátování",
"Increase quote level": "Zvýšení cenové hladiny",
"Decrease quote level": "Snížit úroveň cenové nabídky",
"Image / Video": "Obraz / video",
"Resize larger": "Změna velikosti větší",
"Resize smaller": "Změnit velikost menší",
"Table": "Stůl",
"Select table cell": "Vyberte buňku tabulky",
"Extend selection one cell": "Rozšířit výběr o jednu buňku",
"Extend selection one row": "Rozšířit výběr o jeden řádek",
"Navigation": "Navigace",
"Focus popup / toolbar": "Popup / panel nástrojů zaostření",
"Return focus to previous position": "Návrat na předchozí pozici",
// Embed.ly
"Embed URL": "Vložte url",
"Paste in a URL to embed": "Vložit adresu URL, kterou chcete vložit",
// Word Paste.
"The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?": "Vložený obsah pochází z dokumentu Microsoft Word. chcete formát uchovat nebo jej vyčistit?",
"Keep": "Držet",
"Clean": "Čistý",
"Word Paste Detected": "Slovní vložka zjištěna"
},
direction: "ltr"
};
}));

View File

@ -1,9 +1,35 @@
/*!
* froala_editor v2.4.2 (https://www.froala.com/wysiwyg-editor)
* froala_editor v2.9.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2017 Froala Labs
* Copyright 2014-2019 Froala Labs
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
}
else {
jQuery = require('jquery')(root);
}
}
return factory(jQuery);
};
} else {
// Browser globals
factory(window.jQuery);
}
}(function ($) {
/**
* Danish
*/
@ -11,223 +37,297 @@
$.FE.LANGUAGE['da'] = {
translation: {
// Place holder
"Type something": "Skriv noget",
"Type something": "Skriv her",
// Basic formatting
"Bold": "Fed",
"Italic": "Kursiv",
"Underline": "Understreg",
"Strikethrough": "Gennemstreg",
"Underline": "Understreget",
"Strikethrough": "Gennemstreget",
// Main buttons
"Insert": "Inds\u00e6t",
"Insert": "Indsæt",
"Delete": "Slet",
"Cancel": "Fortryd",
"OK": "Ok",
"Back": "Tilbage",
"Remove": "Fjern",
"More": "Mere",
"Update": "Opdatering",
"Style": "Stil",
"Update": "Opdater",
"Style": "Udseende",
// Font
"Font Family": "Skrifttype",
"Font Size": "Skriftst\u00f8rrelse",
"Font Size": "Skriftstørrelse",
// Colors
"Colors": "Farver",
"Background": "Baggrunds",
"Background": "Baggrund",
"Text": "Tekst",
"HEX Color": "Hex farve",
// Paragraphs
"Paragraph Format": "S\u00e6tning format",
"Paragraph Format": "Typografi",
"Normal": "Normal",
"Code": "Code",
"Code": "Kode",
"Heading 1": "Overskrift 1",
"Heading 2": "Overskrift 2",
"Heading 3": "Overskrift 3",
"Heading 4": "Overskrift 4",
// Style
"Paragraph Style": "S\u00e6tning stil",
"Inline Style": "Inline stil",
"Paragraph Style": "Afsnit",
"Inline Style": "På linje",
// Alignment
"Align": "Tilpasning",
"Align Left": "Venstrejusteret",
"Align Center": "Centreret",
"Align Right": "H\u00f8jrejusteret",
"Align Justify": "Justering",
"None": "Intet",
"Align Right": "Højrejusteret",
"Align Justify": "Justeret",
"None": "Ingen",
// Lists
"Ordered List": "Ordnet liste",
"Unordered List": "Uordnet liste",
"Ordered List": "Punktopstilling",
"Default": "Standard",
"Lower Alpha": "Lavere alfa",
"Lower Greek": "Lavere græsk",
"Lower Roman": "Lavere romersk",
"Upper Alpha": "Øvre alfa",
"Upper Roman": "Øvre romersk",
"Unordered List": "Punktopstilling med tal",
"Circle": "Cirkel",
"Disc": "Disk",
"Square": "Firkant",
// Line height
"Line Height": "Linjehøjde",
"Single": "Enkelt",
"Double": "Dobbelt",
// Indent
"Decrease Indent": "Mindske indrykning",
"Increase Indent": "For\u00f8ge indrykning",
"Decrease Indent": "Formindsk indrykning",
"Increase Indent": "Forøg indrykning",
// Links
"Insert Link": "Inds\u00e6t link",
"Open in new tab": "\u00c5bn i ny fane",
"Open Link": "\u00c5bn link",
"Insert Link": "Indsæt link",
"Open in new tab": "Åbn i ny fane",
"Open Link": "Åbn link",
"Edit Link": "Rediger link",
"Unlink": "Fjern link",
"Choose Link": "V\u00e6lg link",
"Choose Link": "Vælg link",
// Images
"Insert Image": "Inds\u00e6t billede",
"Insert Image": "Indsæt billede",
"Upload Image": "Upload billede",
"By URL": "Af URL",
"By URL": "Fra URL",
"Browse": "Gennemse",
"Drop image": "Tr\u00e6k billedet herind",
"Drop image": "Træk billedet herind",
"or click": "eller klik",
"Manage Images": "Administrer billeder",
"Loading": "Lastning",
"Deleting": "Sletning",
"Loading": "Henter",
"Deleting": "Sletter",
"Tags": "Tags",
"Are you sure? Image will be deleted.": "Er du sikker? Billede vil blive slettet.",
"Are you sure? Image will be deleted.": "Er du sikker? Billedet vil blive slettet.",
"Replace": "Udskift",
"Uploading": "Upload",
"Loading image": "Lastning billede",
"Display": "Udstilling",
"Inline": "Inline",
"Break Text": "Afbrydelse tekst",
"Alternate Text": "Suppleant tekst",
"Change Size": "Skift st\u00f8rrelse",
"Uploading": "Uploader",
"Loading image": "Henter billede",
"Display": "Layout",
"Inline": "På linje",
"Break Text": "Ombryd tekst",
"Alternative Text": "Supplerende tekst",
"Change Size": "Tilpas størrelse",
"Width": "Bredde",
"Height": "H\u00f8jde",
"Something went wrong. Please try again.": "Noget gik galt. Pr\u00f8v igen.",
"Height": "Højde",
"Something went wrong. Please try again.": "Noget gik galt. Prøv igen.",
"Image Caption": "Billedtekst",
"Advanced Edit": "Avanceret redigering",
// Video
"Insert Video": "Inds\u00e6t video",
"Embedded Code": "Embedded kode",
"Insert Video": "Indsæt video",
"Embedded Code": "Indlejret kode",
"Paste in a video URL": "Indsæt en video via URL",
"Drop video": "Træk videoen herind",
"Your browser does not support HTML5 video.": "Din browser understøtter ikke HTML5 video.",
"Upload Video": "Upload video",
// Tables
"Insert Table": "Inds\u00e6t tabel",
"Table Header": "Tabel header",
"Insert Table": "Indsæt tabel",
"Table Header": "Tabeloverskrift",
"Remove Table": "Fjern tabel",
"Table Style": "Tabel stil",
"Table Style": "Tabeludseende",
"Horizontal Align": "Vandret tilpasning",
"Row": "R\u00e6kke",
"Insert row above": "Inds\u00e6t r\u00e6kke over",
"Insert row below": "Inds\u00e6t r\u00e6kke under",
"Delete row": "Slet r\u00e6kke",
"Row": "Række",
"Insert row above": "Indsæt række over",
"Insert row below": "Indsæt række under",
"Delete row": "Slet række",
"Column": "Kolonne",
"Insert column before": "Inds\u00e6t kolonne f\u00f8r",
"Insert column after": "Inds\u00e6t kolonne efter",
"Insert column before": "Indsæt kolonne før",
"Insert column after": "Indsæt kolonne efter",
"Delete column": "Slet kolonne",
"Cell": "Celle",
"Merge cells": "Flet celler",
"Horizontal split": "Vandret split",
"Vertical split": "Lodret split",
"Cell Background": "Celle baggrund",
"Cell Background": "Cellebaggrund",
"Vertical Align": "Lodret tilpasning",
"Top": "Top",
"Middle": "Midten",
"Middle": "Midte",
"Bottom": "Bund",
"Align Top": "Tilpasse top",
"Align Middle": "Tilpasse midten",
"Align Bottom": "Tilpasse bund",
"Cell Style": "Celle stil",
"Align Top": "Tilpas i top",
"Align Middle": "Tilpas i midte",
"Align Bottom": "Tilpas i bund",
"Cell Style": "Celleudseende",
// Files
"Upload File": "Upload fil",
"Drop file": "Drop fil",
"Drop file": "Træk filen herind",
// Emoticons
"Emoticons": "Hum\u00f8rikoner",
"Emoticons": "Humørikoner",
"Grinning face": "Grinende ansigt",
"Grinning face with smiling eyes": "Grinende ansigt med smilende \u00f8jne",
"Face with tears of joy": "Ansigt med gl\u00e6dest\u00e5rer",
"Smiling face with open mouth": "Smilende ansigt med \u00e5ben mund",
"Smiling face with open mouth and smiling eyes": "Smilende ansigt med \u00e5ben mund og smilende \u00f8jne",
"Smiling face with open mouth and cold sweat": "Smilende ansigt med \u00e5ben mund og koldsved",
"Smiling face with open mouth and tightly-closed eyes": "Smilende ansigt med \u00e5ben mund og stramt-lukkede \u00f8jne",
"Smiling face with halo": "Smilende ansigt med halo",
"Grinning face with smiling eyes": "Grinende ansigt med smilende øjne",
"Face with tears of joy": "Ansigt med glædestårer",
"Smiling face with open mouth": "Smilende ansigt med åben mund",
"Smiling face with open mouth and smiling eyes": "Smilende ansigt med åben mund og smilende øjne",
"Smiling face with open mouth and cold sweat": "Smilende ansigt med åben mund og koldsved",
"Smiling face with open mouth and tightly-closed eyes": "Smilende ansigt med åben mund og stramtlukkede øjne",
"Smiling face with halo": "Smilende ansigt med glorie",
"Smiling face with horns": "Smilende ansigt med horn",
"Winking face": "Blinkede ansigt",
"Smiling face with smiling eyes": "Smilende ansigt med smilende \u00f8jne",
"Face savoring delicious food": "Ansigt savoring l\u00e6kker mad",
"Smiling face with smiling eyes": "Smilende ansigt med smilende øjne",
"Face savoring delicious food": "Ansigt der savler over lækker mad",
"Relieved face": "Lettet ansigt",
"Smiling face with heart-shaped eyes": "Smilende ansigt med hjerteformede \u00f8jne",
"Smiling face with heart-shaped eyes": "Smilende ansigt med hjerteformede øjne",
"Smiling face with sunglasses": "Smilende ansigt med solbriller",
"Smirking face": "Smilende ansigt",
"Neutral face": "Neutral ansigt",
"Expressionless face": "Udtryksl\u00f8se ansigt",
"Unamused face": "Ikke morede ansigt",
"Neutral face": "Neutralt ansigt",
"Expressionless face": "Udtryksløst ansigt",
"Unamused face": "Utilfredst ansigt",
"Face with cold sweat": "Ansigt med koldsved",
"Pensive face": "Eftert\u00e6nksom ansigt",
"Pensive face": "Eftertænksomt ansigt",
"Confused face": "Forvirret ansigt",
"Confounded face": "Forvirrede ansigt",
"Kissing face": "Kysse ansigt",
"Face throwing a kiss": "Ansigt smide et kys",
"Kissing face with smiling eyes": "Kysse ansigt med smilende \u00f8jne",
"Kissing face with closed eyes": "Kysse ansigt med lukkede \u00f8jne",
"Face with stuck out tongue": "Ansigt med stak ud tungen",
"Face with stuck out tongue and winking eye": "Ansigt med stak ud tungen og blinkede \u00f8je",
"Face with stuck out tongue and tightly-closed eyes": "Ansigt med stak ud tungen og stramt lukkede \u00f8jne",
"Confounded face": "Irriteret ansigt",
"Kissing face": "Kyssende ansigt",
"Face throwing a kiss": "Ansigt der luftkysser",
"Kissing face with smiling eyes": "Kyssende ansigt med smilende øjne",
"Kissing face with closed eyes": "Kyssende ansigt med lukkede øjne",
"Face with stuck out tongue": "Ansigt med tungen ud af munden",
"Face with stuck out tongue and winking eye": "Ansigt med tungen ud af munden og blinkede øje",
"Face with stuck out tongue and tightly-closed eyes": "Ansigt med tungen ud af munden og stramt lukkede øjne",
"Disappointed face": "Skuffet ansigt",
"Worried face": "Bekymret ansigt",
"Angry face": "Vred ansigt",
"Pouting face": "Sk\u00e6gtorsk ansigt",
"Crying face": "Gr\u00e6der ansigt",
"Persevering face": "Udholdende ansigt",
"Face with look of triumph": "Ansigt med udseendet af triumf",
"Angry face": "Vredt ansigt",
"Pouting face": "Surmulende ansigt",
"Crying face": "Grædende ansigt",
"Persevering face": "Vedholdende ansigt",
"Face with look of triumph": "Hoverende ansigt",
"Disappointed but relieved face": "Skuffet, men lettet ansigt",
"Frowning face with open mouth": "Rynkede panden ansigt med \u00e5ben mund",
"Anguished face": "Forpinte ansigt",
"Fearful face": "Frygt ansigt",
"Weary face": "Tr\u00e6tte ansigt",
"Sleepy face": "S\u00f8vnig ansigt",
"Tired face": "Tr\u00e6t ansigt",
"Grimacing face": "Grimasser ansigt",
"Loudly crying face": "H\u00f8jlydt grædende ansigt",
"Face with open mouth": "Ansigt med \u00e5ben mund",
"Frowning face with open mouth": "Ansigt med åben mund og rynket pande",
"Anguished face": "Forpintt ansigt",
"Fearful face": "Angst ansigt",
"Weary face": "Udmattet ansigt",
"Sleepy face": "Søvnigt ansigt",
"Tired face": "Træt ansigt",
"Grimacing face": "Ansigt der laver en grimasse",
"Loudly crying face": "Vrælende ansigt",
"Face with open mouth": "Ansigt med åben mund",
"Hushed face": "Tyst ansigt",
"Face with open mouth and cold sweat": "Ansigt med \u00e5ben mund og koldsved",
"Face screaming in fear": "Ansigt skrigende i fryg",
"Astonished face": "Forundret ansigt",
"Face with open mouth and cold sweat": "Ansigt med åben mund og koldsved",
"Face screaming in fear": "Ansigt der skriger i frygt",
"Astonished face": "Forbløffet ansigt",
"Flushed face": "Blussende ansigt",
"Sleeping face": "Sovende ansigt",
"Dizzy face": "Svimmel ansigt",
"Dizzy face": "Svimmelt ansigt",
"Face without mouth": "Ansigt uden mund",
"Face with medical mask": "Ansigt med medicinsk maske",
"Face with medical mask": "Ansigt med mundbind",
// Line breaker
"Break": "Afbrydelse",
"Break": "Linjeskift",
// Math
"Subscript": "S\u00e6nket skrift",
"Superscript": "H\u00e6vet skrift",
"Subscript": "Sænket skrift",
"Superscript": "Hævet skrift",
// Full screen
"Fullscreen": "Fuld sk\u00e6rm",
"Fullscreen": "Fuldskærm",
// Horizontal line
"Insert Horizontal Line": "Inds\u00e6t vandret linie",
"Insert Horizontal Line": "Indsæt vandret linie",
// Clear formatting
"Clear Formatting": "Fjern formatering",
// Undo, redo
"Undo": "Fortryd",
"Redo": "Genopret",
"Redo": "Annuller fortryd",
// Select all
"Select All": "V\u00e6lg alle",
"Select All": "Vælg alt",
// Code view
"Code View": "Kode visning",
"Code View": "Kodevisning",
// Quote
"Quote": "Citat",
"Increase": "For\u00f8ge",
"Decrease": "Mindsk",
"Increase": "Forøg",
"Decrease": "Formindsk",
// Quick Insert
"Quick Insert": "Hurtig indsats"
"Quick Insert": "Kvik-indsæt",
// Spcial Characters
"Special Characters": "Specialtegn",
"Latin": "Latin",
"Greek": "Græsk",
"Cyrillic": "Kyrillisk",
"Punctuation": "Tegnsætning",
"Currency": "Valuta",
"Arrows": "Pile",
"Math": "Matematik",
"Misc": "Diverse",
// Print.
"Print": "Print",
// Spell Checker.
"Spell Checker": "Stavekontrol",
// Help
"Help": "Hjælp",
"Shortcuts": "Genveje",
"Inline Editor": "Indlejret editor",
"Show the editor": "Vis editor",
"Common actions": "Almindelige handlinger",
"Copy": "Kopier",
"Cut": "Klip",
"Paste": "Sæt ind",
"Basic Formatting": "Grundlæggende formatering",
"Increase quote level": "Hæv citatniveau",
"Decrease quote level": "Sænk citatniveau",
"Image / Video": "Billede / video",
"Resize larger": "Ændre til større",
"Resize smaller": "Ændre til mindre",
"Table": "Tabel",
"Select table cell": "Vælg tabelcelle",
"Extend selection one cell": "Udvid markeringen med én celle",
"Extend selection one row": "Udvid markeringen med én række",
"Navigation": "Navigation",
"Focus popup / toolbar": "Fokuser popup / værktøjslinje",
"Return focus to previous position": "Skift fokus tilbage til tidligere position",
// Embed.ly
"Embed URL": "Integrer URL",
"Paste in a URL to embed": "Indsæt en URL for at indlejre",
// Word Paste.
"The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?": "Det indsatte indhold kommer fra et Microsoft Word-dokument. Vil du beholde formateringen eller fjerne den?",
"Keep": "Behold",
"Clean": "Fjern",
"Word Paste Detected": "Indsættelse fra Word opdaget"
},
direction: "ltr"
};
}));

View File

@ -1,9 +1,35 @@
/*!
* froala_editor v2.4.2 (https://www.froala.com/wysiwyg-editor)
* froala_editor v2.9.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2017 Froala Labs
* Copyright 2014-2019 Froala Labs
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
}
else {
jQuery = require('jquery')(root);
}
}
return factory(jQuery);
};
} else {
// Browser globals
factory(window.jQuery);
}
}(function ($) {
/**
* German
*/
@ -11,7 +37,7 @@
$.FE.LANGUAGE['de'] = {
translation: {
// Place holder
"Type something": "Schreiben Sie etwas",
"Type something": "Hier tippen",
// Basic formatting
"Bold": "Fett",
@ -20,109 +46,131 @@ $.FE.LANGUAGE['de'] = {
"Strikethrough": "Durchgestrichen",
// Main buttons
"Insert": "Einf\u00fcgen",
"Delete": "L\u00f6schen",
"Insert": "Einfügen",
"Delete": "Löschen",
"Cancel": "Abbrechen",
"OK": "Ok",
"Back": "Zur\u00fcck",
"OK": "OK",
"Back": "Zurück",
"Remove": "Entfernen",
"More": "Mehr",
"Update": "Aktualisierung",
"Update": "Aktualisieren",
"Style": "Stil",
// Font
"Font Family": "Schriftart",
"Font Size": "Schriftgr\u00f6\u00dfe",
"Font Size": "Schriftgröße",
// Colors
"Colors": "Farben",
"Background": "Hintergrund",
"Text": "Text",
"HEX Color": "Hexadezimaler Farbwert",
// Paragraphs
"Paragraph Format": "Formate",
"Paragraph Format": "Formatierung",
"Normal": "Normal",
"Code": "Quelltext",
"Heading 1": "\u00dcberschrift 1",
"Heading 2": "\u00dcberschrift 2",
"Heading 3": "\u00dcberschrift 3",
"Heading 4": "\u00dcberschrift 4",
"Heading 1": "Überschrift 1",
"Heading 2": "Überschrift 2",
"Heading 3": "Überschrift 3",
"Heading 4": "Überschrift 4",
// Style
"Paragraph Style": "Absatz-Stil",
"Inline Style": "Inline-Stil",
"Paragraph Style": "Absatzformatierung",
"Inline Style": "Inlineformatierung",
// Alignment
"Align": "Ausrichtung",
"Align Left": "Linksb\u00fcndig ausrichten",
"Align Left": "Linksbündig ausrichten",
"Align Center": "Zentriert ausrichten",
"Align Right": "Rechtsb\u00fcndig ausrichten",
"Align Right": "Rechtsbündig ausrichten",
"Align Justify": "Blocksatz",
"None": "Keine",
// Lists
"Ordered List": "Geordnete Liste",
"Unordered List": "Ungeordnete Liste",
"Ordered List": "Nummerierte Liste",
"Default": "Standard",
"Lower Alpha": "Kleinbuchstaben",
"Lower Greek": "Griechisches Alphabet",
"Lower Roman": "Römische Ziffern (klein)",
"Upper Alpha": "Grossbuchstaben",
"Upper Roman": "Römische Ziffern (gross)",
"Unordered List": "Unnummerierte Liste",
"Circle": "Kreis",
"Disc": "Kreis gefüllt",
"Square": "Quadrat",
// Line height
"Line Height": "Zeilenhöhe",
"Single": "Einfach",
"Double": "Doppelt",
// Indent
"Decrease Indent": "Einzug verkleinern",
"Increase Indent": "Einzug vergr\u00f6\u00dfern",
"Increase Indent": "Einzug vergrößern",
// Links
"Insert Link": "Link einf\u00fcgen",
"Open in new tab": "In neuem Tab \u00f6ffnen",
"Open Link": "Link \u00d6ffnen",
"Insert Link": "Link einfügen",
"Open in new tab": "In neuem Tab öffnen",
"Open Link": "Link öffnen",
"Edit Link": "Link bearbeiten",
"Unlink": "Link entfernen",
"Choose Link": "Einen Link ausw\u00e4hlen",
"Choose Link": "Einen Link auswählen",
// Images
"Insert Image": "Bild einf\u00fcgen",
"Insert Image": "Bild einfügen",
"Upload Image": "Bild hochladen",
"By URL": "Von URL",
"Browse": "Ordner",
"Drop image": "Ziehen Sie ein Bild hierher",
"or click": "oder klicken Sie hier",
"Browse": "Durchsuchen",
"Drop image": "Bild hineinziehen",
"or click": "oder hier klicken",
"Manage Images": "Bilder verwalten",
"Loading": "Laden",
"Deleting": "L\u00f6schen",
"Deleting": "Löschen",
"Tags": "Tags",
"Are you sure? Image will be deleted.": "Sind Sie sicher? Das Bild wird gel\u00f6scht.",
"Are you sure? Image will be deleted.": "Wollen Sie das Bild wirklich löschen?",
"Replace": "Ersetzen",
"Uploading": "Hochladen",
"Loading image": "Das Bild wird geladen",
"Display": "Textausrichtung",
"Inline": "Mit Text in einer Zeile",
"Break Text": "Text umbrechen",
"Alternate Text": "Alternativtext",
"Change Size": "Gr\u00f6\u00dfe \u00e4ndern",
"Alternative Text": "Alternativtext",
"Change Size": "Größe ändern",
"Width": "Breite",
"Height": "H\u00f6he",
"Height": "Höhe",
"Something went wrong. Please try again.": "Etwas ist schief gelaufen. Bitte versuchen Sie es erneut.",
"Image Caption": "Bildbeschreibung",
"Advanced Edit": "Erweiterte Bearbeitung",
// Video
"Insert Video": "Video einf\u00fcgen",
"Insert Video": "Video einfügen",
"Embedded Code": "Eingebetteter Code",
"Paste in a video URL": "Fügen Sie die Video-URL ein",
"Drop video": "Video hineinziehen",
"Your browser does not support HTML5 video.": "Ihr Browser unterstützt keine HTML5-Videos.",
"Upload Video": "Video hochladen",
// Tables
"Insert Table": "Tabelle einf\u00fcgen",
"Insert Table": "Tabelle einfügen",
"Table Header": "Tabellenkopf",
"Remove Table": "Tabelle entfernen",
"Table Style": "Tabelle Stil",
"Horizontal Align": "Horizontal Ausrichtung",
"Table Style": "Tabellenformatierung",
"Horizontal Align": "Horizontale Ausrichtung",
"Row": "Zeile",
"Insert row above": "Neue Zeile davor einf\u00fcgen",
"Insert row below": "Neue Zeile danach einf\u00fcgen",
"Delete row": "Zeile l\u00f6schen",
"Insert row above": "Neue Zeile davor einfügen",
"Insert row below": "Neue Zeile danach einfügen",
"Delete row": "Zeile löschen",
"Column": "Spalte",
"Insert column before": "Neue Spalte davor einf\u00fcgen",
"Insert column after": "Neue Spalte danach einf\u00fcgen",
"Delete column": "Spalte l\u00f6schen",
"Insert column before": "Neue Spalte davor einfügen",
"Insert column after": "Neue Spalte danach einfügen",
"Delete column": "Spalte löschen",
"Cell": "Zelle",
"Merge cells": "Zelle verschmelzen",
"Merge cells": "Zellen verbinden",
"Horizontal split": "Horizontal teilen",
"Vertical split": "Vertikal teilen",
"Cell Background": "Zellenhintergrund",
"Cell Background": "Zellenfarbe",
"Vertical Align": "Vertikale Ausrichtung",
"Top": "Oben",
"Middle": "Zentriert",
@ -133,63 +181,63 @@ $.FE.LANGUAGE['de'] = {
"Cell Style": "Zellen-Stil",
// Files
"Upload File": "Datei Hochladen",
"Drop file": "Ziehen Sie eine Datei hierhin",
"Upload File": "Datei hochladen",
"Drop file": "Datei hineinziehen",
// Emoticons
"Emoticons": "Emoticons",
"Grinning face": "Grinsendes Gesicht",
"Grinning face with smiling eyes": "Grinsend Gesicht mit l\u00e4chelnden Augen",
"Face with tears of joy": "Gesicht mit Tr\u00e4nen der Freude",
"Smiling face with open mouth": "L\u00e4chelndes Gesicht mit offenem Mund",
"Smiling face with open mouth and smiling eyes": "L\u00e4chelndes Gesicht mit offenem Mund und l\u00e4chelnden Augen",
"Smiling face with open mouth and cold sweat": "L\u00e4chelndes Gesicht mit offenem Mund und kaltem Schwei\u00df",
"Smiling face with open mouth and tightly-closed eyes": "L\u00e4chelndes Gesicht mit offenem Mund und fest geschlossenen Augen",
"Smiling face with halo": "L\u00e4cheln Gesicht mit Heiligenschein",
"Smiling face with horns": "L\u00e4cheln Gesicht mit H\u00f6rnern",
"Grinning face with smiling eyes": "Grinsend Gesicht mit lächelnden Augen",
"Face with tears of joy": "Gesicht mit Tränen der Freude",
"Smiling face with open mouth": "Lächelndes Gesicht mit offenem Mund",
"Smiling face with open mouth and smiling eyes": "Lächelndes Gesicht mit offenem Mund und lächelnden Augen",
"Smiling face with open mouth and cold sweat": "Lächelndes Gesicht mit offenem Mund und kaltem Schweiß",
"Smiling face with open mouth and tightly-closed eyes": "Lächelndes Gesicht mit offenem Mund und fest geschlossenen Augen",
"Smiling face with halo": "Lächeln Gesicht mit Heiligenschein",
"Smiling face with horns": "Lächeln Gesicht mit Hörnern",
"Winking face": "Zwinkerndes Gesicht",
"Smiling face with smiling eyes": "L\u00e4chelndes Gesicht mit l\u00e4chelnden Augen",
"Face savoring delicious food": "Gesicht leckeres Essen genie\u00dfend",
"Smiling face with smiling eyes": "Lächelndes Gesicht mit lächelnden Augen",
"Face savoring delicious food": "Gesicht leckeres Essen genießend",
"Relieved face": "Erleichtertes Gesicht",
"Smiling face with heart-shaped eyes": "L\u00e4chelndes Gesicht mit herzf\u00f6rmigen Augen",
"Smiling face with sunglasses": "L\u00e4chelndes Gesicht mit Sonnenbrille",
"Smiling face with heart-shaped eyes": "Lächelndes Gesicht mit herzförmigen Augen",
"Smiling face with sunglasses": "Lächelndes Gesicht mit Sonnenbrille",
"Smirking face": "Grinsendes Gesicht",
"Neutral face": "Neutrales Gesicht",
"Expressionless face": "Ausdrucksloses Gesicht",
"Unamused face": "Genervtes Gesicht",
"Face with cold sweat": "Gesicht mit kaltem Schwei\u00df",
"Face with cold sweat": "Gesicht mit kaltem Schweiß",
"Pensive face": "Nachdenkliches Gesicht",
"Confused face": "Verwirrtes Gesicht",
"Confounded face": "Elendes Gesicht",
"Kissing face": "K\u00fcssendes Gesicht",
"Kissing face": "Küssendes Gesicht",
"Face throwing a kiss": "Gesicht wirft einen Kuss",
"Kissing face with smiling eyes": "K\u00fcssendes Gesicht mit l\u00e4chelnden Augen",
"Kissing face with closed eyes": "K\u00fcssendes Gesicht mit geschlossenen Augen",
"Kissing face with smiling eyes": "Küssendes Gesicht mit lächelnden Augen",
"Kissing face with closed eyes": "Küssendes Gesicht mit geschlossenen Augen",
"Face with stuck out tongue": "Gesicht mit herausgestreckter Zunge",
"Face with stuck out tongue and winking eye": "Gesicht mit herausgestreckter Zunge und zwinkerndem Auge",
"Face with stuck out tongue and tightly-closed eyes": "Gesicht mit herausgestreckter Zunge und fest geschlossenen Augen",
"Disappointed face": "Entt\u00e4uschtes Gesicht",
"Disappointed face": "Enttäuschtes Gesicht",
"Worried face": "Besorgtes Gesicht",
"Angry face": "Ver\u00e4rgertes Gesicht",
"Angry face": "Verärgertes Gesicht",
"Pouting face": "Schmollendes Gesicht",
"Crying face": "Weinendes Gesicht",
"Persevering face": "Ausharrendes Gesicht",
"Face with look of triumph": "Gesicht mit triumphierenden Blick",
"Disappointed but relieved face": "Entt\u00e4uschtes, aber erleichtertes Gesicht",
"Disappointed but relieved face": "Enttäuschtes, aber erleichtertes Gesicht",
"Frowning face with open mouth": "Entsetztes Gesicht mit offenem Mund",
"Anguished face": "Gequ\u00e4ltes Gesicht",
"Anguished face": "Gequältes Gesicht",
"Fearful face": "Angstvolles Gesicht",
"Weary face": "M\u00fcdes Gesicht",
"Sleepy face": "Schl\u00e4friges Gesicht",
"Tired face": "G\u00e4hnendes Gesicht",
"Weary face": "Müdes Gesicht",
"Sleepy face": "Schläfriges Gesicht",
"Tired face": "Gähnendes Gesicht",
"Grimacing face": "Grimassenschneidendes Gesicht",
"Loudly crying face": "Laut weinendes Gesicht",
"Face with open mouth": "Gesicht mit offenem Mund",
"Hushed face": "Besorgtes Gesicht mit offenem Mund",
"Face with open mouth and cold sweat": "Gesicht mit offenem Mund und kaltem Schwei\u00df",
"Face with open mouth and cold sweat": "Gesicht mit offenem Mund und kaltem Schweiß",
"Face screaming in fear": "Vor Angst schreiendes Gesicht",
"Astonished face": "Erstauntes Gesicht",
"Flushed face": "Ger\u00f6tetes Gesicht",
"Flushed face": "Gerötetes Gesicht",
"Sleeping face": "Schlafendes Gesicht",
"Dizzy face": "Schwindliges Gesicht",
"Face without mouth": "Gesicht ohne Mund",
@ -206,28 +254,83 @@ $.FE.LANGUAGE['de'] = {
"Fullscreen": "Vollbild",
// Horizontal line
"Insert Horizontal Line": "Horizontale Linie einf\u00fcgen",
"Insert Horizontal Line": "Horizontale Linie einfügen",
// Clear formatting
"Clear Formatting": "Formatierung l\u00f6schen",
"Clear Formatting": "Formatierung löschen",
// Save
"Save": "Sparen",
// Undo, redo
"Undo": "R\u00fcckg\u00e4ngig",
"Undo": "Rückgängig",
"Redo": "Wiederholen",
// Select all
"Select All": "Alles ausw\u00e4hlen",
"Select All": "Alles auswählen",
// Code view
"Code View": "Code-Ansicht",
// Quote
"Quote": "Zitieren",
"Increase": "Vergr\u00f6\u00dfern",
"Increase": "Vergrößern",
"Decrease": "Verkleinern",
// Quick Insert
"Quick Insert": "Schnelleinsatz"
"Quick Insert": "Schnell einfügen",
// Spcial Characters
"Special Characters": "Sonderzeichen",
"Latin": "Lateinisch",
"Greek": "Griechisch",
"Cyrillic": "Kyrillisch",
"Punctuation": "Satzzeichen",
"Currency": "Währung",
"Arrows": "Pfeile",
"Math": "Mathematik",
"Misc": "Sonstige",
// Print.
"Print": "Drucken",
// Spell Checker.
"Spell Checker": "Rechtschreibprüfung",
// Help
"Help": "Hilfe",
"Shortcuts": "Verknüpfungen",
"Inline Editor": "Inline-Editor",
"Show the editor": "Editor anzeigen",
"Common actions": "Häufig verwendete Befehle",
"Copy": "Kopieren",
"Cut": "Ausschneiden",
"Paste": "Einfügen",
"Basic Formatting": "Grundformatierung",
"Increase quote level": "Zitatniveau erhöhen",
"Decrease quote level": "Zitatniveau verringern",
"Image / Video": "Bild / Video",
"Resize larger": "Vergrößern",
"Resize smaller": "Verkleinern",
"Table": "Tabelle",
"Select table cell": "Tabellenzelle auswählen",
"Extend selection one cell": "Erweitere Auswahl um eine Zelle",
"Extend selection one row": "Erweitere Auswahl um eine Zeile",
"Navigation": "Navigation",
"Focus popup / toolbar": "Fokus-Popup / Symbolleiste",
"Return focus to previous position": "Fokus auf vorherige Position",
// Embed.ly
"Embed URL": "URL einbetten",
"Paste in a URL to embed": "URL einfügen um sie einzubetten",
// Word Paste.
"The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?": "Der eingefügte Inhalt kommt aus einem Microsoft Word-Dokument. Möchten Sie die Formatierungen behalten oder verwerfen?",
"Keep": "Behalten",
"Clean": "Bereinigen",
"Word Paste Detected": "Aus Word einfügen"
},
direction: "ltr"
};
}));

View File

@ -0,0 +1,342 @@
/*!
* froala_editor v2.9.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2019 Froala Labs
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
}
else {
jQuery = require('jquery')(root);
}
}
return factory(jQuery);
};
} else {
// Browser globals
factory(window.jQuery);
}
}(function ($) {
/**
* Arabic
*/
$.FE.LANGUAGE['el'] = {
translation: {
// Place holder
"Type something": "Εισάγετε κείμενο",
// Basic formatting
"Bold": "Έντονα",
"Italic": "Πλάγια",
"Underline": "Υπογραμμισμένα",
"Strikethrough": "Διαγραμμένα",
// Main buttons
"Insert": "Εισαγωγή",
"Delete": "Διαγραφή",
"Cancel": "Ακύρωση",
"OK": "OK",
"Back": "Πίσω",
"Remove": "Αφαίρεση",
"More": "Περισσότερα",
"Update": "Ενημέρωση",
"Style": "Εξατομίκευση",
// Font
"Font Family": "Γραμματοσειρά",
"Font Size": "Μέγεθος",
// Colors
"Colors": "Χρώματα",
"Background": "Φόντο",
"Text": "Κείμενο",
"HEX Color": "Χρώμα HEX",
// Paragraphs
"Paragraph Format": "Μορφή παραγράφου",
"Normal": "Κανονική",
"Code": "Κώδικας",
"Heading 1": "Επικεφαλίδα 1",
"Heading 2": "Επικεφαλίδα 2",
"Heading 3": "Επικεφαλίδα 3",
"Heading 4": "Επικεφαλίδα 4",
// Style
"Paragraph Style": "Εξατομίκευση παραγράφου",
"Gray": "Γκρι",
"Spaced": "Αραιά",
"Uppercase": "Κεφαλαία",
"Inline Style": "Ενσωματωμένος τύπος",
// Alignment
"Align": "Ευθυγράμμιση",
"Align Left": "Αριστερά",
"Align Center": "Κέντρο",
"Align Right": "Δεξιά",
"Align Justify": "Γέμισμα",
"None": "Χωρίς ευθυγράμμιση",
// Lists
"Ordered List": "Διεταγμένη λίστα",
"Default": "Προκαθορισμένο",
"Lower Alpha": "Χαμηλότερο άλφα",
"Lower Greek": "Κάτω ελληνικά",
"Lower Roman": "Χαμηλότερο ρωμαϊκό",
"Upper Alpha": "Ανώτερο άλφα",
"Upper Roman": "Ανώτερο ρωμαϊκό",
"Unordered List": "Αναδιάταχτη λίστα",
"Circle": "Κύκλος",
"Disc": "Δίσκος",
"Square": "Τετράγωνο",
// Line height
"Line Height": "Ύψος γραμμής",
"Single": "Μονόκλινο",
"Double": "Διπλό",
// Indent
"Decrease Indent": "Μείωση πλαισίου",
"Increase Indent": "Αύξηση πλαισίου",
// Links
"Insert Link": "Εισαγωγή συνδέσμου",
"Open in new tab": "Άνοιγμα σε νέα καρτέλα",
"Open Link": "Άνοιγμα συνδέσμου",
"Edit Link": "Επεξεργασία συνδέσμου",
"Unlink": "Αποσύνδεση",
"Choose Link": "Επιλογή συνδέσμου",
// Images
"Insert Image": "Εισαγωγή εικόνας",
"Upload Image": "Ανέβασμα εικόνας",
"By URL": "Από URL",
"Browse": "Περιήγηση",
"Drop image": "Σύρετε εικόνα",
"or click": "ή κάντε κλικ",
"Manage Images": "Διαχείριση εικόνων",
"Loading": "Φόρτωση",
"Deleting": "Διαγραφή",
"Tags": "Ετικέτες",
"Are you sure? Image will be deleted.": "Σίγουρα; Η εικόνα θα διαγραφεί.",
"Replace": "Αντικατάσταση",
"Uploading": "Ανέβασμα",
"Loading image": "Φόρτωση εικόνας",
"Display": "Προβολή",
"Inline": "Ενσωματωμένη",
"Break Text": "Σπάσιμο κειμένου",
"Alternative Text": "Εναλλακτικό κείμενο",
"Change Size": "Αλλαγή μεγέθους",
"Width": "Πλάτος",
"Height": "Ύψος",
"Something went wrong. Please try again.": "Κάτι πήγε στραβά. Προσπαθήστε ξανά.",
"Image Caption": "Λεζάντα εικόνας",
"Advanced Edit": "Προχωρημένη επεξεργασία",
"Rounded": "Κυκλικός",
"Bordered": "Πλαίσιο",
"Shadow": "Σκια",
// Video
"Insert Video": "Εισαγωγή βίντεο",
"Embedded Code": "Ενσωμάτωση κώδικα",
"Paste in a video URL": "Εισαγωγή URL βίντεο",
"Drop video": "Σύρετε βίντεο",
"Your browser does not support HTML5 video.": "Ο περιηγητής σας δεν υποστηρίζει βίντεο τύπου HTML5.",
"Upload Video": "Ανέβασμα βίντεο",
// Tables
"Insert Table": "Εισαγωγή πίνακα",
"Table Header": "Επικεφαλίδα πίνακα",
"Remove Table": "Αφαίρεση πίνακα",
"Table Style": "Εξατομίκευση πίνακα",
"Horizontal Align": "Οριζόντια ευθυγράμμιση",
"Row": "Σειρά",
"Insert row above": "Εισαγωγή σειράς από πάνω",
"Insert row below": "Εισαγωγή σειράς από κάτω",
"Delete row": "Διαγραφή σειράς",
"Column": "Στήλη",
"Insert column before": "Εισαγωγή στήλης πριν",
"Insert column after": "Εισαγωγή στήλης μετά",
"Delete column": "Διαγραφή στήλης",
"Cell": "Κελί",
"Merge cells": "Συγχώνευση κελιών",
"Horizontal split": "Οριζόντος διαχωρισμός",
"Vertical split": "Κατακόρυφος διαχωρισμός",
"Cell Background": "Φόντο κελιού",
"Vertical Align": "Κατακόρυφη ευθυγράμμιση",
"Top": "Κορυφή",
"Middle": "Μέση",
"Bottom": "Βάθος",
"Align Top": "Ευθυγράμμιση κορυφής",
"Align Middle": "Ευθυγράμμιση μέσης",
"Align Bottom": "Ευθυγράμμιση βάθους",
"Cell Style": "Εξατομίκευση κελιού",
// Files
"Upload File": "Ανέβασμα αρχείου",
"Drop file": "Σύρετε αρχείο",
// Emoticons
"Emoticons": "Emoticons",
"Grinning face": "Γέλιο",
"Grinning face with smiling eyes": "Γέλιο με γελαστά μάτια",
"Face with tears of joy": "Δάκρυα γέλιου (LOL)",
"Smiling face with open mouth": "Χαμόγελο με ανοιχτό στόμα",
"Smiling face with open mouth and smiling eyes": "Χαμόγελο με ανοιχτό στόμα και γελαστά μάτια",
"Smiling face with open mouth and cold sweat": "Χαμόγελο με ανοιχτό στόμα και σταγόνα ιδρώτα",
"Smiling face with open mouth and tightly-closed eyes": "Χαμόγελο με ανοιχτό στόμα και σφιχτά κλεισμένα μάτια",
"Smiling face with halo": "Χαμόγελο με φωτοστέφανο",
"Smiling face with horns": "Χαμογελαστό διαβολάκι",
"Winking face": "Κλείσιμο ματιού",
"Smiling face with smiling eyes": "Χαμόγελο με γελαστά μάτια",
"Face savoring delicious food": "Νόστιμο",
"Relieved face": "Ανακούφιση",
"Smiling face with heart-shaped eyes": "Χαμόγελο με μάτια σε σχήμα καρδιάς",
"Smiling face with sunglasses": "Χαμόγελο με γυαλιά ηλίου",
"Smirking face": "Ειρωνία",
"Neutral face": "Ουδέτερο",
"Expressionless face": "Ανέκφραστο",
"Unamused face": "Αψυχαγώγητο",
"Face with cold sweat": "Σταγόνα ιδρώτα",
"Pensive face": "Σκεπτικό",
"Confused face": "Σύγχιση",
"Confounded face": "Ακράτεια",
"Kissing face": "Φιλί",
"Face throwing a kiss": "Πάσα φιλιού",
"Kissing face with smiling eyes": "Φιλί με γελαστά μάτια",
"Kissing face with closed eyes": "Φιλί με κλειστά μάτια",
"Face with stuck out tongue": "Γλώσσα",
"Face with stuck out tongue and winking eye": "Γλώσσα με κλείσιμο ματιού",
"Face with stuck out tongue and tightly-closed eyes": "Γλώσσα με σφιχτά κλεισμένα μάτια",
"Disappointed face": "Απογοήτευση",
"Worried face": "Ανυσηχία",
"Angry face": "Θυμός",
"Pouting face": "Έξαλλο",
"Crying face": "Κλάμα θυμού",
"Persevering face": "Έτοιμο να εκραγεί",
"Face with look of triumph": "Θρίαμβος",
"Disappointed but relieved face": "Απογοήτευση με ανακούφιση",
"Frowning face with open mouth": "Απορία",
"Anguished face": "Αγωνία",
"Fearful face": "Φόβος",
"Weary face": "Κούραση",
"Sleepy face": "Εξάντληση",
"Tired face": "Γκρίνια",
"Grimacing face": "Γκριμάτσα",
"Loudly crying face": "Δυνατό κλάμα",
"Face with open mouth": "Έκπληξη",
"Hushed face": "Σιωπή",
"Face with open mouth and cold sweat": "Έκπληξη με ιδρώτα",
"Face screaming in fear": "Πανικός",
"Astonished face": "Ηλίθιο",
"Flushed face": "Ντροπαλό",
"Sleeping face": "Ύπνος",
"Dizzy face": "Ζαλάδα",
"Face without mouth": "Άφωνο",
"Face with medical mask": "Νοσηλευτική μάσκα",
// Line breaker
"Break": "Σπάσιμο",
// Math
"Subscript": "Υποκείμενο",
"Superscript": "Υπερκείμενο",
// Full screen
"Fullscreen": "Πλήρης οθόνη",
// Horizontal line
"Insert Horizontal Line": "Εισαγωγή οριζόντιας γραμμής",
// Clear formatting
"Clear Formatting": "Εκαθάριση μορφοποίησης",
// Save
"Save": "Αποθηκεύσετε",
// Undo, redo
"Undo": "Αναίρεση",
"Redo": "Επανάληψη",
// Select all
"Select All": "Επιλογή Όλων",
// Code view
"Code View": "Προβολή Κώδικα",
// Quote
"Quote": "Απόσπασμα",
"Increase": "Αύξηση",
"Decrease": "Μείωση",
// Quick Insert
"Quick Insert": "Γρήγορη εισαγωγή",
// Spcial Characters
"Special Characters": "Ειδικοί χαρακτήρες",
"Latin": "Λατινικοί",
"Greek": "Ελληνικοί",
"Cyrillic": "Κρυλλικοί",
"Punctuation": "Σημεία στήξης",
"Currency": "Συνάλλαγμα",
"Arrows": "Βέλη",
"Math": "Μαθηματικά",
"Misc": "Διάφοροι",
// Print.
"Print": "Εκτύπωση",
// Spell Checker.
"Spell Checker": "Έλεγχος ορθογραφίας",
// Help
"Help": "Βοήθεια",
"Shortcuts": "Συντομεύσεις",
"Inline Editor": "Ενσωματωμένος επεξεργαστής",
"Show the editor": "Εμφάνιση επεξεργαστή",
"Common actions": "Κοινές ενέργειες",
"Copy": "Αντιγραφή",
"Cut": "Αποκοπή",
"Paste": "Επικόλληση",
"Basic Formatting": "Βασική διαμόρφωση",
"Increase quote level": "Αύξηση επιπέδου αποσπάσματος",
"Decrease quote level": "Μείωση επιπέδου αποσπάσματος",
"Image / Video": "Εικόνα / Βίντεο",
"Resize larger": "Αύξηση μεγέθους",
"Resize smaller": "Μείωση μεγέθους",
"Table": "Πίνακας",
"Select table cell": "Επιλογή κελιού από πίνακα",
"Extend selection one cell": "Επέκταση επιλογής κατά ένα κελί",
"Extend selection one row": "Επέκταση επιλογής κατά μια σειρά",
"Navigation": "Πλοήγηση",
"Focus popup / toolbar": "Εστίαση αναδυόμενου / εργαλειοθήκης",
"Return focus to previous position": "Επιστροφή εστίασης στην προηγούμενη θέση",
// Embed.ly
"Embed URL": "Ενσωμάτωση URL",
"Paste in a URL to embed": "Εισάγετε ένα URL για ενσωμάτωση",
// Word Paste.
"The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?": "Το περιεχόμενο που επικολλήσατε προέρχεται από ένα έγγραφο του Microsoft Word. Θέλετε να διατηρήσετε το έγγραφο ή να το καταργήσετε;",
"Keep": "Διατήρηση",
"Clean": "Κατάργηση",
"Word Paste Detected": "Εντοπίστηκε επικόλληση από αρχείο Word"
},
direction: "ltr"
};
}));

View File

@ -1,9 +1,35 @@
/*!
* froala_editor v2.4.2 (https://www.froala.com/wysiwyg-editor)
* froala_editor v2.9.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2017 Froala Labs
* Copyright 2014-2019 Froala Labs
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
}
else {
jQuery = require('jquery')(root);
}
}
return factory(jQuery);
};
} else {
// Browser globals
factory(window.jQuery);
}
}(function ($) {
/**
* English spoken in Canada
*/
@ -38,6 +64,7 @@ $.FE.LANGUAGE['en_ca'] = {
"Colors": "Colours",
"Background": "Background",
"Text": "Text",
"HEX Color": "HEX Colour",
// Paragraphs
"Paragraph Format": "Paragraph Format",
@ -56,13 +83,28 @@ $.FE.LANGUAGE['en_ca'] = {
"Align": "Align",
"Align Left": "Align Left",
"Align Center": "Align Centre",
"Align Right": "Alight Right",
"Align Right": "Align Right",
"Align Justify": "Align Justify",
"None": "None",
// Lists
"Ordered List": "Ordered List",
"Default": "",
"Lower Alpha": "Lower Alpha",
"Lower Greek": "Lower Greek",
"Lower Roman": "Lower Roman",
"Upper Alpha": "Upper Alpha",
"Upper Roman": "Upper Roman",
"Unordered List": "Unordered List",
"Circle": "Circle",
"Disc": "Disc",
"Square": "Square",
// Line height
"Line Height": "Line Height",
"Single": "Single",
"Double": "Double",
// Indent
"Decrease Indent": "Decrease Indent",
@ -94,15 +136,21 @@ $.FE.LANGUAGE['en_ca'] = {
"Display": "Display",
"Inline": "Inline",
"Break Text": "Break Text",
"Alternate Text": "Alternate Text",
"Alternative Text": "Alternative Text",
"Change Size": "Change Size",
"Width": "Width",
"Height": "Height",
"Something went wrong. Please try again.": "Something went wrong. Please try again.",
"Image Caption": "Image Caption",
"Advanced Edit": "Advanced Edit",
// Video
"Insert Video": "Insert Video",
"Embedded Code": "Embedded Code",
"Paste in a video URL": "Paste in a video URL",
"Drop video": "Drop video",
"Your browser does not support HTML5 video.": "Your browser does not support HTML5 video.",
"Upload Video": "Upload Video",
// Tables
"Insert Table": "Insert Table",
@ -153,7 +201,10 @@ $.FE.LANGUAGE['en_ca'] = {
"Insert Horizontal Line": "Insert Horizontal Line",
// Clear formatting
"Clear Formatting": "Cell Formatting",
"Clear Formatting": "Clear Formatting",
// Save
"Save": "Save",
// Undo, redo
"Undo": "Undo",
@ -171,7 +222,59 @@ $.FE.LANGUAGE['en_ca'] = {
"Decrease": "Decrease",
// Quick Insert
"Quick Insert": "Quick Insert"
"Quick Insert": "Quick Insert",
// Spcial Characters
"Special Characters": "Special Characters",
"Latin": "Latin",
"Greek": "Greek",
"Cyrillic": "Cyrillic",
"Punctuation": "Punctuation",
"Currency": "Currency",
"Arrows": "Arrows",
"Math": "Math",
"Misc": "Misc",
// Print.
"Print": "Print",
// Spell Checker.
"Spell Checker": "Spell Checker",
// Help
"Help": "Help",
"Shortcuts": "Shortcuts",
"Inline Editor": "Inline Editor",
"Show the editor": "Show the editor",
"Common actions": "Common actions",
"Copy": "Copy",
"Cut": "Cut",
"Paste": "Paste",
"Basic Formatting": "Basic Formatting",
"Increase quote level": "Increase quote level",
"Decrease quote level": "Decrease quote level",
"Image / Video": "Image / Video",
"Resize larger": "Resize larger",
"Resize smaller": "Resize smaller",
"Table": "Table",
"Select table cell": "Select table cell",
"Extend selection one cell": "Extend selection one cell",
"Extend selection one row": "Extend selection one row",
"Navigation": "Navigation",
"Focus popup / toolbar": "Focus popup / toolbar",
"Return focus to previous position": "Return focus to previous position",
// Embed.ly
"Embed URL": "Embed URL",
"Paste in a URL to embed": "Paste in a URL to embed",
// Word Paste.
"The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?": "The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?",
"Keep": "Keep",
"Clean": "Clean",
"Word Paste Detected": "Word Paste Detected"
},
direction: "ltr"
};
}));

View File

@ -1,9 +1,35 @@
/*!
* froala_editor v2.4.2 (https://www.froala.com/wysiwyg-editor)
* froala_editor v2.9.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2017 Froala Labs
* Copyright 2014-2019 Froala Labs
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
}
else {
jQuery = require('jquery')(root);
}
}
return factory(jQuery);
};
} else {
// Browser globals
factory(window.jQuery);
}
}(function ($) {
/**
* English spoken in Great Britain
*/
@ -38,6 +64,7 @@ $.FE.LANGUAGE['en_gb'] = {
"Colors": "Colours",
"Background": "Background",
"Text": "Text",
"HEX Color": "HEX Colour",
// Paragraphs
"Paragraph Format": "Paragraph Format",
@ -62,7 +89,22 @@ $.FE.LANGUAGE['en_gb'] = {
// Lists
"Ordered List": "Ordered List",
"Default": "",
"Lower Alpha": "Lower Alpha",
"Lower Greek": "Lower Greek",
"Lower Roman": "Lower Roman",
"Upper Alpha": "Upper Alpha",
"Upper Roman": "Upper Roman",
"Unordered List": "Unordered List",
"Circle": "Circle",
"Disc": "Disc",
"Square": "Square",
// Line height
"Line Height": "Line Height",
"Single": "Single",
"Double": "Double",
// Indent
"Decrease Indent": "Decrease Indent",
@ -94,15 +136,21 @@ $.FE.LANGUAGE['en_gb'] = {
"Display": "Display",
"Inline": "Inline",
"Break Text": "Break Text",
"Alternate Text": "Alternate Text",
"Alternative Text": "Alternative Text",
"Change Size": "Change Size",
"Width": "Width",
"Height": "Height",
"Something went wrong. Please try again.": "Something went wrong. Please try again.",
"Image Caption": "Image Caption",
"Advanced Edit": "Advanced Edit",
// Video
"Insert Video": "Insert Video",
"Embedded Code": "Embedded Code",
"Paste in a video URL": "Paste in a video URL",
"Drop video": "Drop video",
"Your browser does not support HTML5 video.": "Your browser does not support HTML5 video.",
"Upload Video": "Upload Video",
// Tables
"Insert Table": "Insert Table",
@ -153,7 +201,10 @@ $.FE.LANGUAGE['en_gb'] = {
"Insert Horizontal Line": "Insert Horizontal Line",
// Clear formatting
"Clear Formatting": "Cell Formatting",
"Clear Formatting": "Clear Formatting",
// Save
"Save": "Save",
// Undo, redo
"Undo": "Undo",
@ -171,7 +222,59 @@ $.FE.LANGUAGE['en_gb'] = {
"Decrease": "Decrease",
// Quick Insert
"Quick Insert": "Quick Insert"
"Quick Insert": "Quick Insert",
// Spcial Characters
"Special Characters": "Special Characters",
"Latin": "Latin",
"Greek": "Greek",
"Cyrillic": "Cyrillic",
"Punctuation": "Punctuation",
"Currency": "Currency",
"Arrows": "Arrows",
"Math": "Math",
"Misc": "Misc",
// Print.
"Print": "Print",
// Spell Checker.
"Spell Checker": "Spell Checker",
// Help
"Help": "Help",
"Shortcuts": "Shortcuts",
"Inline Editor": "Inline Editor",
"Show the editor": "Show the editor",
"Common actions": "Common actions",
"Copy": "Copy",
"Cut": "Cut",
"Paste": "Paste",
"Basic Formatting": "Basic Formatting",
"Increase quote level": "Increase quote level",
"Decrease quote level": "Decrease quote level",
"Image / Video": "Image / Video",
"Resize larger": "Resize larger",
"Resize smaller": "Resize smaller",
"Table": "Table",
"Select table cell": "Select table cell",
"Extend selection one cell": "Extend selection one cell",
"Extend selection one row": "Extend selection one row",
"Navigation": "Navigation",
"Focus popup / toolbar": "Focus popup / toolbar",
"Return focus to previous position": "Return focus to previous position",
// Embed.ly
"Embed URL": "Embed URL",
"Paste in a URL to embed": "Paste in a URL to embed",
// Word Paste.
"The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?": "The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?",
"Keep": "Keep",
"Clean": "Clean",
"Word Paste Detected": "Word Paste Detected"
},
direction: "ltr"
};
}));

View File

@ -1,9 +1,35 @@
/*!
* froala_editor v2.4.2 (https://www.froala.com/wysiwyg-editor)
* froala_editor v2.9.3 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2017 Froala Labs
* Copyright 2014-2019 Froala Labs
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = function( root, jQuery ) {
if ( jQuery === undefined ) {
// require('jQuery') returns a factory that requires window to
// build a jQuery instance, we normalize how we use modules
// that require this pattern but the window provided is a noop
// if it's defined (how jquery works)
if ( typeof window !== 'undefined' ) {
jQuery = require('jquery');
}
else {
jQuery = require('jquery')(root);
}
}
return factory(jQuery);
};
} else {
// Browser globals
factory(window.jQuery);
}
}(function ($) {
/**
* Spanish
*/
@ -28,7 +54,7 @@ $.FE.LANGUAGE['es'] = {
"Remove": "Quitar",
"More": "M\u00e1s",
"Update": "Actualizaci\u00f3n",
"Style": "",
"Style": "Estilo",
// Font
"Font Family": "Familia de fuentes",
@ -38,6 +64,7 @@ $.FE.LANGUAGE['es'] = {
"Colors": "Colores",
"Background": "Fondo",
"Text": "Texto",
"HEX Color": "Color hexadecimal",
// Paragraphs
"Paragraph Format": "Formato de p\u00e1rrafo",
@ -62,7 +89,22 @@ $.FE.LANGUAGE['es'] = {
// Lists
"Ordered List": "Lista ordenada",
"Default": "Defecto",
"Lower Alpha": "Alfa inferior",
"Lower Greek": "Griego inferior",
"Lower Roman": "Baja romana",
"Upper Alpha": "Alfa superior",
"Upper Roman": "Romano superior",
"Unordered List": "Lista desordenada",
"Circle": "Circulo",
"Disc": "Dto",
"Square": "Cuadrado",
// Line height
"Line Height": "Altura de la línea",
"Single": "Soltero",
"Double": "Doble",
// Indent
"Decrease Indent": "Reducir sangr\u00eda",
@ -94,15 +136,21 @@ $.FE.LANGUAGE['es'] = {
"Display": "Mostrar",
"Inline": "En l\u00ednea",
"Break Text": "Romper texto",
"Alternate Text": "Texto alternativo",
"Alternative Text": "Texto alternativo",
"Change Size": "Cambiar tama\u00f1o",
"Width": "Ancho",
"Height": "Altura",
"Something went wrong. Please try again.": "Algo sali\u00f3 mal. Por favor, vuelva a intentarlo.",
"Image Caption": "Captura de imagen",
"Advanced Edit": "Edición avanzada",
// Video
"Insert Video": "Insertar video",
"Embedded Code": "C\u00f3digo incrustado",
"Paste in a video URL": "Pegar en una URL de video",
"Drop video": "Soltar video",
"Your browser does not support HTML5 video.": "Su navegador no es compatible con video html5.",
"Upload Video": "Subir video",
// Tables
"Insert Table": "Insertar tabla",
@ -211,6 +259,9 @@ $.FE.LANGUAGE['es'] = {
// Clear formatting
"Clear Formatting": "Quitar el formato",
// Save
"Save": "Salvar",
// Undo, redo
"Undo": "Deshacer",
"Redo": "Rehacer",
@ -227,7 +278,59 @@ $.FE.LANGUAGE['es'] = {
"Decrease": "Disminuci\u00f3n",
// Quick Insert
"Quick Insert": "Inserci\u00f3n r\u00e1pida"
"Quick Insert": "Inserci\u00f3n r\u00e1pida",
// Spcial Characters
"Special Characters": "Caracteres especiales",
"Latin": "Latín",
"Greek": "Griego",
"Cyrillic": "Cirílico",
"Punctuation": "Puntuación",
"Currency": "Moneda",
"Arrows": "Flechas",
"Math": "Mates",
"Misc": "Misc",
// Print.
"Print": "Impresión",
// Spell Checker.
"Spell Checker": "Corrector ortográfico",
// Help
"Help": "Ayuda",
"Shortcuts": "Atajos",
"Inline Editor": "Editor en línea",
"Show the editor": "Mostrar al editor",
"Common actions": "Acciones comunes",
"Copy": "Dupdo",
"Cut": "Cortar",
"Paste": "Pegar",
"Basic Formatting": "Formato básico",
"Increase quote level": "Aumentar el nivel de cotización",
"Decrease quote level": "Disminuir el nivel de cotización",
"Image / Video": "Imagen / video",
"Resize larger": "Redimensionar más grande",
"Resize smaller": "Redimensionar más pequeño",
"Table": "Mesa",
"Select table cell": "Celda de tabla select",
"Extend selection one cell": "Ampliar la selección una celda",
"Extend selection one row": "Ampliar la selección una fila",
"Navigation": "Navegación",
"Focus popup / toolbar": "Focus popup / toolbar",
"Return focus to previous position": "Volver al foco a la posición anterior",
// Embed.ly
"Embed URL": "URL de inserción",
"Paste in a URL to embed": "Pegar en una url para incrustar",
// Word Paste.
"The pasted content is coming from a Microsoft Word document. Do you want to keep the format or clean it up?": "El contenido pegado viene de un documento de Microsoft Word. ¿Quieres mantener el formato o limpiarlo?",
"Keep": "Guardar",
"Clean": "Limpiar",
"Word Paste Detected": "Palabra detectada"
},
direction: "ltr"
};
}));

Some files were not shown because too many files have changed in this diff Show More