diff --git a/assets/css/src/newsletter_editor/common.styl b/assets/css/src/newsletter_editor/common.styl
index 3a1f7e856f..18d5e3fd88 100644
--- a/assets/css/src/newsletter_editor/common.styl
+++ b/assets/css/src/newsletter_editor/common.styl
@@ -23,196 +23,194 @@ $range-border-radius = 3px
$range-thumb-hover-background-color = $primary-active-color
a
- color: $link-color
- text-decoration: none
+ color: $link-color
+ text-decoration: none
.mailpoet_hidden
- display: none !important
+ display: none !important
input.mailpoet_color
- width: 5em
+ width: 5em
select.mailpoet_font-family
- width: 8em
+ width: 8em
select.mailpoet_font-size
- width: 5em
+ width: 5em
.mailpoet_input, .mailpoet_select
- border-radius(1px)
- box-shadow(none !important)
- appearance: none
+ border-radius(1px)
+ box-shadow(none !important)
+ appearance: none
- padding: $form-control-padding = 3px
- line-height: 28px - $form-control-padding*2
+ padding: $form-control-padding = 3px
+ line-height: 28px - $form-control-padding*2
.mailpoet_input
- width: 283px
- border: 1px solid $select-border-color
+ width: 283px
+ border: 1px solid $select-border-color
.mailpoet_input_small
- width: 48px
+ width: 48px
.mailpoet_input_medium
- width: 150px
+ width: 150px
.mailpoet_input_full
- width: 100%
- box-sizing: border-box
+ width: 100%
+ box-sizing: border-box
.mailpoet_range
- width: 283px
+ width: 283px
+ -webkit-appearance: none
+ padding: 0
+ vertical-align: middle
+
+ &:focus
+ outline: none
+ &::-webkit-slider-runnable-track
+ width: 100%
+ height: $range-track-height
+ cursor: pointer
+ animate: 0.2s
+ background: $range-track-background-color
+ border-radius($range-border-radius)
+ border: 1px solid $range-track-border-color
+ &::-webkit-slider-thumb
+ border: 1px solid $range-thumb-border-color
+ height: $range-thumb-height
+ width: $range-thumb-width
+ border-radius($range-border-radius)
+ background: $range-thumb-background-color
+ cursor: pointer
-webkit-appearance: none
- padding: 0
- vertical-align: middle
-
- &:focus
- outline: none
- &::-webkit-slider-runnable-track
- width: 100%
- height: $range-track-height
- cursor: pointer
- animate: 0.2s
- background: $range-track-background-color
- border-radius($range-border-radius)
- border: 1px solid $range-track-border-color
- &::-webkit-slider-thumb
- border: 1px solid $range-thumb-border-color
- height: $range-thumb-height
- width: $range-thumb-width
- border-radius($range-border-radius)
- background: $range-thumb-background-color
- cursor: pointer
- -webkit-appearance: none
- margin-top: (-1 * $range-thumb-height / 3)
- &:hover::-webkit-slider-thumb
- background: $range-thumb-hover-background-color
- &::-moz-range-track
- width: 100%
- height: $range-track-height
- cursor: pointer
- animate: 0.2s
- background: $range-track-background-color
- border-radius($range-border-radius)
- border: 1px solid $range-track-border-color
- &::-moz-range-thumb
- border: 1px solid $range-thumb-border-color
- height: $range-thumb-height
- width: $range-thumb-width
- border-radius($range-border-radius)
- background: $range-thumb-background-color
- cursor: pointer
- &:hover::-moz-range-thumb
- background: $range-thumb-hover-background-color
- &::-ms-fill-lower
- border: 1px solid $range-track-border-color
- background: $range-track-background-color
- &::-ms-fill-upper
- border: 1px solid $range-track-border-color
- background: $range-track-background-color
- &::-ms-track
- width: 100%
- height: $range-track-height
- cursor: pointer
- animate: 0.2s
- background: transparent
- border-color: transparent
- border-width: ($range-track-height * 2) 0
- color: transparent
- &::-ms-thumb
- border: 1px solid $range-thumb-border-color
- height: $range-thumb-height
- width: $range-thumb-width
- border-radius($range-border-radius)
- background: $range-thumb-background-color
- cursor: pointer
- &:hover::-ms-thumb
- background: $range-thumb-hover-background-color
- &:focus::-ms-fill-lower
- border: 1px solid $range-track-border-color
- background: $range-track-background-color
- &:focus::-ms-fill-upper
- border: 1px solid $range-track-border-color
- background: $range-track-background-color
-
+ margin-top: (-1 * $range-thumb-height / 3)
+ &:hover::-webkit-slider-thumb
+ background: $range-thumb-hover-background-color
+ &::-moz-range-track
+ width: 100%
+ height: $range-track-height
+ cursor: pointer
+ animate: 0.2s
+ background: $range-track-background-color
+ border-radius($range-border-radius)
+ border: 1px solid $range-track-border-color
+ &::-moz-range-thumb
+ border: 1px solid $range-thumb-border-color
+ height: $range-thumb-height
+ width: $range-thumb-width
+ border-radius($range-border-radius)
+ background: $range-thumb-background-color
+ cursor: pointer
+ &:hover::-moz-range-thumb
+ background: $range-thumb-hover-background-color
+ &::-ms-fill-lower
+ border: 1px solid $range-track-border-color
+ background: $range-track-background-color
+ &::-ms-fill-upper
+ border: 1px solid $range-track-border-color
+ background: $range-track-background-color
+ &::-ms-track
+ width: 100%
+ height: $range-track-height
+ cursor: pointer
+ animate: 0.2s
+ background: transparent
+ border-color: transparent
+ border-width: ($range-track-height * 2) 0
+ color: transparent
+ &::-ms-thumb
+ border: 1px solid $range-thumb-border-color
+ height: $range-thumb-height
+ width: $range-thumb-width
+ border-radius($range-border-radius)
+ background: $range-thumb-background-color
+ cursor: pointer
+ &:hover::-ms-thumb
+ background: $range-thumb-hover-background-color
+ &:focus::-ms-fill-lower
+ border: 1px solid $range-track-border-color
+ background: $range-track-background-color
+ &:focus::-ms-fill-upper
+ border: 1px solid $range-track-border-color
+ background: $range-track-background-color
.mailpoet_range_small
- width: 100px
+ width: 100px
.mailpoet_range_medium
- width: 180px
+ width: 180px
.mailpoet_select
- border-color: $select-border-color
- color: $select-text-color
- margin: 0
+ border-color: $select-border-color
+ color: $select-text-color
+ margin: 0
.mailpoet_select_large
- width: 139px
+ width: 139px
.mailpoet_select_medium
- width: 103px
+ width: 103px
.mailpoet_select_small
- width: 68px
+ width: 68px
.mailpoet_select_half_width
- width: 50%
+ width: 50%
#mailpoet_editor_content ol
#mailpoet_editor_content ul
- list-style-position: inside
- margin-left: 0
+ list-style-position: inside
+ margin-left: 0
#mailpoet_editor_content ul
- list-style-type: disc
+ list-style-type: disc
.mailpoet_button
- margin: 0
- border: 1px solid $button-default-border-color
- background-color: $button-default-background-color
- padding: 6px 20px
- color: $button-default-text-color
- border-radius(3px)
- line-height: normal
-
- vertical-align: top
+ margin: 0
+ border: 1px solid $button-default-border-color
+ background-color: $button-default-background-color
+ padding: 6px 20px
+ color: $button-default-text-color
+ border-radius(3px)
+ line-height: normal
+ vertical-align: top
.mailpoet_button_full
- width: 100%
- box-sizing: border-box
+ width: 100%
+ box-sizing: border-box
.mailpoet_button_primary
- border-color: $button-primary-border-color
- background-color: $button-primary-background-color
- color: $button-primary-text-color
+ border-color: $button-primary-border-color
+ background-color: $button-primary-background-color
+ color: $button-primary-text-color
- &:hover
- background-color: $button-primary-hover-background-color
+ &:hover
+ background-color: $button-primary-hover-background-color
.mailpoet_button_group
- display: inline
+ display: inline
- .mailpoet_button:first-child
- margin-right: 0
- padding: 6px 12px 6px
- border-top-right-radius: 0
- border-bottom-right-radius: 0
+ .mailpoet_button:first-child
+ margin-right: 0
+ padding: 6px 12px 6px
+ border-top-right-radius: 0
+ border-bottom-right-radius: 0
- .mailpoet_button:last-child
- margin-left: 0
- padding-left: 10px
- padding-right: 10px
- border-left: 0
- border-top-left-radius: 0
- border-bottom-left-radius: 0
+ .mailpoet_button:last-child
+ margin-left: 0
+ padding-left: 10px
+ padding-right: 10px
+ border-left: 0
+ border-top-left-radius: 0
+ border-bottom-left-radius: 0
.mailpoet_text_content p
- margin: 0
+ margin: 0
.mailpoet_separator
- margin: 17px 20px
+ margin: 17px 20px
.mailpoet_option_offset_left_small
- margin-left: 10px
+ margin-left: 10px
input.mailpoet_option_offset_left_small
- margin-left: 10px !important
+ margin-left: 10px !important
diff --git a/assets/css/src/newsletter_editor/components/blockTools.styl b/assets/css/src/newsletter_editor/components/blockTools.styl
index ff07a4a873..897dadd0a7 100644
--- a/assets/css/src/newsletter_editor/components/blockTools.styl
+++ b/assets/css/src/newsletter_editor/components/blockTools.styl
@@ -10,114 +10,114 @@ $master-column-tool-width = 24px
$layer-selector-width = 30px
.mailpoet_tools
+ position: absolute
+ top: 0
+ right: 0
+ display: none
+ z-index: 20
+ padding: 2px
+ text-align: right
+
+ a
+ vertical-align: top
+
+ .mailpoet_container_horizontal + &
+ left: 100%
+ padding-left: 5px
+
+ .mailpoet_tool
+ width: $master-column-tool-width
+ height: $master-column-tool-width
+
+ .mailpoet_tool_icon
+ width: $master-column-tool-width
+ height: $master-column-tool-width
+
+ .mailpoet_delete_block_activated
+ width: auto
+ height: auto
+
+.mailpoet_tool
+ display: inline-block
+ width: $tool-width
+ height: $tool-width
+ padding: 2px
+
+ &:hover
+ filter-shadow(1px, 2px, 0px, $tool-active-color)
+
+ .mailpoet_tool_icon
+ fill: $tool-inactive-color
+ width: $tool-width
+ height: $tool-width
+
+ .mailpoet_tool_icon_foreground
+ fill: $tool-inactive-secondary-color
+
+ &:hover
+ fill: $tool-hover-color
+
+ .mailpoet_tool_icon_foreground
+ fill: $tool-hover-secondary-color
+
+ &:active
+ fill: $primary-active-color
+
+ .mailpoet_tool_icon_foreground
+ fill: $tool-active-secondary-color
+
+ .mailpoet_delete_block_confirmation
position: absolute
top: 0
right: 0
- display: none
- z-index: 20
- padding: 2px
- text-align: right
-
- a
- vertical-align: top
-
- .mailpoet_container_horizontal + &
- left: 100%
- padding-left: 5px
-
- .mailpoet_tool
- width: $master-column-tool-width
- height: $master-column-tool-width
-
- .mailpoet_tool_icon
- width: $master-column-tool-width
- height: $master-column-tool-width
-
- .mailpoet_delete_block_activated
- width: auto
- height: auto
-
-.mailpoet_tool
- display: inline-block
- width: $tool-width
- height: $tool-width
- padding: 2px
-
- &:hover
- filter-shadow(1px, 2px, 0px, $tool-active-color)
-
- .mailpoet_tool_icon
- fill: $tool-inactive-color
- width: $tool-width
- height: $tool-width
-
- .mailpoet_tool_icon_foreground
- fill: $tool-inactive-secondary-color
-
- &:hover
- fill: $tool-hover-color
-
- .mailpoet_tool_icon_foreground
- fill: $tool-hover-secondary-color
-
- &:active
- fill: $primary-active-color
-
- .mailpoet_tool_icon_foreground
- fill: $tool-active-secondary-color
-
- .mailpoet_delete_block_confirmation
- position: absolute
- top: 0
- right: 0
- width: 200px
+ width: 200px
.mailpoet_delete_block
- display: inline-block
- padding: 2px
- vertical-align: top
+ display: inline-block
+ padding: 2px
+ vertical-align: top
- .mailpoet_tool
- padding: 0
+ .mailpoet_tool
+ padding: 0
- .mailpoet_delete_block_confirm,
- .mailpoet_delete_block_cancel
- display: none
+ .mailpoet_delete_block_confirm,
+ .mailpoet_delete_block_cancel
+ display: none
.mailpoet_delete_block_activated
- width: auto
- border-radius(3px)
- background-color: $warning-background-color
- padding: 3px 5px
- line-height: 1.2em
- height: auto
+ width: auto
+ border-radius(3px)
+ background-color: $warning-background-color
+ padding: 3px 5px
+ line-height: 1.2em
+ height: auto
- .mailpoet_delete_block_activate
- display: none
+ .mailpoet_delete_block_activate
+ display: none
- .mailpoet_delete_block_confirm,
- .mailpoet_delete_block_cancel
- display: inline-block
+ .mailpoet_delete_block_confirm,
+ .mailpoet_delete_block_cancel
+ display: inline-block
.mailpoet_delete_block_confirm
- color: $warning-text-color
+ color: $warning-text-color
- &:hover
- color: $warning-text-color
- text-decoration: underline
+ &:hover
+ color: $warning-text-color
+ text-decoration: underline
.mailpoet_delete_block_cancel
- color: $warning-alternate-text-color
+ color: $warning-alternate-text-color
- &:hover
- color: $warning-alternate-text-color
- text-decoration: underline
+ &:hover
+ color: $warning-alternate-text-color
+ text-decoration: underline
.mailpoet_newsletter_layer_selector
- &.mailpoet_container_layer_active
- .mailpoet_tool_icon
- fill: $primary-active-color
- z-index: 100001 !important
+ &.mailpoet_container_layer_active
+ .mailpoet_tool_icon
+ fill: $primary-active-color
+ z-index: 100001 !important
- .mailpoet_tool_icon_foreground
- fill: $white-color
+ .mailpoet_tool_icon_foreground
+ fill: $white-color
diff --git a/assets/css/src/newsletter_editor/components/dragAndDrop.styl b/assets/css/src/newsletter_editor/components/dragAndDrop.styl
index 9e494671c1..c55c234de6 100644
--- a/assets/css/src/newsletter_editor/components/dragAndDrop.styl
+++ b/assets/css/src/newsletter_editor/components/dragAndDrop.styl
@@ -6,58 +6,58 @@ $marker-z-index = 1
$draggable-widget-z-index = 2
.mailpoet_drop_marker
- background-color: $primary-active-color
+ background-color: $primary-active-color
+ position: absolute
+ min-width: $marker-width
+ min-height: $marker-width
+ z-index: $marker-z-index
+
+ box-shadow(0px 0px 1px 0px $primary-active-color)
+
+ &::before, &::after
position: absolute
- min-width: $marker-width
- min-height: $marker-width
- z-index: $marker-z-index
-
- box-shadow(0px 0px 1px 0px $primary-active-color)
-
- &::before, &::after
- position: absolute
- margin-top: -18px
- font: 400 40px/1 dashicons
- color: $primary-active-color
- &::before
- left: -25px
- content: "\f139"
- &::after
- right: -23px
- content: "\f141";
+ margin-top: -18px
+ font: 400 40px/1 dashicons
+ color: $primary-active-color
+ &::before
+ left: -25px
+ content: "\f139"
+ &::after
+ right: -23px
+ content: "\f141";
// Offset middle markers slightly above, so that the middle of the marker is
// right on the boundary between two adjacent content blocks
.mailpoet_drop_marker.mailpoet_drop_marker_middle
.mailpoet_drop_marker.mailpoet_drop_marker_first.mailpoet_drop_marker_after
.mailpoet_drop_marker.mailpoet_drop_marker_last.mailpoet_drop_marker_before
- margin-top: -1 * ($marker-width / 2)
+ margin-top: -1 * ($marker-width / 2)
// Offset the last marker up, so that the bottom of it matches the bottom of the
// container
.mailpoet_drop_marker.mailpoet_drop_marker_last.mailpoet_drop_marker_after
- margin-top: -1 * $marker-width
+ margin-top: -1 * $marker-width
#mailpoet_editor .mailpoet_droppable_active
- z-index: 21000
+ z-index: 21000
.mailpoet_block.mailpoet_droppable_active
- border: 1px dashed $drop-active-color !important
- width: $newsletter-width
+ border: 1px dashed $drop-active-color !important
+ width: $newsletter-width
- .mailpoet_tools
- display: none !important
+ .mailpoet_tools
+ display: none !important
.mailpoet_widget.mailpoet_droppable_active
+ padding: 0
+ margin: 0
+ z-index: $draggable-widget-z-index
+
+ .mailpoet_widget_icon
padding: 0
margin: 0
- z-index: $draggable-widget-z-index
-
- .mailpoet_widget_icon
- padding: 0
- margin: 0
.mailpoet_drop_active > .mailpoet_container > div > .mailpoet_container_empty
- background-color: $primary-active-color
- box-shadow(inset 1px 2px 1px $primary-inset-shadow-color)
- color: $white-color
+ background-color: $primary-active-color
+ box-shadow(inset 1px 2px 1px $primary-inset-shadow-color)
+ color: $white-color
diff --git a/assets/css/src/newsletter_editor/components/forms.styl b/assets/css/src/newsletter_editor/components/forms.styl
index 919bd05c6b..fa2cdc175e 100644
--- a/assets/css/src/newsletter_editor/components/forms.styl
+++ b/assets/css/src/newsletter_editor/components/forms.styl
@@ -1,39 +1,39 @@
.mailpoet_form_field
- margin-top: 15px
- margin-bottom: 15px
+ margin-top: 15px
+ margin-bottom: 15px
.mailpoet_form_field_title
- clear: both
- font-size: 1.1em
- margin-bottom: 5px
+ clear: both
+ font-size: 1.1em
+ margin-bottom: 5px
.mailpoet_form_field_title_small
- width: 120px
+ width: 120px
.mailpoet_form_field_title_inline
- display: inline-block
- margin-bottom: 0
- margin-top: 6px
+ display: inline-block
+ margin-bottom: 0
+ margin-top: 6px
.mailpoet_form_field_optional
- font-size: 0.8em
- color: $primary-inactive-color
+ font-size: 0.8em
+ color: $primary-inactive-color
.mailpoet_form_field_radio_option,
.mailpoet_form_field_checkbox_option
- display: inline-block
- vertical-align: top
- margin-right: 5px
- line-height: 30px
+ display: inline-block
+ vertical-align: top
+ margin-right: 5px
+ line-height: 30px
- &:last-child
- margin-right: 0
+ &:last-child
+ margin-right: 0
.mailpoet_form_field_input_option
- display: inline-block
+ display: inline-block
- input[type=checkbox]
- vertical-align:top
+ input[type=checkbox]
+ vertical-align:top
- input[type=text]
- vertical-align: middle
+ input[type=text]
+ vertical-align: middle
diff --git a/assets/css/src/newsletter_editor/components/heading.styl b/assets/css/src/newsletter_editor/components/heading.styl
index d1147a3b96..63fee97236 100644
--- a/assets/css/src/newsletter_editor/components/heading.styl
+++ b/assets/css/src/newsletter_editor/components/heading.styl
@@ -1,20 +1,20 @@
.mailpoet_heading_form_field
- margin-top: 5px
- margin-bottom: 5px
+ margin-top: 5px
+ margin-bottom: 5px
.mailpoet_input_title,
.mailpoet_input_preheader
- width: 400px
- padding: 3px
- line-height: normal
+ width: 400px
+ padding: 3px
+ line-height: normal
.mailpoet_input_title
- font-size: 23px
+ font-size: 23px
.mailpoet_breadcrumbs
- float: right
- clear: both
- margin-bottom: 13px
- margin-right: 17px
- font-size: 0.9em
- text-transform: uppercase
+ float: right
+ clear: both
+ margin-bottom: 13px
+ margin-right: 17px
+ font-size: 0.9em
+ text-transform: uppercase
diff --git a/assets/css/src/newsletter_editor/components/layers.styl b/assets/css/src/newsletter_editor/components/layers.styl
index a156a86ce7..51eeaa1a92 100644
--- a/assets/css/src/newsletter_editor/components/layers.styl
+++ b/assets/css/src/newsletter_editor/components/layers.styl
@@ -1,32 +1,32 @@
.mailpoet_container_layer_active
- .mailpoet_block
- pointer-events: none
- opacity: 0.4
+ .mailpoet_block
+ pointer-events: none
+ opacity: 0.4
- .mailpoet_container_block
- pointer-events: auto
- opacity: 1
+ .mailpoet_container_block
+ pointer-events: auto
+ opacity: 1
- .mailpoet_container_block > .mailpoet_tools
- display: block !important
+ .mailpoet_container_block > .mailpoet_tools
+ display: block !important
- & > .mailpoet_tools
- z-index: 100001 !important;
+ & > .mailpoet_tools
+ z-index: 100001 !important;
.mailpoet_layer_overlay
- height: 100%
- left: 0
- overflow-y: auto
- overflow-x: hidden
- position: fixed
- top: 0
- width: 100%
- z-index: 100000
- background-color: rgba(0, 0, 0, 0.6)
- margin: 0 !important
+ height: 100%
+ left: 0
+ overflow-y: auto
+ overflow-x: hidden
+ position: fixed
+ top: 0
+ width: 100%
+ z-index: 100000
+ background-color: rgba(0, 0, 0, 0.6)
+ margin: 0 !important
.mailpoet_layer_highlight
- pointer-events:none;
- background-color: #f1f1f1;
- position: relative;
- z-index: 100001 !important;
+ pointer-events:none;
+ background-color: #f1f1f1;
+ position: relative;
+ z-index: 100001 !important;
diff --git a/assets/css/src/newsletter_editor/components/resize.styl b/assets/css/src/newsletter_editor/components/resize.styl
index 8147c18d73..4e893aa1eb 100644
--- a/assets/css/src/newsletter_editor/components/resize.styl
+++ b/assets/css/src/newsletter_editor/components/resize.styl
@@ -6,45 +6,45 @@ $resize-handle-width = 30px
$resize-handle-z-index = 2
.mailpoet_resize_handle_container
- position: absolute
- bottom: 0
- text-align: center
- width: 100%
+ position: absolute
+ bottom: 0
+ text-align: center
+ width: 100%
.mailpoet_resize_handle
- padding: 6px 15px 10px 6px
- position: relative
- top: 5px
- background: $resize-handle-background-color
- border-radius(3px)
- display: inline-block
- width: $resize-handle-width
- cursor: ns-resize
- z-index: $resize-handle-z-index
+ padding: 6px 15px 10px 6px
+ position: relative
+ top: 5px
+ background: $resize-handle-background-color
+ border-radius(3px)
+ display: inline-block
+ width: $resize-handle-width
+ cursor: ns-resize
+ z-index: $resize-handle-z-index
- .mailpoet_resize_handle_text,
- .mailpoet_resize_handle_icon
- pointer-events: none
+ .mailpoet_resize_handle_text,
+ .mailpoet_resize_handle_icon
+ pointer-events: none
.mailpoet_resize_handle_text
- line-height: 1.5em
- font-size: 11px
- font-weight: bold
- color: $resize-handle-font-color
- text-align: center
+ line-height: 1.5em
+ font-size: 11px
+ font-weight: bold
+ color: $resize-handle-font-color
+ text-align: center
.mailpoet_resize_handle_icon
- position: absolute
- top: 9px
- right: 1px
+ position: absolute
+ top: 9px
+ right: 1px
- & > svg
- width: 15px
- height: 15px
- fill: $resize-handle-font-color
+ & > svg
+ width: 15px
+ height: 15px
+ fill: $resize-handle-font-color
.mailpoet_block.mailpoet_resize_active > .mailpoet_block_highlight
- border: 1px dashed $resize-active-color
+ border: 1px dashed $resize-active-color
- .mailpoet_resize_handle
- display: inline-block
+ .mailpoet_resize_handle
+ display: inline-block
diff --git a/assets/css/src/newsletter_editor/components/save.styl b/assets/css/src/newsletter_editor/components/save.styl
index 67a51e2882..c82914da54 100644
--- a/assets/css/src/newsletter_editor/components/save.styl
+++ b/assets/css/src/newsletter_editor/components/save.styl
@@ -1,68 +1,67 @@
#mailpoet_editor_bottom
- margin-top: 39px
- margin-left: 29px
+ margin-top: 39px
+ margin-left: 29px
.mailpoet_save_options
- border-radius(3px)
+ border-radius(3px)
- float: left
- overflow: hidden
- margin: 5px 0 0 0
- clear: both
- vertical-align: top
+ float: left
+ overflow: hidden
+ margin: 5px 0 0 0
+ clear: both
+ vertical-align: top
- background: $white-color
- border: 1px solid $content-border-color
+ background: $white-color
+ border: 1px solid $content-border-color
.mailpoet_save_option
- margin: 0
+ margin: 0
- & > a
- display: block
- padding-left: 20px
- padding-right: 20px
- line-height: 2em
+ & > a
+ display: block
+ padding-left: 20px
+ padding-right: 20px
+ line-height: 2em
.mailpoet_save_option:hover
- background-color: $primary-active-background-color
+ background-color: $primary-active-background-color
+ color: $white-color
+
+ & > a
color: $white-color
- & > a
- color: $white-color
-
.mailpoet_save_show_options
- padding: 6px 3px 4px
+ padding: 6px 3px 4px
- &.mailpoet_save_show_options_active
- .mailpoet_save_show_options_icon::before
- content: '\f142'
+ &.mailpoet_save_show_options_active
+ .mailpoet_save_show_options_icon::before
+ content: '\f142'
.mailpoet_save_show_options_icon
- width: auto
- height: auto
- line-height: auto
-
- &::before
- content: '\f140'
+ width: auto
+ height: auto
+ line-height: auto
+ &::before
+ content: '\f140'
.mailpoet_save_as_template_container
- border-radius(3px)
- float: left
- clear: both
+ border-radius(3px)
+ float: left
+ clear: both
- margin-top: 5px
- padding: 0 10px
- background-color: $white-color
- border: 1px solid $structure-border-color
+ margin-top: 5px
+ padding: 0 10px
+ background-color: $white-color
+ border: 1px solid $structure-border-color
.mailpoet_save_as_template_title
- font-size: 1.1em
+ font-size: 1.1em
.mailpoet_editor_last_saved
- color: $primary-inactive-color
- font-size: 0.9em
- display: inline
+ color: $primary-inactive-color
+ font-size: 0.9em
+ display: inline
.mailpoet_save_error
- color: $error-text-color
+ color: $error-text-color
diff --git a/assets/css/src/newsletter_editor/components/sidebar.styl b/assets/css/src/newsletter_editor/components/sidebar.styl
index 12c5ba55c1..392cb7ccbf 100644
--- a/assets/css/src/newsletter_editor/components/sidebar.styl
+++ b/assets/css/src/newsletter_editor/components/sidebar.styl
@@ -14,118 +14,118 @@ $widget-icon-hover-color = $primary-active-color
$widget-icon-width = 30px
#mailpoet_editor_sidebar
- border-left: $content-border-color
- border-bottom: $content-border-color
- color: $sidebar-text-color
+ border-left: $content-border-color
+ border-bottom: $content-border-color
+ color: $sidebar-text-color
- .mailpoet_sidebar_region
- margin-bottom: 0
- border-left: 1px solid $content-border-color
- border-bottom: 1px solid $content-border-color
- border-top: 0
- border-right: 0
+ .mailpoet_sidebar_region
+ margin-bottom: 0
+ border-left: 1px solid $content-border-color
+ border-bottom: 1px solid $content-border-color
+ border-top: 0
+ border-right: 0
- &.closed .mailpoet_region_content
- max-height: 0px
- overflow: hidden
- margin-top: 0
+ &.closed .mailpoet_region_content
+ max-height: 0px
+ overflow: hidden
+ margin-top: 0
- .mailpoet_region_content
- max-height: 2000px
- transition: max-height 0.2s ease
- padding: 0 20px
- margin-top: 12px
+ .mailpoet_region_content
+ max-height: 2000px
+ transition: max-height 0.2s ease
+ padding: 0 20px
+ margin-top: 12px
- &, .postbox
- background-color: $sidebar-background-color
+ &, .postbox
+ background-color: $sidebar-background-color
- .postbox
- padding-bottom: 20px
+ .postbox
+ padding-bottom: 20px
- &.closed
- padding-bottom: 0
+ &.closed
+ padding-bottom: 0
- &.closed h3
- color: $sidebar-inactive-heading-color
- cursor: pointer
+ &.closed h3
+ color: $sidebar-inactive-heading-color
+ cursor: pointer
- h3
- &:hover h3
- margin: 0
- padding: 17px 20px
- text-transform: uppercase
- color: $sidebar-active-heading-color
+ h3
+ &:hover h3
+ margin: 0
+ padding: 17px 20px
+ text-transform: uppercase
+ color: $sidebar-active-heading-color
- h3
- .handlediv
- cursor: auto
- border: 0
+ h3
+ .handlediv
+ cursor: auto
+ border: 0
- .handlediv::before
- top: 18px
- right: 18px
- font: 400 20px/1 dashicons
- speak: none
- display: inline-block
- position: relative
- -webkit-font-smoothing: antialiased
- -moz-osx-font-smoothing: grayscale
- text-decoration: none!important
- content: '\f142'
- color: $sidebar-active-heading-color
+ .handlediv::before
+ top: 18px
+ right: 18px
+ font: 400 20px/1 dashicons
+ speak: none
+ display: inline-block
+ position: relative
+ -webkit-font-smoothing: antialiased
+ -moz-osx-font-smoothing: grayscale
+ text-decoration: none!important
+ content: '\f142'
+ color: $sidebar-active-heading-color
- &.closed .handlediv::before
- content: '\f140'
- color: $sidebar-inactive-heading-color
+ &.closed .handlediv::before
+ content: '\f140'
+ color: $sidebar-inactive-heading-color
- &.closed:hover .handlediv::before
- color: $sidebar-active-heading-color
+ &.closed:hover .handlediv::before
+ color: $sidebar-active-heading-color
.mailpoet_widget
- display: inline-block
- width: $widget-width
- text-align: center
- float: left
- padding: 0 13px 15px 13px
+ display: inline-block
+ width: $widget-width
+ text-align: center
+ float: left
+ padding: 0 13px 15px 13px
- // Place 3 widgets per row
- &:nth-child(3n+1)
- clear: left
+ // Place 3 widgets per row
+ &:nth-child(3n+1)
+ clear: left
+
+ .mailpoet_widget_icon
+ width: $widget-width
+ height: $widget-width
+ background-color: $widget-background-color
+ border-radius(3px)
+ box-shadow(1px 2px $widget-shadow-color)
+ color: $widget-icon-color
+ fill: $widget-icon-color
+ text-align: center
+ line-height: $widget-width
+ box-sizing: border-box
+ margin-bottom: 9px
+
+ /* Vertically align widget icon glyphs */
+ & > *
+ vertical-align: middle
+ width: $widget-icon-width
+ height: $widget-icon-width
+ font-size: $widget-icon-width
+
+ &:hover
+ color: $widget-icon-hover-color
+ fill: $widget-icon-hover-color
+ border: 1px solid $widget-icon-hover-color
+
+ &.mailpoet_droppable_active
+ color: $widget-icon-hover-color
+ fill: $widget-icon-hover-color
.mailpoet_widget_icon
- width: $widget-width
- height: $widget-width
- background-color: $widget-background-color
- border-radius(3px)
- box-shadow(1px 2px $widget-shadow-color)
- color: $widget-icon-color
- fill: $widget-icon-color
- text-align: center
- line-height: $widget-width
- box-sizing: border-box
- margin-bottom: 9px
+ border: 1px solid $widget-icon-hover-color
+ color: $widget-icon-hover-color
+ fill: $widget-icon-hover-color
+ box-shadow(none)
- /* Vertically align widget icon glyphs */
- & > *
- vertical-align: middle
- width: $widget-icon-width
- height: $widget-icon-width
- font-size: $widget-icon-width
-
- &:hover
- color: $widget-icon-hover-color
- fill: $widget-icon-hover-color
- border: 1px solid $widget-icon-hover-color
-
- &.mailpoet_droppable_active
- color: $widget-icon-hover-color
- fill: $widget-icon-hover-color
-
- .mailpoet_widget_icon
- border: 1px solid $widget-icon-hover-color
- color: $widget-icon-hover-color
- fill: $widget-icon-hover-color
- box-shadow(none)
-
- .mailpoet_widget_title
- display: none
+ .mailpoet_widget_title
+ display: none
diff --git a/assets/css/src/newsletter_editor/components/sidepanel.styl b/assets/css/src/newsletter_editor/components/sidepanel.styl
index b895450e57..375c05ae27 100644
--- a/assets/css/src/newsletter_editor/components/sidepanel.styl
+++ b/assets/css/src/newsletter_editor/components/sidepanel.styl
@@ -2,54 +2,53 @@ $sidepanel-active-heading-color = $primary-active-color
/* Sidepanel */
.mailpoet_editor_settings
- color: $sidebar-text-color
+ color: $sidebar-text-color
- p
- font-size: 1em
+ p
+ font-size: 1em
- h3
- font-size: 1.4em
- color: $sidepanel-active-heading-color
- text-transform: uppercase
+ h3
+ font-size: 1.4em
+ color: $sidepanel-active-heading-color
+ text-transform: uppercase
.mailpoet_sidepanel_field
- margin-top: 15px
- margin-bottom: 15px
+ margin-top: 15px
+ margin-bottom: 15px
.mailpoet_sidepanel_field_title
- clear: both
- font-size: 1.1em
- margin-bottom: 5px
+ clear: both
+ font-size: 1.1em
+ margin-bottom: 5px
.mailpoet_sidepanel_field_title_small
- width: 120px
+ width: 120px
.mailpoet_sidepanel_field_title_inline
- //clear: left
- display: inline-block
- vertical-align: middle
- line-height: 30px
- margin-bottom: 0
+ display: inline-block
+ vertical-align: middle
+ line-height: 30px
+ margin-bottom: 0
.mailpoet_sidepanel_field_optional
- font-size: 0.8em
- color: $primary-inactive-color
+ font-size: 0.8em
+ color: $primary-inactive-color
.mailpoet_sidepanel_radio_option,
.mailpoet_sidepanel_checkbox_option
- display: inline-block
- vertical-align: top
- margin-right: 15px
- line-height: 30px
+ display: inline-block
+ vertical-align: top
+ margin-right: 15px
+ line-height: 30px
- &:last-child
- margin-right: 0
+ &:last-child
+ margin-right: 0
.mailpoet_sidepanel_input_option
- display: inline-block
+ display: inline-block
- input[type=checkbox]
- vertical-align:top
+ input[type=checkbox]
+ vertical-align:top
- input[type=text]
- vertical-align: middle
+ input[type=text]
+ vertical-align: middle
diff --git a/assets/css/src/newsletter_editor/contentBlocks/automatedLatestContent.styl b/assets/css/src/newsletter_editor/contentBlocks/automatedLatestContent.styl
index 8b081e826c..dba0beb38a 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/automatedLatestContent.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/automatedLatestContent.styl
@@ -1,15 +1,15 @@
.mailpoet_automated_latest_content_block
- padding: 0
+ padding: 0
.mailpoet_automated_latest_content_block_overlay
- position: absolute
- z-index: 19
- width: 100%
- height: 100%
- background: rgba(255, 255, 255, 0.7)
+ position: absolute
+ z-index: 19
+ width: 100%
+ height: 100%
+ background: rgba(255, 255, 255, 0.7)
.mailpoet_automated_latest_content_block_posts
- overflow: auto
+ overflow: auto
- & > .mailpoet_block
- width: 100%
+ & > .mailpoet_block
+ width: 100%
diff --git a/assets/css/src/newsletter_editor/contentBlocks/base.styl b/assets/css/src/newsletter_editor/contentBlocks/base.styl
index 8d1ad6727a..2ead16df83 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/base.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/base.styl
@@ -1,32 +1,32 @@
$block-hover-highlight-color = $primary-active-color
.mailpoet_block
- box-sizing: border-box
- position: relative
- float: left
- background-color: inherit
- box-sizing: border-box
+ box-sizing: border-box
+ position: relative
+ float: left
+ background-color: inherit
+ box-sizing: border-box
- margin-bottom: 20px
+ margin-bottom: 20px
- padding-left: 20px
- padding-right: 20px
+ padding-left: 20px
+ padding-right: 20px
- & > .mailpoet_block_highlight
- position: absolute
- top: 0
- right: 0
- bottom: 0
- left: 0
- pointer-events: none
- border: 1px solid $transparent-color
+ & > .mailpoet_block_highlight
+ position: absolute
+ top: 0
+ right: 0
+ bottom: 0
+ left: 0
+ pointer-events: none
+ border: 1px solid $transparent-color
- &:hover > .mailpoet_block_highlight
- border: 1px dashed $block-hover-highlight-color
+ &:hover > .mailpoet_block_highlight
+ border: 1px dashed $block-hover-highlight-color
.mailpoet_block:last-child
- margin-bottom: 0
+ margin-bottom: 0
.mailpoet_content
- position: relative
+ position: relative
diff --git a/assets/css/src/newsletter_editor/contentBlocks/button.styl b/assets/css/src/newsletter_editor/contentBlocks/button.styl
index f48d2d498d..1f4f7321c8 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/button.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/button.styl
@@ -1,20 +1,19 @@
$button-vertical-padding = 13px
.mailpoet_button_block
- padding-top: $button-vertical-padding
- padding-bottom: $button-vertical-padding
+ padding-top: $button-vertical-padding
+ padding-bottom: $button-vertical-padding
- overflow: hidden
+ overflow: hidden
- .mailpoet_editor_button
- display: block
- margin: auto
- line-height: 2em
- text-align: center
- text-decoration: none
- box-sizing: border-box
- max-width: 100%
-
- &:hover
- cursor: all-scroll
+ .mailpoet_editor_button
+ display: block
+ margin: auto
+ line-height: 2em
+ text-align: center
+ text-decoration: none
+ box-sizing: border-box
+ max-width: 100%
+ &:hover
+ cursor: all-scroll
diff --git a/assets/css/src/newsletter_editor/contentBlocks/container.styl b/assets/css/src/newsletter_editor/contentBlocks/container.styl
index 3d5c3d6882..47117ab5ed 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/container.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/container.styl
@@ -1,26 +1,26 @@
.mailpoet_container
- width: 100%
- min-height: 15px
- position: relative
+ width: 100%
+ min-height: 15px
+ position: relative
.mailpoet_container_block
- margin-left: 0
- margin-right: 0
- position: relative
- box-sizing: border-box
- border: 0
- padding-left: 0
- padding-right: 0
+ margin-left: 0
+ margin-right: 0
+ position: relative
+ box-sizing: border-box
+ border: 0
+ padding-left: 0
+ padding-right: 0
- &:hover
- border: 0
+ &:hover
+ border: 0
.mailpoet_container_vertical > *
- width: 100%
- box-sizing: border-box
+ width: 100%
+ box-sizing: border-box
.mailpoet_container_horizontal > *
- vertical-align: top
+ vertical-align: top
/**
* Enforce column widths:
@@ -30,47 +30,47 @@
*/
#mailpoet_editor_content
- .mailpoet_container
- box-sizing: border-box
- float: left
+ .mailpoet_container
+ box-sizing: border-box
+ float: left
- // One column
- & > .mailpoet_container_block
- width: $newsletter-width
- border: 0
+ // One column
+ & > .mailpoet_container_block
+ width: $newsletter-width
+ border: 0
- & > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block
- margin-bottom: 0
+ & > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block
+ margin-bottom: 0
- .mailpoet_container_horizontal > .mailpoet_container_block
- margin-bottom: 0
- width: 20px + 560px + 20px
+ .mailpoet_container_horizontal > .mailpoet_container_block
+ margin-bottom: 0
+ width: 20px + 560px + 20px
- // More than one column
- & > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal
+ // More than one column
+ & > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal
- // Column number detection technique found here:
- // http://stackoverflow.com/questions/8720931/can-css-detect-the-number-of-children-an-element-has
+ // Column number detection technique found here:
+ // http://stackoverflow.com/questions/8720931/can-css-detect-the-number-of-children-an-element-has
- // Two columns
- & > .mailpoet_block:first-child:nth-last-child(2)
- & > .mailpoet_block:first-child:nth-last-child(2) ~ .mailpoet_block
- //padding-left: 20px
- //padding-right: 20px
- width: 260px + 20px + 20px
+ // Two columns
+ & > .mailpoet_block:first-child:nth-last-child(2)
+ & > .mailpoet_block:first-child:nth-last-child(2) ~ .mailpoet_block
+ //padding-left: 20px
+ //padding-right: 20px
+ width: 260px + 20px + 20px
- // Three columns
- & > .mailpoet_block:first-child:nth-last-child(3)
- & > .mailpoet_block:first-child:nth-last-child(3) ~ .mailpoet_block
- //padding-left: 20px
- //padding-right: 20px
- width: 160px + 20px + 20px
+ // Three columns
+ & > .mailpoet_block:first-child:nth-last-child(3)
+ & > .mailpoet_block:first-child:nth-last-child(3) ~ .mailpoet_block
+ //padding-left: 20px
+ //padding-right: 20px
+ width: 160px + 20px + 20px
.mailpoet_container_empty
- text-align: center
- background-color: #f2f2f2
- margin: 20px
- padding: 15px
- box-shadow(inset 1px 2px 1px $primary-inactive-color)
- color: #656565
- border-radius(3px)
+ text-align: center
+ background-color: #f2f2f2
+ margin: 20px
+ padding: 15px
+ box-shadow(inset 1px 2px 1px $primary-inactive-color)
+ color: #656565
+ border-radius(3px)
diff --git a/assets/css/src/newsletter_editor/contentBlocks/divider.styl b/assets/css/src/newsletter_editor/contentBlocks/divider.styl
index a1b99a8de7..138a54b842 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/divider.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/divider.styl
@@ -3,27 +3,27 @@ $active-divider-background-color = #daebf2
$divider-hover-border-color = $primary-active-color
.mailpoet_divider_block
- padding-left: 0
- padding-right: 0
- margin-bottom: 0
- cursor: all-scroll
+ padding-left: 0
+ padding-right: 0
+ margin-bottom: 0
+ cursor: all-scroll
.mailpoet_divider
- margin-left: 20px
- margin-right: 20px
+ margin-left: 20px
+ margin-right: 20px
.mailpoet_field_divider_style
- max-width: $newsletter-width
- margin: auto
- display: block
- width: 100%
- border: 1px solid transparent
+ max-width: $newsletter-width
+ margin: auto
+ display: block
+ width: 100%
+ border: 1px solid transparent
.mailpoet_field_divider_style:hover
- border: 1px solid $divider-hover-border-color
+ border: 1px solid $divider-hover-border-color
.mailpoet_divider_selector img
- width: 100%
+ width: 100%
.mailpoet_field_divider_style
- padding: 10px 0
+ padding: 10px 0
diff --git a/assets/css/src/newsletter_editor/contentBlocks/footer.styl b/assets/css/src/newsletter_editor/contentBlocks/footer.styl
index 8c3b83e1e5..c66a095d93 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/footer.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/footer.styl
@@ -1,6 +1,6 @@
.mailpoet_footer_block
- padding-left: 0
- padding-right: 0
+ padding-left: 0
+ padding-right: 0
- .mailpoet_content
- padding: 5px 20px
+ .mailpoet_content
+ padding: 5px 20px
diff --git a/assets/css/src/newsletter_editor/contentBlocks/header.styl b/assets/css/src/newsletter_editor/contentBlocks/header.styl
index 19064b58fe..62a12591ad 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/header.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/header.styl
@@ -1,6 +1,6 @@
.mailpoet_header_block
- padding-left: 0
- padding-right: 0
+ padding-left: 0
+ padding-right: 0
- .mailpoet_content
- padding: 5px 20px
+ .mailpoet_content
+ padding: 5px 20px
diff --git a/assets/css/src/newsletter_editor/contentBlocks/image.styl b/assets/css/src/newsletter_editor/contentBlocks/image.styl
index b752b9fbac..606ff2f045 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/image.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/image.styl
@@ -1,15 +1,15 @@
.mailpoet_image_block
- &.mailpoet_full_image
- padding-left: 0
- padding-right: 0
- margin-bottom: 0
+ &.mailpoet_full_image
+ padding-left: 0
+ padding-right: 0
+ margin-bottom: 0
- .mailpoet_content a:hover
- cursor: all-scroll
+ .mailpoet_content a:hover
+ cursor: all-scroll
- img
- vertical-align: bottom
- max-width: $newsletter-width
- width: 100%
- height: auto
+ img
+ vertical-align: bottom
+ max-width: $newsletter-width
+ width: 100%
+ height: auto
diff --git a/assets/css/src/newsletter_editor/contentBlocks/posts.styl b/assets/css/src/newsletter_editor/contentBlocks/posts.styl
index edaf481af0..4f60ff8e5a 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/posts.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/posts.styl
@@ -1,46 +1,46 @@
.mailpoet_posts_block
- box-shadow(none)
+ box-shadow(none)
- & > .mailpoet_content
- font-size: 1em
- text-align: center
- background-color: $primary-active-color
- margin: 20px 0
- padding: 15px
- box-shadow(inset 1px 2px 1px $primary-inset-shadow-color)
- color: $white-color
- border-radius(3px)
+ & > .mailpoet_content
+ font-size: 1em
+ text-align: center
+ background-color: $primary-active-color
+ margin: 20px 0
+ padding: 15px
+ box-shadow(inset 1px 2px 1px $primary-inset-shadow-color)
+ color: $white-color
+ border-radius(3px)
.mailpoet_post_selection_filter_row
- margin-top: 5px
- margin-bottom: 5px
+ margin-top: 5px
+ margin-bottom: 5px
.mailpoet_posts_categories_and_tags
- width: 100%
+ width: 100%
.mailpoet_settings_posts_show_display_options
.mailpoet_settings_posts_show_post_selection
- display: block
- margin-top: 10px
+ display: block
+ margin-top: 10px
.mailpoet_post_selection_container
- margin-top: 20px
- margin-bottom: 20px
+ margin-top: 20px
+ margin-bottom: 20px
.mailpoet_settings_posts_single_post
- border-radius(1px)
- width: 100%
- margin-top: 5px
- margin-bottom: 5px
- height: 38px
- line-height: 38px
- overflow: hidden
- border: 1px solid $content-border-color
- background-color: $white-color
+ border-radius(1px)
+ width: 100%
+ margin-top: 5px
+ margin-bottom: 5px
+ height: 38px
+ line-height: 38px
+ overflow: hidden
+ border: 1px solid $content-border-color
+ background-color: $white-color
- &:hover
- border-color: $primary-active-color
+ &:hover
+ border-color: $primary-active-color
- .mailpoet_select_post_checkbox
- margin-left: 10px
- margin-right: 8px
+ .mailpoet_select_post_checkbox
+ margin-left: 10px
+ margin-right: 8px
diff --git a/assets/css/src/newsletter_editor/contentBlocks/social.styl b/assets/css/src/newsletter_editor/contentBlocks/social.styl
index e06475aee0..358f7d2e40 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/social.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/social.styl
@@ -12,105 +12,102 @@ $tool-active-color = #d2d2d4
$tool-width = 16px
.mailpoet_social_block
- padding-top: $social-block-vertical-padding
- padding-bottom: $social-block-vertical-padding
+ padding-top: $social-block-vertical-padding
+ padding-bottom: $social-block-vertical-padding
- .mailpoet_social
- text-align: center
+ .mailpoet_social
+ text-align: center
.mailpoet_social
- span
- display: inline-block
- padding: 2px 3px
+ span
+ display: inline-block
+ padding: 2px 3px
- span,
- a,
- img
- vertical-align: top
+ span,
+ a,
+ img
+ vertical-align: top
- a
- cursor: all-scroll
+ a
+ cursor: all-scroll
.mailpoet_social_icon_set
- border: 1px solid transparent
- padding: 5px
- margin-bottom: 5px
+ border: 1px solid transparent
+ padding: 5px
+ margin-bottom: 5px
- &:hover
- border: 1px solid $social-icon-set-hover-border-color
+ &:hover
+ border: 1px solid $social-icon-set-hover-border-color
- img
- width: $social-icon-width
- height: $social-icon-width
- vertical-align: middle
- padding: 2px 3px
+ img
+ width: $social-icon-width
+ height: $social-icon-width
+ vertical-align: middle
+ padding: 2px 3px
.mailpoet_active_icon_set
- border: 1px dashed $active-social-icon-set-border-color
- background-color: $active-social-icon-set-background-color
-
+ border: 1px dashed $active-social-icon-set-border-color
+ background-color: $active-social-icon-set-background-color
.mailpoet_social_icon_settings
- position: relative
+ position: relative
- padding: 28px 9px (18px - 10px) 9px
- margin-bottom: 9px
+ padding: 28px 9px (18px - 10px) 9px
+ margin-bottom: 9px
- background: $white-color
- border: 1px solid $content-border-color
+ background: $white-color
+ border: 1px solid $content-border-color
.mailpoet_social_icon_settings_row
- clear: both
- overflow: auto
- margin-bottom: 10px
+ clear: both
+ overflow: auto
+ margin-bottom: 10px
- line-height: 30px
+ line-height: 30px
.mailpoet_social_icon_settings_label
- margin-right: 5px
+ margin-right: 5px
+ text-align: left
- text-align: left
+ .mailpoet_social_icon_image
+ width: 30px
+ height: 30px
- .mailpoet_social_icon_image
- width: 30px
- height: 30px
-
- &.mailpoet_social_icon_image_label
- line-height: initial
+ &.mailpoet_social_icon_image_label
+ line-height: initial
.mailpoet_social_icon_settings_form_element
- float: left
+ float: left
+ width: 100%
+
+ input, select
width: 100%
-
- input, select
- width: 100%
- height: 30px
- box-sizing: border-box
- margin: 0
- vertical-align: middle
- display: inline-block
-
+ height: 30px
+ box-sizing: border-box
+ margin: 0
+ vertical-align: middle
+ display: inline-block
.mailpoet_social_icon_settings_tool
- position: absolute
- top: 10px
+ position: absolute
+ top: 10px
- .mailpoet_tool_icon
- fill: $tool-inactive-color
- width: $tool-width
- height: $tool-width
+ .mailpoet_tool_icon
+ fill: $tool-inactive-color
+ width: $tool-width
+ height: $tool-width
- &:hover
- fill: $tool-hover-color
+ &:hover
+ fill: $tool-hover-color
- &:active
- fill: $primary-active-color
+ &:active
+ fill: $primary-active-color
- &:active
- filter-shadow(1px, 2px, 0px, $tool-active-color)
+ &:active
+ filter-shadow(1px, 2px, 0px, $tool-active-color)
.mailpoet_social_icon_settings_move_icon
- right: 5px
+ right: 5px
.mailpoet_social_icon_settings_delete_icon
- right: 5px + 5px + $tool-width
+ right: 5px + 5px + $tool-width
diff --git a/assets/css/src/newsletter_editor/contentBlocks/spacer.styl b/assets/css/src/newsletter_editor/contentBlocks/spacer.styl
index 3c8249b347..42c58b3a7f 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/spacer.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/spacer.styl
@@ -1,8 +1,8 @@
.mailpoet_spacer
- text-align: center
+ text-align: center
.mailpoet_spacer_block
- padding-left: 0
- padding-right: 0
- margin-bottom: 0
- cursor: all-scroll
+ padding-left: 0
+ padding-right: 0
+ margin-bottom: 0
+ cursor: all-scroll
diff --git a/assets/css/src/newsletter_editor/contentBlocks/text.styl b/assets/css/src/newsletter_editor/contentBlocks/text.styl
index 7993c75dcd..613750520c 100644
--- a/assets/css/src/newsletter_editor/contentBlocks/text.styl
+++ b/assets/css/src/newsletter_editor/contentBlocks/text.styl
@@ -1,17 +1,17 @@
$text-vertical-padding = 3px
.mailpoet_text_block
- padding-left: 0
- padding-right: 0
+ padding-left: 0
+ padding-right: 0
- & > .mailpoet_content
- overflow: hidden
- padding-top: 13px
- padding-bottom: 13px
- padding-left: 20px
- padding-right: 20px
+ & > .mailpoet_content
+ overflow: hidden
+ padding-top: 13px
+ padding-bottom: 13px
+ padding-left: 20px
+ padding-right: 20px
blockquote
- margin: 1em
- padding-left: 1em
- border-left: 2px #565656 solid
+ margin: 1em
+ padding-left: 1em
+ border-left: 2px #565656 solid
diff --git a/assets/css/src/newsletter_editor/layout.styl b/assets/css/src/newsletter_editor/layout.styl
index e30e9eddc9..f86a92a15d 100644
--- a/assets/css/src/newsletter_editor/layout.styl
+++ b/assets/css/src/newsletter_editor/layout.styl
@@ -2,31 +2,31 @@ $sidebar-width = 330px
$content-border-color = $structure-border-color
#mailpoet_editor
- width: 100%
- clear: both
+ width: 100%
+ clear: both
#mailpoet_editor_heading
- padding-left: 15px
- margin-left: 2px
+ padding-left: 15px
+ margin-left: 2px
#mailpoet_editor_main_wrapper
- border: 1px solid $content-border-color
- border-left: 0
- position: relative
- min-width: 1050px
+ border: 1px solid $content-border-color
+ border-left: 0
+ position: relative
+ min-width: 1050px
#mailpoet_editor_content_container
- width: 100%
- padding-right: $sidebar-width
- box-sizing: border-box
+ width: 100%
+ padding-right: $sidebar-width
+ box-sizing: border-box
#mailpoet_editor_sidebar
- float: right
- width: $sidebar-width
- box-sizing: border-box
+ float: right
+ width: $sidebar-width
+ box-sizing: border-box
.mailpoet_newsletter_wrapper
- max-width: $newsletter-width
- width: $newsletter-width
- margin: auto
- position: relative
+ max-width: $newsletter-width
+ width: $newsletter-width
+ margin: auto
+ position: relative
diff --git a/assets/css/src/newsletter_editor/libraryOverrides.styl b/assets/css/src/newsletter_editor/libraryOverrides.styl
index 003016ebba..0b5fe17162 100644
--- a/assets/css/src/newsletter_editor/libraryOverrides.styl
+++ b/assets/css/src/newsletter_editor/libraryOverrides.styl
@@ -1,119 +1,118 @@
/* Fix select2 z-index to work with MailPoet.Modal */
.select2-drop
- z-index: 101000
+ z-index: 101000
/* Remove input field styles from select2 type input */
.select2-container
- border: none
- padding: 0
+ border: none
+ padding: 0
/* Fix inline TinyMCE toolbar to have minimal width instead of being close to 100% of the screen */
div.mce-toolbar-grp.mce-container
- position: absolute
+ position: absolute
.mce-tinymce.mce-tinymce-inline
- border-radius(3px)
- background-color: $primary-background-color
- border: 1px solid $content-border-color
-
- box-shadow(0px 0px 3px 1px rgba(0, 0, 0, 0.05))
+ border-radius(3px)
+ background-color: $primary-background-color
+ border: 1px solid $content-border-color
+ box-shadow(0px 0px 3px 1px rgba(0, 0, 0, 0.05))
.mce-window
- /* Fix TinyMCE mailpoet_custom_fields window lack of hiding overflow */
- div.mce-container-body.mce-abs-layout
- overflow: hidden
+ /* Fix TinyMCE mailpoet_custom_fields window lack of hiding overflow */
+ div.mce-container-body.mce-abs-layout
+ overflow: hidden
- /* Fix TinyMCE popup window's close button to not be covered by draggable section */
- .mce-window-head div.mce-dragh
- width: -webkit-calc( 100% - 36px )
- width: calc( 100% - 36px )
+ /* Fix TinyMCE popup window's close button to not be covered by draggable section */
+ .mce-window-head div.mce-dragh
+ width: -webkit-calc( 100% - 36px )
+ width: calc( 100% - 36px )
/* TinyMCE mailpoet_custom_fields toolbar icon */
.mce-i-mailpoet_custom_fields:before
- font: 400 20px/1 dashicons!important
- content: "\f307"
+ font: 400 20px/1 dashicons!important
+ content: "\f307"
/* TinyMCE remove active border from the editor */
.mce-edit-focus
- outline: none
+ outline: none
/* Style "No search term specified" in TinyMCE link editor */
#wp-link li, #wp-link div.query-notice
- clear: both
- margin-bottom: 0
- border-bottom: 1px solid #f1f1f1
- color: #333
- padding: 4px 6px
- cursor: pointer
- position: relative
+clear: both
+margin-bottom: 0
+border-bottom: 1px solid #f1f1f1
+color: #333
+padding: 4px 6px
+cursor: pointer
+position: relative
/* Remove empty space between WP admin sidebar and content */
#wpbody-content > *
- margin-left: 20px
+ margin-left: 20px
#wpbody-content > .wrap
- margin-left: 0
+ margin-left: 0
#wpcontent
- margin-left: 160px
- padding-left: 0
+ margin-left: 160px
+ padding-left: 0
- .folded &
- margin-left: 36px
+ .folded &
+ margin-left: 36px
.wrap
- margin-left: 0
- margin-right: 0
+ margin-left: 0
+ margin-right: 0
/* Reduce WP admin bar z-index in order for TinyMCE toolbar to be visible */
#wpadminbar
- z-index: 50000
+ z-index: 50000
/* Allow horizontal scrolling on smaller (tablet/phone) sized screens */
body
- overflow-x: auto
+ overflow-x: auto
/* Hide the "Details" section of Wordpress Media manager */
.media-sidebar
- display: none
+ display: none
#mailpoet-media-manager
- .attachments-browser .attachments
- .attachments-browser .uploader-inline
- margin-right: 0
+ .attachments-browser .attachments
+ .attachments-browser .uploader-inline
+ margin-right: 0
- .attachments-browser .attachments
- .attachments-browser .media-toolbar
- .attachments-browser .uploader-inline
- right: 0
+ .attachments-browser .attachments
+ .attachments-browser .media-toolbar
+ .attachments-browser .uploader-inline
+ right: 0
/* Remove max width from date selector in Wordpress Media Manager */
#media-attachment-date-filters
- max-width: calc(100% - 12px)
+ max-width: calc(100% - 12px)
/* Alter Spectrum color picker to leave only the color preview, without arrows */
.sp-replacer
- border-radius(3px)
- padding: 0
- border: 0
- box-shadow(1px 2px darken($primary-background-color, 13%))
+ border-radius(3px)
+ padding: 0
+ border: 0
+ box-shadow(1px 2px darken($primary-background-color, 13%))
.sp-preview
- border-width: 0
- margin-right: 0
- width: 25px
- height: 25px
+ border-width: 0
+ margin-right: 0
+ width: 25px
+ height: 25px
.sp-dd
- display: none
+ display: none
/* Sidepanel overrides */
.mailpoet_panel_body
- margin: 19px
- padding: 0
+ margin: 19px
+ padding: 0
.mailpoet_panel_wrapper
- background-color: $primary-background-color
- border: 1px solid $content-border-color
+ background-color: $primary-background-color
+ border: 1px solid $content-border-color
#mailpoet_modal_close
- display: none
+ display: none
diff --git a/assets/css/src/newsletter_editor/mixins/border-radius.styl b/assets/css/src/newsletter_editor/mixins/border-radius.styl
index f81b129469..ab6971a0e5 100644
--- a/assets/css/src/newsletter_editor/mixins/border-radius.styl
+++ b/assets/css/src/newsletter_editor/mixins/border-radius.styl
@@ -1,4 +1,4 @@
border-radius()
- -webkit-border-radius: arguments
- -moz-border-radius: arguments
- border-radius: arguments
+ -webkit-border-radius: arguments
+ -moz-border-radius: arguments
+ border-radius: arguments
diff --git a/assets/css/src/newsletter_editor/mixins/box-shadow.styl b/assets/css/src/newsletter_editor/mixins/box-shadow.styl
index 69ffdfff5a..8aeeeb83f1 100644
--- a/assets/css/src/newsletter_editor/mixins/box-shadow.styl
+++ b/assets/css/src/newsletter_editor/mixins/box-shadow.styl
@@ -1,5 +1,4 @@
box-shadow()
- -webkit-box-shadow: arguments
- -moz-box-shadow: arguments
- box-shadow: arguments
-
+ -webkit-box-shadow: arguments
+ -moz-box-shadow: arguments
+ box-shadow: arguments
diff --git a/assets/css/src/newsletter_editor/mixins/filter-shadow.styl b/assets/css/src/newsletter_editor/mixins/filter-shadow.styl
index 48a5e85956..837c8f7c80 100644
--- a/assets/css/src/newsletter_editor/mixins/filter-shadow.styl
+++ b/assets/css/src/newsletter_editor/mixins/filter-shadow.styl
@@ -1,5 +1,5 @@
filter-shadow(offset-x, offset-y, blur-radius=0px, color=#ff0000)
- filter: "progid:DXImageTransform.Microsoft.Dropshadow(OffX=%d, OffY=%d, Color='%s')" % (offset-x offset-y color)
- -webkit-filter: drop-shadow(offset-x offset-y blur-radius color)
- -ms-filter: "progid:DXImageTransform.Microsoft.Dropshadow(OffX=%d, OffY=%d, Color='%s')" % (offset-x offset-y color)
- filter: drop-shadow(offset-x offset-y blur-radius color)
+ filter: "progid:DXImageTransform.Microsoft.Dropshadow(OffX=%d, OffY=%d, Color='%s')" % (offset-x offset-y color)
+ -webkit-filter: drop-shadow(offset-x offset-y blur-radius color)
+ -ms-filter: "progid:DXImageTransform.Microsoft.Dropshadow(OffX=%d, OffY=%d, Color='%s')" % (offset-x offset-y color)
+ filter: drop-shadow(offset-x offset-y blur-radius color)
diff --git a/assets/css/src/newsletter_editor/variables.styl b/assets/css/src/newsletter_editor/variables.styl
index 70d20a7b48..09210b01dc 100644
--- a/assets/css/src/newsletter_editor/variables.styl
+++ b/assets/css/src/newsletter_editor/variables.styl
@@ -23,5 +23,4 @@ $warning-alternate-text-color = #f4c6c8
$error-text-color = #d54e21
// Dimensions
-
$newsletter-width = 600px
diff --git a/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js b/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js
index 70f3618619..6e605a68a9 100644
--- a/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js
+++ b/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js
@@ -20,5 +20,4 @@ define('newsletter_editor/behaviors/ColorPickerBehavior', [
});
},
});
-
});
diff --git a/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js b/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js
index d9533adb0e..daee9311f5 100644
--- a/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js
+++ b/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js
@@ -424,5 +424,4 @@ define('newsletter_editor/behaviors/ContainerDropZoneBehavior', [
return depth === 0 || (depth === 1 && orientation === 'horizontal' && childCount <= this.options.columnLimit);
},
});
-
});
diff --git a/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js b/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js
index a599b8429f..368a32d6cd 100644
--- a/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js
+++ b/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js
@@ -11,122 +11,121 @@ define('newsletter_editor/behaviors/DraggableBehavior', [
], function(Marionette, BehaviorsLookup, interact) {
BehaviorsLookup.DraggableBehavior = Marionette.Behavior.extend({
- defaults: {
- cloneOriginal: false,
- hideOriginal: false,
- ignoreSelector: '.mailpoet_ignore_drag, .mailpoet_ignore_drag *',
- onDragSubstituteBy: undefined,
- /**
- * Constructs a model that will be passed to the receiver on drop
- *
- * @return Backbone.Model A model that will be passed to the receiver
- */
- getDropModel: function() {
- throw "Missing 'drop' function for DraggableBehavior";
- },
-
- onDrop: function(model, view) {},
- testAttachToInstance: function(model, view) { return true; },
+ defaults: {
+ cloneOriginal: false,
+ hideOriginal: false,
+ ignoreSelector: '.mailpoet_ignore_drag, .mailpoet_ignore_drag *',
+ onDragSubstituteBy: undefined,
+ /**
+ * Constructs a model that will be passed to the receiver on drop
+ *
+ * @return Backbone.Model A model that will be passed to the receiver
+ */
+ getDropModel: function() {
+ throw "Missing 'drop' function for DraggableBehavior";
},
- onRender: function() {
- var that = this,
- interactable;
- // Give instances more control over whether Draggable should be applied
- if (!this.options.testAttachToInstance(this.view.model, this.view)) return;
+ onDrop: function(model, view) {},
+ testAttachToInstance: function(model, view) { return true; },
+ },
+ onRender: function() {
+ var that = this,
+ interactable;
- interactable = interact(this.$el.get(0), {
- ignoreFrom: this.options.ignoreSelector,
- }).draggable({
- // allow dragging of multple elements at the same time
- max: Infinity,
+ // Give instances more control over whether Draggable should be applied
+ if (!this.options.testAttachToInstance(this.view.model, this.view)) return;
- // Scroll when dragging near edges of a window
- autoScroll: true,
+ interactable = interact(this.$el.get(0), {
+ ignoreFrom: this.options.ignoreSelector,
+ }).draggable({
+ // allow dragging of multple elements at the same time
+ max: Infinity,
- onstart: function(event) {
- console.log('Drag start', event, this);
+ // Scroll when dragging near edges of a window
+ autoScroll: true,
- if (that.options.cloneOriginal === true) {
- // Use substitution instead of a clone
- var tempClone = (_.isFunction(that.options.onDragSubstituteBy)) ? that.options.onDragSubstituteBy(that) : undefined,
- // Or use a clone
- clone = tempClone ? tempClone : event.target.cloneNode(true),
+ onstart: function(event) {
+ console.log('Drag start', event, this);
- $original = jQuery(event.target),
- $clone = jQuery(clone),
- centerXOffset, centerYOffset, parentOffset;
+ if (that.options.cloneOriginal === true) {
+ // Use substitution instead of a clone
+ var tempClone = (_.isFunction(that.options.onDragSubstituteBy)) ? that.options.onDragSubstituteBy(that) : undefined,
+ // Or use a clone
+ clone = tempClone ? tempClone : event.target.cloneNode(true),
- $clone.addClass('mailpoet_droppable_active');
- $clone.css('position', 'absolute');
- $clone.css('top', 0);
- $clone.css('left', 0);
- document.body.appendChild(clone);
+ $original = jQuery(event.target),
+ $clone = jQuery(clone),
+ centerXOffset, centerYOffset, parentOffset;
- // Position the clone over the target element with a slight
- // offset to center the clone under the mouse cursor.
- // Accurate dimensions can only be taken after insertion to document
- centerXOffset = $clone.width() / 2;
- centerYOffset = $clone.height() / 2;
- $clone.css('top', event.pageY - centerYOffset);
- $clone.css('left', event.pageX - centerXOffset);
+ $clone.addClass('mailpoet_droppable_active');
+ $clone.css('position', 'absolute');
+ $clone.css('top', 0);
+ $clone.css('left', 0);
+ document.body.appendChild(clone);
- event.interaction.element = clone;
+ // Position the clone over the target element with a slight
+ // offset to center the clone under the mouse cursor.
+ // Accurate dimensions can only be taken after insertion to document
+ centerXOffset = $clone.width() / 2;
+ centerYOffset = $clone.height() / 2;
+ $clone.css('top', event.pageY - centerYOffset);
+ $clone.css('left', event.pageX - centerXOffset);
+
+ event.interaction.element = clone;
- if (that.options.hideOriginal === true) {
- that.view.$el.addClass('mailpoet_hidden');
- }
- }
-
- },
- // call this function on every dragmove event
- onmove: function (event) {
- var target = event.target,
- // keep the dragged position in the data-x/data-y attributes
- x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx,
- y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;
-
- // translate the element
- target.style.webkitTransform =
- target.style.transform =
- 'translate(' + x + 'px, ' + y + 'px)';
-
- // update the posiion attributes
- target.setAttribute('data-x', x);
- target.setAttribute('data-y', y);
- },
- onend: function (event) {
- var target = event.target;
- target.style.webkitTransform = target.style.transform = '';
- target.removeAttribute('data-x');
- target.removeAttribute('data-y');
- jQuery(event.interaction.element).addClass('mailpoet_droppable_active');
-
- if (that.options.cloneOriginal === true) {
- jQuery(target).remove();
-
- if (that.options.hideOriginal === true) {
- that.view.$el.removeClass('mailpoet_hidden');
- }
- }
- },
- }).preventDefault('auto');
-
- if (this.options.drop !== undefined) {
- interactable.getDropModel = this.options.drop;
- } else {
- interactable.getDropModel = this.view.getDropFunc();
+ if (that.options.hideOriginal === true) {
+ that.view.$el.addClass('mailpoet_hidden');
+ }
}
- interactable.onDrop = function(options) {
- if (_.isObject(options)) {
- // Inject Draggable behavior if possible
- options.dragBehavior = that;
- }
- // Delegate to view's event handler
- that.options.onDrop.apply(that, [options]);
- };
- },
- });
+ },
+ // call this function on every dragmove event
+ onmove: function (event) {
+ var target = event.target,
+ // keep the dragged position in the data-x/data-y attributes
+ x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx,
+ y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;
+
+ // translate the element
+ target.style.webkitTransform =
+ target.style.transform =
+ 'translate(' + x + 'px, ' + y + 'px)';
+
+ // update the posiion attributes
+ target.setAttribute('data-x', x);
+ target.setAttribute('data-y', y);
+ },
+ onend: function (event) {
+ var target = event.target;
+ target.style.webkitTransform = target.style.transform = '';
+ target.removeAttribute('data-x');
+ target.removeAttribute('data-y');
+ jQuery(event.interaction.element).addClass('mailpoet_droppable_active');
+
+ if (that.options.cloneOriginal === true) {
+ jQuery(target).remove();
+
+ if (that.options.hideOriginal === true) {
+ that.view.$el.removeClass('mailpoet_hidden');
+ }
+ }
+ },
+ }).preventDefault('auto');
+
+ if (this.options.drop !== undefined) {
+ interactable.getDropModel = this.options.drop;
+ } else {
+ interactable.getDropModel = this.view.getDropFunc();
+ }
+ interactable.onDrop = function(options) {
+ if (_.isObject(options)) {
+ // Inject Draggable behavior if possible
+ options.dragBehavior = that;
+ }
+ // Delegate to view's event handler
+ that.options.onDrop.apply(that, [options]);
+ };
+ },
+ });
});
diff --git a/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js b/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js
index 2f39f9f0e9..2e721e29d0 100644
--- a/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js
+++ b/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js
@@ -10,60 +10,59 @@ define('newsletter_editor/behaviors/ResizableBehavior', [
], function(Marionette, BehaviorsLookup, interact) {
BehaviorsLookup.ResizableBehavior = Marionette.Behavior.extend({
- defaults: {
- elementSelector: null,
- resizeHandleSelector: true, // true will use edges of the element itself
- transformationFunction: function(y) { return y; },
- minLength: 0,
- modelField: 'styles.block.height',
- },
- events: {
- "mouseenter": 'showResizeHandle',
- "mouseleave": 'hideResizeHandle',
- },
- onRender: function() {
- this.attachResize();
+ defaults: {
+ elementSelector: null,
+ resizeHandleSelector: true, // true will use edges of the element itself
+ transformationFunction: function(y) { return y; },
+ minLength: 0,
+ modelField: 'styles.block.height',
+ },
+ events: {
+ "mouseenter": 'showResizeHandle',
+ "mouseleave": 'hideResizeHandle',
+ },
+ onRender: function() {
+ this.attachResize();
- if (this.isBeingResized !== true) {
- this.hideResizeHandle();
- }
- },
- attachResize: function() {
- var domElement = (this.options.elementSelector === null) ? this.view.$el.get(0) : this.view.$(this.options.elementSelector).get(0),
- that = this;
- interact(domElement).resizable({
- //axis: 'y',
- edges: {
- top: false,
- left: false,
- right: false,
- bottom: (typeof this.options.resizeHandleSelector === 'string') ? this.view.$(this.options.resizeHandleSelector).get(0) : this.options.resizeHandleSelector,
- },
- }).on('resizestart', function(event) {
- that.isBeingResized = true;
- that.$el.addClass('mailpoet_resize_active');
- }).on('resizemove', function(event) {
- var currentLength = parseFloat(that.view.model.get(that.options.modelField)),
- newLength = currentLength + that.options.transformationFunction(event.dy);
+ if (this.isBeingResized !== true) {
+ this.hideResizeHandle();
+ }
+ },
+ attachResize: function() {
+ var domElement = (this.options.elementSelector === null) ? this.view.$el.get(0) : this.view.$(this.options.elementSelector).get(0),
+ that = this;
+ interact(domElement).resizable({
+ //axis: 'y',
+ edges: {
+ top: false,
+ left: false,
+ right: false,
+ bottom: (typeof this.options.resizeHandleSelector === 'string') ? this.view.$(this.options.resizeHandleSelector).get(0) : this.options.resizeHandleSelector,
+ },
+ }).on('resizestart', function(event) {
+ that.isBeingResized = true;
+ that.$el.addClass('mailpoet_resize_active');
+ }).on('resizemove', function(event) {
+ var currentLength = parseFloat(that.view.model.get(that.options.modelField)),
+ newLength = currentLength + that.options.transformationFunction(event.dy);
- if (newLength < that.options.minLength) newLength = that.options.minLength;
+ if (newLength < that.options.minLength) newLength = that.options.minLength;
- that.view.model.set(that.options.modelField, newLength + 'px');
- }).on('resizeend', function(event) {
- that.isBeingResized = null;
- that.$el.removeClass('mailpoet_resize_active');
- });
- },
- showResizeHandle: function() {
- if (typeof this.options.resizeHandleSelector === 'string') {
- this.view.$(this.options.resizeHandleSelector).removeClass('mailpoet_hidden');
- }
- },
- hideResizeHandle: function() {
- if (typeof this.options.resizeHandleSelector === 'string') {
- this.view.$(this.options.resizeHandleSelector).addClass('mailpoet_hidden');
- }
- },
+ that.view.model.set(that.options.modelField, newLength + 'px');
+ }).on('resizeend', function(event) {
+ that.isBeingResized = null;
+ that.$el.removeClass('mailpoet_resize_active');
+ });
+ },
+ showResizeHandle: function() {
+ if (typeof this.options.resizeHandleSelector === 'string') {
+ this.view.$(this.options.resizeHandleSelector).removeClass('mailpoet_hidden');
+ }
+ },
+ hideResizeHandle: function() {
+ if (typeof this.options.resizeHandleSelector === 'string') {
+ this.view.$(this.options.resizeHandleSelector).addClass('mailpoet_hidden');
+ }
+ },
});
-
});
diff --git a/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js b/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js
index 42d795e6a0..f3b9d0a940 100644
--- a/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js
+++ b/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js
@@ -9,32 +9,31 @@ define('newsletter_editor/behaviors/SortableBehavior', [
], function(Marionette, BehaviorsLookup) {
BehaviorsLookup.SortableBehavior = Marionette.Behavior.extend({
- onRender: function() {
- var collection = this.view.collection;
+ onRender: function() {
+ var collection = this.view.collection;
- if (_.isFunction(this.$el.sortable)) {
- this.$el.sortable({
- cursor: "move",
- start: function(event, ui) {
- ui.item.data('previousIndex', ui.item.index());
- },
- end: function(event, ui) {
- ui.item.removeData('previousIndex');
- },
- update: function(event, ui) {
- var previousIndex = ui.item.data('previousIndex'),
- newIndex = ui.item.index(),
- model = collection.at(previousIndex);
+ if (_.isFunction(this.$el.sortable)) {
+ this.$el.sortable({
+ cursor: "move",
+ start: function(event, ui) {
+ ui.item.data('previousIndex', ui.item.index());
+ },
+ end: function(event, ui) {
+ ui.item.removeData('previousIndex');
+ },
+ update: function(event, ui) {
+ var previousIndex = ui.item.data('previousIndex'),
+ newIndex = ui.item.index(),
+ model = collection.at(previousIndex);
- // Replicate DOM changes. Move target model to a new position
- // within the collection
- collection.remove(model);
- collection.add(model, { at: newIndex });
- },
- items: this.options.items,
- });
- }
+ // Replicate DOM changes. Move target model to a new position
+ // within the collection
+ collection.remove(model);
+ collection.add(model, { at: newIndex });
+ },
+ items: this.options.items,
+ });
}
+ }
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js
index 7440c45459..7273e3ba40 100644
--- a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js
+++ b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js
@@ -14,327 +14,326 @@ define('newsletter_editor/blocks/automatedLatestContent', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.automatedLatestContent", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base');
+ var base = App.module('blocks.base');
- Module.AutomatedLatestContentBlockModel = base.BlockModel.extend({
- stale: ['_container'],
- defaults: function() {
- return this._getDefaults({
- type: 'automatedLatestContent',
- amount: '5',
- contentType: 'post', // 'post'|'page'|'mailpoet_page'
- terms: [], // List of category and tag objects
- inclusionType: 'include', // 'include'|'exclude'
- displayType: 'excerpt', // 'excerpt'|'full'|'titleOnly'
- titleFormat: 'h1', // 'h1'|'h2'|'h3'|'ul'
- titlePosition: 'inTextBlock', // 'inTextBlock'|'aboveBlock',
- titleAlignment: 'left', // 'left'|'center'|'right'
- titleIsLink: false, // false|true
- imagePadded: true, // true|false
- //imageAlignment: 'centerPadded', // 'centerFull'|'centerPadded'|'left'|'right'|'alternate'|'none'
- showAuthor: 'no', // 'no'|'aboveText'|'belowText'
- authorPrecededBy: 'Author:',
- showCategories: 'no', // 'no'|'aboveText'|'belowText'
- categoriesPrecededBy: 'Categories:',
- readMoreType: 'button', // 'link'|'button'
- readMoreText: 'Read more', // 'link'|'button'
- readMoreButton: {
- text: 'Read more',
- url: '[postLink]'
- },
- sortBy: 'newest', // 'newest'|'oldest',
- showDivider: true, // true|false
- divider: {},
- _container: new (App.getBlockTypeModel('container'))(),
- }, EditorApplication.getConfig().get('blockDefaults.automatedLatestContent'));
+ Module.AutomatedLatestContentBlockModel = base.BlockModel.extend({
+ stale: ['_container'],
+ defaults: function() {
+ return this._getDefaults({
+ type: 'automatedLatestContent',
+ amount: '5',
+ contentType: 'post', // 'post'|'page'|'mailpoet_page'
+ terms: [], // List of category and tag objects
+ inclusionType: 'include', // 'include'|'exclude'
+ displayType: 'excerpt', // 'excerpt'|'full'|'titleOnly'
+ titleFormat: 'h1', // 'h1'|'h2'|'h3'|'ul'
+ titlePosition: 'inTextBlock', // 'inTextBlock'|'aboveBlock',
+ titleAlignment: 'left', // 'left'|'center'|'right'
+ titleIsLink: false, // false|true
+ imagePadded: true, // true|false
+ //imageAlignment: 'centerPadded', // 'centerFull'|'centerPadded'|'left'|'right'|'alternate'|'none'
+ showAuthor: 'no', // 'no'|'aboveText'|'belowText'
+ authorPrecededBy: 'Author:',
+ showCategories: 'no', // 'no'|'aboveText'|'belowText'
+ categoriesPrecededBy: 'Categories:',
+ readMoreType: 'button', // 'link'|'button'
+ readMoreText: 'Read more', // 'link'|'button'
+ readMoreButton: {
+ text: 'Read more',
+ url: '[postLink]'
},
- relations: function() {
- return {
- readMoreButton: App.getBlockTypeModel('button'),
- divider: App.getBlockTypeModel('divider'),
- _container: App.getBlockTypeModel('container'),
- };
- },
- initialize: function() {
- base.BlockModel.prototype.initialize.apply(this);
- this.fetchPosts();
- this.on('change:amount change:contentType change:terms change:inclusionType change:displayType change:titleFormat change:titlePosition change:titleAlignment change:titleIsLink change:imagePadded change:showAuthor change:authorPrecededBy change:showCategories change:categoriesPrecededBy change:readMoreType change:readMoreText change:sortBy change:showDivider', this._scheduleFetchPosts, this);
- this.listenTo(this.get('readMoreButton'), 'change', this._scheduleFetchPosts);
- this.listenTo(this.get('divider'), 'change', this._scheduleFetchPosts);
- },
- fetchPosts: function() {
- var that = this;
- // TODO: Migrate to new AJAX queries
- //mailpoet_post_wpi('automated_latest_content.php', this.toJSON(), function(response) {
- //console.log('ALC fetched', arguments);
- //that.get('_container').get('blocks').reset(response, {parse: true});
- //}, function() {
- //console.log('ALC fetchPosts error', arguments);
- //});
- },
- /**
- * Batch more changes during a specific time, instead of fetching
- * ALC posts on each model change
- */
- _scheduleFetchPosts: function() {
- var timeout = 2000,
- that = this;
- if (this._fetchPostsTimer !== undefined) {
- clearTimeout(this._fetchPostsTimer);
- }
- this._fetchPostsTimer = setTimeout(function() {
- that.fetchPosts();
- that._fetchPostsTimer = undefined;
- }, timeout);
- },
- });
+ sortBy: 'newest', // 'newest'|'oldest',
+ showDivider: true, // true|false
+ divider: {},
+ _container: new (App.getBlockTypeModel('container'))(),
+ }, EditorApplication.getConfig().get('blockDefaults.automatedLatestContent'));
+ },
+ relations: function() {
+ return {
+ readMoreButton: App.getBlockTypeModel('button'),
+ divider: App.getBlockTypeModel('divider'),
+ _container: App.getBlockTypeModel('container'),
+ };
+ },
+ initialize: function() {
+ base.BlockModel.prototype.initialize.apply(this);
+ this.fetchPosts();
+ this.on('change:amount change:contentType change:terms change:inclusionType change:displayType change:titleFormat change:titlePosition change:titleAlignment change:titleIsLink change:imagePadded change:showAuthor change:authorPrecededBy change:showCategories change:categoriesPrecededBy change:readMoreType change:readMoreText change:sortBy change:showDivider', this._scheduleFetchPosts, this);
+ this.listenTo(this.get('readMoreButton'), 'change', this._scheduleFetchPosts);
+ this.listenTo(this.get('divider'), 'change', this._scheduleFetchPosts);
+ },
+ fetchPosts: function() {
+ var that = this;
+ // TODO: Migrate to new AJAX queries
+ //mailpoet_post_wpi('automated_latest_content.php', this.toJSON(), function(response) {
+ //console.log('ALC fetched', arguments);
+ //that.get('_container').get('blocks').reset(response, {parse: true});
+ //}, function() {
+ //console.log('ALC fetchPosts error', arguments);
+ //});
+ },
+ /**
+ * Batch more changes during a specific time, instead of fetching
+ * ALC posts on each model change
+ */
+ _scheduleFetchPosts: function() {
+ var timeout = 2000,
+ that = this;
+ if (this._fetchPostsTimer !== undefined) {
+ clearTimeout(this._fetchPostsTimer);
+ }
+ this._fetchPostsTimer = setTimeout(function() {
+ that.fetchPosts();
+ that._fetchPostsTimer = undefined;
+ }, timeout);
+ },
+ });
- Module.AutomatedLatestContentBlockView = base.BlockView.extend({
- className: "mailpoet_block mailpoet_automated_latest_content_block mailpoet_droppable_block",
- getTemplate: function() { return templates.automatedLatestContentBlock; },
- regions: {
- toolsRegion: '.mailpoet_tools',
- postsRegion: '.mailpoet_automated_latest_content_block_posts',
- },
- onDragSubstituteBy: function() { return Module.AutomatedLatestContentWidgetView; },
- onRender: function() {
- var ContainerView = App.getBlockTypeView('container'),
- renderOptions = {
- disableTextEditor: true,
- disableDragAndDrop: true,
- };
- this.toolsView = new Module.AutomatedLatestContentBlockToolsView({ model: this.model });
- this.toolsRegion.show(this.toolsView);
- this.postsRegion.show(new ContainerView({ model: this.model.get('_container'), renderOptions: renderOptions }));
- },
- });
+ Module.AutomatedLatestContentBlockView = base.BlockView.extend({
+ className: "mailpoet_block mailpoet_automated_latest_content_block mailpoet_droppable_block",
+ getTemplate: function() { return templates.automatedLatestContentBlock; },
+ regions: {
+ toolsRegion: '.mailpoet_tools',
+ postsRegion: '.mailpoet_automated_latest_content_block_posts',
+ },
+ onDragSubstituteBy: function() { return Module.AutomatedLatestContentWidgetView; },
+ onRender: function() {
+ var ContainerView = App.getBlockTypeView('container'),
+ renderOptions = {
+ disableTextEditor: true,
+ disableDragAndDrop: true,
+ };
+ this.toolsView = new Module.AutomatedLatestContentBlockToolsView({ model: this.model });
+ this.toolsRegion.show(this.toolsView);
+ this.postsRegion.show(new ContainerView({ model: this.model.get('_container'), renderOptions: renderOptions }));
+ },
+ });
- Module.AutomatedLatestContentBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.AutomatedLatestContentBlockSettingsView; },
- });
+ Module.AutomatedLatestContentBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.AutomatedLatestContentBlockSettingsView; },
+ });
- // Sidebar view container
- Module.AutomatedLatestContentBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.automatedLatestContentBlockSettings; },
- events: function() {
- return {
- "click .mailpoet_automated_latest_content_hide_display_options": 'toggleDisplayOptions',
- "click .mailpoet_automated_latest_content_show_display_options": 'toggleDisplayOptions',
- "click .mailpoet_automated_latest_content_select_button": 'showButtonSettings',
- "click .mailpoet_automated_latest_content_select_divider": 'showDividerSettings',
- "change .mailpoet_automated_latest_content_read_more_type": 'changeReadMoreType',
- "change .mailpoet_automated_latest_content_display_type": 'changeDisplayType',
- "change .mailpoet_automated_latest_content_title_format": 'changeTitleFormat',
- "change .mailpoet_automated_latest_content_title_as_links": _.partial(this.changeBoolField, 'titleIsLink'),
- "change .mailpoet_automated_latest_content_show_divider": _.partial(this.changeBoolField, 'showDivider'),
- "keyup .mailpoet_automated_latest_content_show_amount": _.partial(this.changeField, "amount"),
- "change .mailpoet_automated_latest_content_content_type": _.partial(this.changeField, "contentType"),
- "change .mailpoet_automated_latest_content_include_or_exclude": _.partial(this.changeField, "inclusionType"),
- "change .mailpoet_automated_latest_content_title_position": _.partial(this.changeField, "titlePosition"),
- "change .mailpoet_automated_latest_content_title_alignment": _.partial(this.changeField, "titleAlignment"),
- "change .mailpoet_automated_latest_content_image_padded": _.partial(this.changeBoolField, "imagePadded"),
- "change .mailpoet_automated_latest_content_show_author": _.partial(this.changeField, "showAuthor"),
- "keyup .mailpoet_automated_latest_content_author_preceded_by": _.partial(this.changeField, "authorPrecededBy"),
- "change .mailpoet_automated_latest_content_show_categories": _.partial(this.changeField, "showCategories"),
- "keyup .mailpoet_automated_latest_content_categories": _.partial(this.changeField, "categoriesPrecededBy"),
- "keyup .mailpoet_automated_latest_content_read_more_text": _.partial(this.changeField, "readMoreText"),
- "change .mailpoet_automated_latest_content_sort_by": _.partial(this.changeField, "sortBy"),
- "click .mailpoet_done_editing": "close",
- };
- },
- behaviors: {
- ColorPickerBehavior: {},
- },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- };
- },
- onRender: function() {
- var that = this;
+ // Sidebar view container
+ Module.AutomatedLatestContentBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.automatedLatestContentBlockSettings; },
+ events: function() {
+ return {
+ "click .mailpoet_automated_latest_content_hide_display_options": 'toggleDisplayOptions',
+ "click .mailpoet_automated_latest_content_show_display_options": 'toggleDisplayOptions',
+ "click .mailpoet_automated_latest_content_select_button": 'showButtonSettings',
+ "click .mailpoet_automated_latest_content_select_divider": 'showDividerSettings',
+ "change .mailpoet_automated_latest_content_read_more_type": 'changeReadMoreType',
+ "change .mailpoet_automated_latest_content_display_type": 'changeDisplayType',
+ "change .mailpoet_automated_latest_content_title_format": 'changeTitleFormat',
+ "change .mailpoet_automated_latest_content_title_as_links": _.partial(this.changeBoolField, 'titleIsLink'),
+ "change .mailpoet_automated_latest_content_show_divider": _.partial(this.changeBoolField, 'showDivider'),
+ "keyup .mailpoet_automated_latest_content_show_amount": _.partial(this.changeField, "amount"),
+ "change .mailpoet_automated_latest_content_content_type": _.partial(this.changeField, "contentType"),
+ "change .mailpoet_automated_latest_content_include_or_exclude": _.partial(this.changeField, "inclusionType"),
+ "change .mailpoet_automated_latest_content_title_position": _.partial(this.changeField, "titlePosition"),
+ "change .mailpoet_automated_latest_content_title_alignment": _.partial(this.changeField, "titleAlignment"),
+ "change .mailpoet_automated_latest_content_image_padded": _.partial(this.changeBoolField, "imagePadded"),
+ "change .mailpoet_automated_latest_content_show_author": _.partial(this.changeField, "showAuthor"),
+ "keyup .mailpoet_automated_latest_content_author_preceded_by": _.partial(this.changeField, "authorPrecededBy"),
+ "change .mailpoet_automated_latest_content_show_categories": _.partial(this.changeField, "showCategories"),
+ "keyup .mailpoet_automated_latest_content_categories": _.partial(this.changeField, "categoriesPrecededBy"),
+ "keyup .mailpoet_automated_latest_content_read_more_text": _.partial(this.changeField, "readMoreText"),
+ "change .mailpoet_automated_latest_content_sort_by": _.partial(this.changeField, "sortBy"),
+ "click .mailpoet_done_editing": "close",
+ };
+ },
+ behaviors: {
+ ColorPickerBehavior: {},
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ };
+ },
+ onRender: function() {
+ var that = this;
- this.$('.mailpoet_automated_latest_content_categories_and_tags').select2({
- multiple: true,
- allowClear: true,
- ajax: {
- url: App.getConfig().get('urls.termSearch'),
- type: 'POST',
- dataType: 'json',
- delay: 250,
- data: function(searchParameter, page) {
- return JSON.stringify({
- postType: that.model.get('contentType'),
- search: searchParameter,
- limit: 10, // TODO: Move this hardcoded limit to Config
- page: page,
- });
- },
- /**
- * Parse results for select2.
- * Returns object, where `results` key holds a list of
- * select item objects
- */
- results: function (data, page) {
- return {
- results: _.map(
- data.results,
- function(item) {
- return _.defaults({
- text: data.taxonomies[item.taxonomy].labels.singular_name + ': ' + item.name,
- id: item.term_id
- }, item);
- }
- )
- };
- }
- },
- initSelection: function(element, callback) {
- // On external data load tell select2 which terms to preselect
-
- callback(_.map(
- that.model.get('terms').toJSON(),
- function(item) {
- return {
- id: item.id,
- text: item.text,
- };
- }
- ));
- },
- }).trigger( 'change' ).on({
- 'change': function(e){
- var data = $(this).data('selected');
-
- if (typeof data === 'string') {
- if (data === '') {
- data = [];
- } else {
- data = JSON.parse(data);
- }
- }
-
- if ( e.added ){
- data.push(e.added);
- } else {
- data = _.filter(data, function(item) {
- return item.id !== e.removed.id;
- });
- }
-
- // Update ALC model
- that.model.set('terms', data);
-
- $(this).data('selected', JSON.stringify(data));
- }
+ this.$('.mailpoet_automated_latest_content_categories_and_tags').select2({
+ multiple: true,
+ allowClear: true,
+ ajax: {
+ url: App.getConfig().get('urls.termSearch'),
+ type: 'POST',
+ dataType: 'json',
+ delay: 250,
+ data: function(searchParameter, page) {
+ return JSON.stringify({
+ postType: that.model.get('contentType'),
+ search: searchParameter,
+ limit: 10, // TODO: Move this hardcoded limit to Config
+ page: page,
});
- },
- onBeforeDestroy: function() {
- // Force close select2 if it hasn't closed yet
- this.$('.mailpoet_automated_latest_content_categories_and_tags').select2('close');
- },
- toggleDisplayOptions: function(event) {
- var el = this.$('.mailpoet_automated_latest_content_display_options'),
- showControl = this.$('.mailpoet_automated_latest_content_show_display_options');
- if (el.hasClass('mailpoet_hidden')) {
- el.removeClass('mailpoet_hidden');
- showControl.addClass('mailpoet_hidden');
- } else {
- el.addClass('mailpoet_hidden');
- showControl.removeClass('mailpoet_hidden');
- }
- },
- showButtonSettings: function(event) {
- var buttonModule = App.module('blocks.button');
- (new buttonModule.ButtonBlockSettingsView({
- model: this.model.get('readMoreButton'),
- renderOptions: {
- displayFormat: 'subpanel',
- hideLink: true,
- hideApplyToAll: true,
- },
- })).render();
- },
- showDividerSettings: function(event) {
- var dividerModule = App.module('blocks.divider');
- (new dividerModule.DividerBlockSettingsView({
- model: this.model.get('divider'),
- renderOptions: {
- displayFormat: 'subpanel',
- hideApplyToAll: true,
- },
- })).render();
- },
- changeReadMoreType: function(event) {
- var value = jQuery(event.target).val();
- if (value == 'link') {
- this.$('.mailpoet_automated_latest_content_read_more_text').removeClass('mailpoet_hidden');
- this.$('.mailpoet_automated_latest_content_select_button').addClass('mailpoet_hidden');
- } else if (value == 'button') {
- this.$('.mailpoet_automated_latest_content_read_more_text').addClass('mailpoet_hidden');
- this.$('.mailpoet_automated_latest_content_select_button').removeClass('mailpoet_hidden');
- }
- this.changeField('readMoreType', event);
- },
- changeDisplayType: function(event) {
- var value = jQuery(event.target).val();
- if (value == 'titleOnly') {
- this.$('.mailpoet_automated_latest_content_title_position_container').addClass('mailpoet_hidden');
- this.$('.mailpoet_automated_latest_content_title_as_list').removeClass('mailpoet_hidden');
- } else {
- this.$('.mailpoet_automated_latest_content_title_position_container').removeClass('mailpoet_hidden');
- this.$('.mailpoet_automated_latest_content_title_as_list').addClass('mailpoet_hidden');
-
- // Reset titleFormat if it was set to List when switching away from displayType=titleOnly
- if (this.model.get('titleFormat') === 'ul') {
- this.model.set('titleFormat', 'h1');
- this.$('.mailpoet_automated_latest_content_title_format').val(['h1']);
- this.$('.mailpoet_automated_latest_content_title_as_link').removeClass('mailpoet_hidden');
+ },
+ /**
+ * Parse results for select2.
+ * Returns object, where `results` key holds a list of
+ * select item objects
+ */
+ results: function (data, page) {
+ return {
+ results: _.map(
+ data.results,
+ function(item) {
+ return _.defaults({
+ text: data.taxonomies[item.taxonomy].labels.singular_name + ': ' + item.name,
+ id: item.term_id
+ }, item);
}
- }
- this.changeField('displayType', event);
+ )
+ };
+ }
},
- changeTitleFormat: function(event) {
- var value = jQuery(event.target).val();
- if (value == 'ul') {
- this.$('.mailpoet_automated_latest_content_non_title_list_options').addClass('mailpoet_hidden');
+ initSelection: function(element, callback) {
+ // On external data load tell select2 which terms to preselect
- this.model.set('titleIsLink', true);
- this.$('.mailpoet_automated_latest_content_title_as_link').addClass('mailpoet_hidden');
- this.$('.mailpoet_automated_latest_content_title_as_links').val(['true']);
+ callback(_.map(
+ that.model.get('terms').toJSON(),
+ function(item) {
+ return {
+ id: item.id,
+ text: item.text,
+ };
+ }
+ ));
+ },
+ }).trigger( 'change' ).on({
+ 'change': function(e){
+ var data = $(this).data('selected');
+
+ if (typeof data === 'string') {
+ if (data === '') {
+ data = [];
} else {
- this.$('.mailpoet_automated_latest_content_non_title_list_options').removeClass('mailpoet_hidden');
- this.$('.mailpoet_automated_latest_content_title_as_link').removeClass('mailpoet_hidden');
+ data = JSON.parse(data);
}
- this.changeField('titleFormat', event);
+ }
+
+ if ( e.added ){
+ data.push(e.added);
+ } else {
+ data = _.filter(data, function(item) {
+ return item.id !== e.removed.id;
+ });
+ }
+
+ // Update ALC model
+ that.model.set('terms', data);
+
+ $(this).data('selected', JSON.stringify(data));
+ }
+ });
+ },
+ onBeforeDestroy: function() {
+ // Force close select2 if it hasn't closed yet
+ this.$('.mailpoet_automated_latest_content_categories_and_tags').select2('close');
+ },
+ toggleDisplayOptions: function(event) {
+ var el = this.$('.mailpoet_automated_latest_content_display_options'),
+ showControl = this.$('.mailpoet_automated_latest_content_show_display_options');
+ if (el.hasClass('mailpoet_hidden')) {
+ el.removeClass('mailpoet_hidden');
+ showControl.addClass('mailpoet_hidden');
+ } else {
+ el.addClass('mailpoet_hidden');
+ showControl.removeClass('mailpoet_hidden');
+ }
+ },
+ showButtonSettings: function(event) {
+ var buttonModule = App.module('blocks.button');
+ (new buttonModule.ButtonBlockSettingsView({
+ model: this.model.get('readMoreButton'),
+ renderOptions: {
+ displayFormat: 'subpanel',
+ hideLink: true,
+ hideApplyToAll: true,
},
- });
-
- Module.AutomatedLatestContentWidgetView = base.WidgetView.extend({
- getTemplate: function() { return templates.automatedLatestContentInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.AutomatedLatestContentBlockModel({}, { parse: true });
- }
- }
+ })).render();
+ },
+ showDividerSettings: function(event) {
+ var dividerModule = App.module('blocks.divider');
+ (new dividerModule.DividerBlockSettingsView({
+ model: this.model.get('divider'),
+ renderOptions: {
+ displayFormat: 'subpanel',
+ hideApplyToAll: true,
},
+ })).render();
+ },
+ changeReadMoreType: function(event) {
+ var value = jQuery(event.target).val();
+ if (value == 'link') {
+ this.$('.mailpoet_automated_latest_content_read_more_text').removeClass('mailpoet_hidden');
+ this.$('.mailpoet_automated_latest_content_select_button').addClass('mailpoet_hidden');
+ } else if (value == 'button') {
+ this.$('.mailpoet_automated_latest_content_read_more_text').addClass('mailpoet_hidden');
+ this.$('.mailpoet_automated_latest_content_select_button').removeClass('mailpoet_hidden');
+ }
+ this.changeField('readMoreType', event);
+ },
+ changeDisplayType: function(event) {
+ var value = jQuery(event.target).val();
+ if (value == 'titleOnly') {
+ this.$('.mailpoet_automated_latest_content_title_position_container').addClass('mailpoet_hidden');
+ this.$('.mailpoet_automated_latest_content_title_as_list').removeClass('mailpoet_hidden');
+ } else {
+ this.$('.mailpoet_automated_latest_content_title_position_container').removeClass('mailpoet_hidden');
+ this.$('.mailpoet_automated_latest_content_title_as_list').addClass('mailpoet_hidden');
+
+ // Reset titleFormat if it was set to List when switching away from displayType=titleOnly
+ if (this.model.get('titleFormat') === 'ul') {
+ this.model.set('titleFormat', 'h1');
+ this.$('.mailpoet_automated_latest_content_title_format').val(['h1']);
+ this.$('.mailpoet_automated_latest_content_title_as_link').removeClass('mailpoet_hidden');
+ }
+ }
+ this.changeField('displayType', event);
+ },
+ changeTitleFormat: function(event) {
+ var value = jQuery(event.target).val();
+ if (value == 'ul') {
+ this.$('.mailpoet_automated_latest_content_non_title_list_options').addClass('mailpoet_hidden');
+
+ this.model.set('titleIsLink', true);
+ this.$('.mailpoet_automated_latest_content_title_as_link').addClass('mailpoet_hidden');
+ this.$('.mailpoet_automated_latest_content_title_as_links').val(['true']);
+ } else {
+ this.$('.mailpoet_automated_latest_content_non_title_list_options').removeClass('mailpoet_hidden');
+ this.$('.mailpoet_automated_latest_content_title_as_link').removeClass('mailpoet_hidden');
+ }
+ this.changeField('titleFormat', event);
+ },
+ });
+
+ Module.AutomatedLatestContentWidgetView = base.WidgetView.extend({
+ getTemplate: function() { return templates.automatedLatestContentInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.AutomatedLatestContentBlockModel({}, { parse: true });
+ }
+ }
+ },
+ });
+
+ App.on('before:start', function() {
+ App.registerBlockType('automatedLatestContent', {
+ blockModel: Module.AutomatedLatestContentBlockModel,
+ blockView: Module.AutomatedLatestContentBlockView,
});
- App.on('before:start', function() {
- App.registerBlockType('automatedLatestContent', {
- blockModel: Module.AutomatedLatestContentBlockModel,
- blockView: Module.AutomatedLatestContentBlockView,
- });
-
- App.registerWidget({
- name: 'automatedLatestContent',
- widgetView: Module.AutomatedLatestContentWidgetView,
- priority: 97,
- });
+ App.registerWidget({
+ name: 'automatedLatestContent',
+ widgetView: Module.AutomatedLatestContentWidgetView,
+ priority: 97,
});
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/base.js b/assets/js/src/newsletter_editor/blocks/base.js
index 15198a1b89..eac5780def 100644
--- a/assets/js/src/newsletter_editor/blocks/base.js
+++ b/assets/js/src/newsletter_editor/blocks/base.js
@@ -13,207 +13,206 @@ define('newsletter_editor/blocks/base', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.base", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var AugmentedView = Marionette.LayoutView.extend({});
+ var AugmentedView = Marionette.LayoutView.extend({});
- Module.BlockModel = Backbone.SuperModel.extend({
- stale: [], // Attributes to be removed upon saving
- initialize: function() {
- var that = this;
- this.on('change', function() {
- App.getChannel().trigger('autoSave');
- });
- },
- _getDefaults: function(blockDefaults, configDefaults) {
- var defaults = (_.isObject(configDefaults) && _.isFunction(configDefaults.toJSON)) ? configDefaults.toJSON() : configDefaults;
+ Module.BlockModel = Backbone.SuperModel.extend({
+ stale: [], // Attributes to be removed upon saving
+ initialize: function() {
+ var that = this;
+ this.on('change', function() {
+ App.getChannel().trigger('autoSave');
+ });
+ },
+ _getDefaults: function(blockDefaults, configDefaults) {
+ var defaults = (_.isObject(configDefaults) && _.isFunction(configDefaults.toJSON)) ? configDefaults.toJSON() : configDefaults;
- // Patch the resulting JSON object and fix it's constructors to be Object.
- // Otherwise Backbone.SuperModel interprets it not as a simpleObject
- // and misbehaves
- // TODO: Investigate for a better solution
- return JSON.parse(JSON.stringify(jQuery.extend(blockDefaults, defaults || {})));
- },
- toJSON: function() {
- // Remove stale attributes from resulting JSON object
- return _.omit(Backbone.SuperModel.prototype.toJSON.call(this), this.stale);
- },
- });
+ // Patch the resulting JSON object and fix it's constructors to be Object.
+ // Otherwise Backbone.SuperModel interprets it not as a simpleObject
+ // and misbehaves
+ // TODO: Investigate for a better solution
+ return JSON.parse(JSON.stringify(jQuery.extend(blockDefaults, defaults || {})));
+ },
+ toJSON: function() {
+ // Remove stale attributes from resulting JSON object
+ return _.omit(Backbone.SuperModel.prototype.toJSON.call(this), this.stale);
+ },
+ });
- Module.BlockView = AugmentedView.extend({
- regions: {
- toolsRegion: '> .mailpoet_tools',
+ Module.BlockView = AugmentedView.extend({
+ regions: {
+ toolsRegion: '> .mailpoet_tools',
+ },
+ modelEvents: {
+ 'change': 'render',
+ },
+ events: {
+ "mouseenter": "showTools",
+ "mouseleave": "hideTools",
+ },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ hideOriginal: true,
+ onDrop: function(options) {
+ // After a clone of model has been dropped, cleanup
+ // and destroy self
+ options.dragBehavior.view.model.destroy();
},
- modelEvents: {
- 'change': 'render',
+ onDragSubstituteBy: function(behavior) {
+ var WidgetView, node;
+ // When block is being dragged, display the widget icon instead.
+ // This will create an instance of block's widget view and
+ // use it's rendered DOM element instead of the content block
+ if (_.isFunction(behavior.view.onDragSubstituteBy)) {
+ WidgetView = new (behavior.view.onDragSubstituteBy())();
+ WidgetView.render();
+ node = WidgetView.$el.get(0).cloneNode(true);
+ WidgetView.destroy();
+ return node;
+ }
},
- events: {
- "mouseenter": "showTools",
- "mouseleave": "hideTools",
- },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- hideOriginal: true,
- onDrop: function(options) {
- // After a clone of model has been dropped, cleanup
- // and destroy self
- options.dragBehavior.view.model.destroy();
- },
- onDragSubstituteBy: function(behavior) {
- var WidgetView, node;
- // When block is being dragged, display the widget icon instead.
- // This will create an instance of block's widget view and
- // use it's rendered DOM element instead of the content block
- if (_.isFunction(behavior.view.onDragSubstituteBy)) {
- WidgetView = new (behavior.view.onDragSubstituteBy())();
- WidgetView.render();
- node = WidgetView.$el.get(0).cloneNode(true);
- WidgetView.destroy();
- return node;
- }
- },
- },
- },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- viewCid: this.cid,
- };
- },
- constructor: function() {
- AugmentedView.apply(this, arguments);
- this.$el.addClass('mailpoet_editor_view_' + this.cid);
- },
- showTools: function(_event) {
- if (!this.showingToolsDisabled) {
- this.$('> .mailpoet_tools').show();
- this.toolsView.triggerMethod('showTools');
- }
- },
- hideTools: function(e) {
- this.$('> .mailpoet_tools').hide();
- this.toolsView.triggerMethod('hideTools');
- },
- enableShowingTools: function() {
- this.showingToolsDisabled = false;
- },
- disableShowingTools: function() {
- this.showingToolsDisabled = true;
- this.hideTools();
- },
- /**
- * Defines drop behavior of BlockView instance
- */
- getDropFunc: function() {
- var that = this;
- return function() {
- var newModel = that.model.clone();
- //that.model.destroy();
- return newModel;
- };
- },
- });
+ },
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ viewCid: this.cid,
+ };
+ },
+ constructor: function() {
+ AugmentedView.apply(this, arguments);
+ this.$el.addClass('mailpoet_editor_view_' + this.cid);
+ },
+ showTools: function(_event) {
+ if (!this.showingToolsDisabled) {
+ this.$('> .mailpoet_tools').show();
+ this.toolsView.triggerMethod('showTools');
+ }
+ },
+ hideTools: function(e) {
+ this.$('> .mailpoet_tools').hide();
+ this.toolsView.triggerMethod('hideTools');
+ },
+ enableShowingTools: function() {
+ this.showingToolsDisabled = false;
+ },
+ disableShowingTools: function() {
+ this.showingToolsDisabled = true;
+ this.hideTools();
+ },
+ /**
+ * Defines drop behavior of BlockView instance
+ */
+ getDropFunc: function() {
+ var that = this;
+ return function() {
+ var newModel = that.model.clone();
+ //that.model.destroy();
+ return newModel;
+ };
+ },
+ });
- Module.BlockToolsView = AugmentedView.extend({
- getTemplate: function() { return templates.genericBlockTools; },
- events: {
- "click .mailpoet_edit_block": "changeSettings",
- "click .mailpoet_delete_block_activate": "showDeletionConfirmation",
- "click .mailpoet_delete_block_cancel": "hideDeletionConfirmation",
- "click .mailpoet_delete_block_confirm": "deleteBlock",
- },
- // Markers of whether these particular tools will be used for this instance
- tools: {
- settings: true,
- delete: true,
- move: true,
- },
- getSettingsView: function() { return Module.BlockSettingsView; },
- initialize: function(options) {
- options = options || {};
- if (!_.isUndefined(options.tools)) {
- // Make a new block specific tool config object
- this.tools = jQuery.extend({}, this.tools, options.tools || {});
- }
+ Module.BlockToolsView = AugmentedView.extend({
+ getTemplate: function() { return templates.genericBlockTools; },
+ events: {
+ "click .mailpoet_edit_block": "changeSettings",
+ "click .mailpoet_delete_block_activate": "showDeletionConfirmation",
+ "click .mailpoet_delete_block_cancel": "hideDeletionConfirmation",
+ "click .mailpoet_delete_block_confirm": "deleteBlock",
+ },
+ // Markers of whether these particular tools will be used for this instance
+ tools: {
+ settings: true,
+ delete: true,
+ move: true,
+ },
+ getSettingsView: function() { return Module.BlockSettingsView; },
+ initialize: function(options) {
+ options = options || {};
+ if (!_.isUndefined(options.tools)) {
+ // Make a new block specific tool config object
+ this.tools = jQuery.extend({}, this.tools, options.tools || {});
+ }
- // Automatically cancel deletion
- this.on('hideTools', this.hideDeletionConfirmation, this);
+ // Automatically cancel deletion
+ this.on('hideTools', this.hideDeletionConfirmation, this);
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ viewCid: this.cid,
+ tools: this.tools,
+ };
+ },
+ changeSettings: function() {
+ var ViewType = this.getSettingsView();
+ (new ViewType({ model: this.model })).render();
+ },
+ showDeletionConfirmation: function() {
+ this.$('.mailpoet_delete_block').addClass('mailpoet_delete_block_activated');
+ },
+ hideDeletionConfirmation: function() {
+ this.$('.mailpoet_delete_block').removeClass('mailpoet_delete_block_activated');
+ },
+ deleteBlock: function(event) {
+ event.preventDefault();
+ this.model.destroy();
+ return false;
+ }
+ });
+
+ Module.BlockSettingsView = Marionette.LayoutView.extend({
+ className: 'mailpoet_editor_settings',
+ initialize: function() {
+ var that = this;
+
+ MailPoet.Modal.panel({
+ element: this.$el,
+ template: '',
+ position: 'right',
+ width: App.getConfig().get('sidepanelWidth'),
+ onCancel: function() {
+ that.destroy();
},
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- viewCid: this.cid,
- tools: this.tools,
- };
- },
- changeSettings: function() {
- var ViewType = this.getSettingsView();
- (new ViewType({ model: this.model })).render();
- },
- showDeletionConfirmation: function() {
- this.$('.mailpoet_delete_block').addClass('mailpoet_delete_block_activated');
- },
- hideDeletionConfirmation: function() {
- this.$('.mailpoet_delete_block').removeClass('mailpoet_delete_block_activated');
- },
- deleteBlock: function(event) {
- event.preventDefault();
- this.model.destroy();
- return false;
+ });
+ },
+ close: function(event) {
+ MailPoet.Modal.cancel();
+ this.destroy();
+ },
+ changeField: function(field, event) {
+ this.model.set(field, jQuery(event.target).val());
+ },
+ changePixelField: function(field, event) {
+ this.changeFieldWithSuffix(field, event, 'px');
+ },
+ changeFieldWithSuffix: function(field, event, suffix) {
+ this.model.set(field, jQuery(event.target).val() + suffix);
+ },
+ changeBoolField: function(field, event) {
+ this.model.set(field, (jQuery(event.target).val() === 'true') ? true : false);
+ },
+ changeColorField: function(field, event) {
+ var value = jQuery(event.target).val();
+ if (value === '') {
+ value = 'transparent';
+ }
+ this.model.set(field, value);
+ },
+ });
+
+ Module.WidgetView = Marionette.ItemView.extend({
+ className: 'mailpoet_widget mailpoet_droppable_block mailpoet_droppable_widget',
+ behaviors: {
+ DraggableBehavior: {
+ drop: function() {
+ throw "Unsupported operation";
}
- });
-
- Module.BlockSettingsView = Marionette.LayoutView.extend({
- className: 'mailpoet_editor_settings',
- initialize: function() {
- var that = this;
-
- MailPoet.Modal.panel({
- element: this.$el,
- template: '',
- position: 'right',
- width: App.getConfig().get('sidepanelWidth'),
- onCancel: function() {
- that.destroy();
- },
- });
- },
- close: function(event) {
- MailPoet.Modal.cancel();
- this.destroy();
- },
- changeField: function(field, event) {
- this.model.set(field, jQuery(event.target).val());
- },
- changePixelField: function(field, event) {
- this.changeFieldWithSuffix(field, event, 'px');
- },
- changeFieldWithSuffix: function(field, event, suffix) {
- this.model.set(field, jQuery(event.target).val() + suffix);
- },
- changeBoolField: function(field, event) {
- this.model.set(field, (jQuery(event.target).val() === 'true') ? true : false);
- },
- changeColorField: function(field, event) {
- var value = jQuery(event.target).val();
- if (value === '') {
- value = 'transparent';
- }
- this.model.set(field, value);
- },
- });
-
- Module.WidgetView = Marionette.ItemView.extend({
- className: 'mailpoet_widget mailpoet_droppable_block mailpoet_droppable_widget',
- behaviors: {
- DraggableBehavior: {
- drop: function() {
- throw "Unsupported operation";
- }
- }
- },
- });
+ }
+ },
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/button.js b/assets/js/src/newsletter_editor/blocks/button.js
index 24529f0f0a..e5ad187bf5 100644
--- a/assets/js/src/newsletter_editor/blocks/button.js
+++ b/assets/js/src/newsletter_editor/blocks/button.js
@@ -9,154 +9,153 @@ define('newsletter_editor/blocks/button', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.button", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base');
+ var base = App.module('blocks.base');
- Module.ButtonBlockModel = base.BlockModel.extend({
- defaults: function() {
- return this._getDefaults({
- type: 'button',
- text: 'Button',
- url: 'http://google.com',
- styles: {
- block: {
- backgroundColor: '#ff0000',
- borderColor: '#cccccc',
- borderWidth: '1px',
- borderRadius: '4px',
- borderStyle: 'solid',
- width: '200px',
- lineHeight: '40px',
- fontColor: '#000000',
- fontFamily: 'Arial',
- fontSize: '16px',
- textAlign: 'center',
- },
- },
- }, EditorApplication.getConfig().get('blockDefaults.button'));
+ Module.ButtonBlockModel = base.BlockModel.extend({
+ defaults: function() {
+ return this._getDefaults({
+ type: 'button',
+ text: 'Button',
+ url: 'http://google.com',
+ styles: {
+ block: {
+ backgroundColor: '#ff0000',
+ borderColor: '#cccccc',
+ borderWidth: '1px',
+ borderRadius: '4px',
+ borderStyle: 'solid',
+ width: '200px',
+ lineHeight: '40px',
+ fontColor: '#000000',
+ fontFamily: 'Arial',
+ fontSize: '16px',
+ textAlign: 'center',
+ },
},
+ }, EditorApplication.getConfig().get('blockDefaults.button'));
+ },
+ });
+
+ Module.ButtonBlockView = base.BlockView.extend({
+ className: "mailpoet_block mailpoet_button_block mailpoet_droppable_block",
+ getTemplate: function() { return templates.buttonBlock; },
+ modelEvents: {
+ 'change': 'render',
+ },
+ onDragSubstituteBy: function() { return Module.ButtonWidgetView; },
+ initialize: function() {
+ base.BlockView.prototype.initialize.apply(this, arguments);
+ var that = this;
+
+ // Listen for attempts to change all dividers in one go
+ this._replaceButtonStylesHandler = function(data) { that.model.set(data); };
+ App.getChannel().on('replaceAllButtonStyles', this._replaceButtonStylesHandler);
+ },
+ onRender: function() {
+ this.toolsView = new Module.ButtonBlockToolsView({ model: this.model });
+ this.toolsRegion.show(this.toolsView);
+ },
+ });
+
+ Module.ButtonBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.ButtonBlockSettingsView; },
+ });
+
+ Module.ButtonBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.buttonBlockSettings; },
+ events: function() {
+ return {
+ "keyup .mailpoet_field_button_text": _.partial(this.changeField, "text"),
+ "keyup .mailpoet_field_button_url": _.partial(this.changeField, "url"),
+ "change .mailpoet_field_button_alignment": _.partial(this.changeField, "styles.block.textAlign"),
+ "change .mailpoet_field_button_font_color": _.partial(this.changeColorField, "styles.block.fontColor"),
+ "change .mailpoet_field_button_font_family": _.partial(this.changeField, "styles.block.fontFamily"),
+ "change .mailpoet_field_button_font_size": _.partial(this.changeField, "styles.block.fontSize"),
+ "change .mailpoet_field_button_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
+ "change .mailpoet_field_button_border_color": _.partial(this.changeColorField, "styles.block.borderColor"),
+
+ "input .mailpoet_field_button_border_width": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_width_input', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
+ "change .mailpoet_field_button_border_width": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_width_input', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
+ "change .mailpoet_field_button_border_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_width', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
+ "keyup .mailpoet_field_button_border_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_width', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
+
+ "input .mailpoet_field_button_border_radius": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_radius_input', _.partial(this.changePixelField, "styles.block.borderRadius").bind(this)),
+ "change .mailpoet_field_button_border_radius": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_radius_input', _.partial(this.changePixelField, "styles.block.borderRadius").bind(this)),
+ "change .mailpoet_field_button_border_radius_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_radius', _.partial(this.changePixelField, "styles.block.borderRadius").bind(this)),
+ "keyup .mailpoet_field_button_border_radius_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_radius', _.partial(this.changePixelField, "styles.block.borderRadius").bind(this)),
+
+ "input .mailpoet_field_button_width": _.partial(this.updateValueAndCall, '.mailpoet_field_button_width_input', _.partial(this.changePixelField, "styles.block.width").bind(this)),
+ "change .mailpoet_field_button_width": _.partial(this.updateValueAndCall, '.mailpoet_field_button_width_input', _.partial(this.changePixelField, "styles.block.width").bind(this)),
+ "change .mailpoet_field_button_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_width', _.partial(this.changePixelField, "styles.block.width").bind(this)),
+ "keyup .mailpoet_field_button_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_width', _.partial(this.changePixelField, "styles.block.width").bind(this)),
+
+ "input .mailpoet_field_button_line_height": _.partial(this.updateValueAndCall, '.mailpoet_field_button_line_height_input', _.partial(this.changePixelField, "styles.block.lineHeight").bind(this)),
+ "change .mailpoet_field_button_line_height": _.partial(this.updateValueAndCall, '.mailpoet_field_button_line_height_input', _.partial(this.changePixelField, "styles.block.lineHeight").bind(this)),
+ "change .mailpoet_field_button_line_height_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_line_height', _.partial(this.changePixelField, "styles.block.lineHeight").bind(this)),
+ "keyup .mailpoet_field_button_line_height_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_line_height', _.partial(this.changePixelField, "styles.block.lineHeight").bind(this)),
+
+ "click .mailpoet_field_button_replace_all_styles": "applyToAll",
+ "click .mailpoet_done_editing": "close",
+ };
+ },
+ behaviors: {
+ ColorPickerBehavior: {},
+ },
+ initialize: function(params) {
+ var panelParams = {
+ element: this.$el,
+ template: '',
+ position: 'right',
+ width: App.getConfig().get('sidepanelWidth'),
+ };
+ this.renderOptions = params.renderOptions || {};
+ if (this.renderOptions.displayFormat === 'subpanel') {
+ MailPoet.Modal.subpanel(panelParams);
+ } else {
+ MailPoet.Modal.panel(panelParams);
+ }
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ availableStyles: App.getAvailableStyles().toJSON(),
+ renderOptions: this.renderOptions,
+ };
+ },
+ applyToAll: function() {
+ App.getChannel().trigger('replaceAllButtonStyles', _.pick(this.model.toJSON(), 'styles', 'type'));
+ },
+ updateValueAndCall: function(fieldToUpdate, callable, event) {
+ this.$(fieldToUpdate).val(jQuery(event.target).val());
+ callable(event);
+ },
+ });
+
+ Module.ButtonWidgetView = base.WidgetView.extend({
+ getTemplate: function() { return templates.buttonInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.ButtonBlockModel();
+ },
+ }
+ },
+ });
+
+ App.on('before:start', function() {
+ App.registerBlockType('button', {
+ blockModel: Module.ButtonBlockModel,
+ blockView: Module.ButtonBlockView,
});
- Module.ButtonBlockView = base.BlockView.extend({
- className: "mailpoet_block mailpoet_button_block mailpoet_droppable_block",
- getTemplate: function() { return templates.buttonBlock; },
- modelEvents: {
- 'change': 'render',
- },
- onDragSubstituteBy: function() { return Module.ButtonWidgetView; },
- initialize: function() {
- base.BlockView.prototype.initialize.apply(this, arguments);
- var that = this;
-
- // Listen for attempts to change all dividers in one go
- this._replaceButtonStylesHandler = function(data) { that.model.set(data); };
- App.getChannel().on('replaceAllButtonStyles', this._replaceButtonStylesHandler);
- },
- onRender: function() {
- this.toolsView = new Module.ButtonBlockToolsView({ model: this.model });
- this.toolsRegion.show(this.toolsView);
- },
- });
-
- Module.ButtonBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.ButtonBlockSettingsView; },
- });
-
- Module.ButtonBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.buttonBlockSettings; },
- events: function() {
- return {
- "keyup .mailpoet_field_button_text": _.partial(this.changeField, "text"),
- "keyup .mailpoet_field_button_url": _.partial(this.changeField, "url"),
- "change .mailpoet_field_button_alignment": _.partial(this.changeField, "styles.block.textAlign"),
- "change .mailpoet_field_button_font_color": _.partial(this.changeColorField, "styles.block.fontColor"),
- "change .mailpoet_field_button_font_family": _.partial(this.changeField, "styles.block.fontFamily"),
- "change .mailpoet_field_button_font_size": _.partial(this.changeField, "styles.block.fontSize"),
- "change .mailpoet_field_button_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
- "change .mailpoet_field_button_border_color": _.partial(this.changeColorField, "styles.block.borderColor"),
-
- "input .mailpoet_field_button_border_width": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_width_input', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
- "change .mailpoet_field_button_border_width": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_width_input', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
- "change .mailpoet_field_button_border_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_width', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
- "keyup .mailpoet_field_button_border_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_width', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
-
- "input .mailpoet_field_button_border_radius": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_radius_input', _.partial(this.changePixelField, "styles.block.borderRadius").bind(this)),
- "change .mailpoet_field_button_border_radius": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_radius_input', _.partial(this.changePixelField, "styles.block.borderRadius").bind(this)),
- "change .mailpoet_field_button_border_radius_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_radius', _.partial(this.changePixelField, "styles.block.borderRadius").bind(this)),
- "keyup .mailpoet_field_button_border_radius_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_border_radius', _.partial(this.changePixelField, "styles.block.borderRadius").bind(this)),
-
- "input .mailpoet_field_button_width": _.partial(this.updateValueAndCall, '.mailpoet_field_button_width_input', _.partial(this.changePixelField, "styles.block.width").bind(this)),
- "change .mailpoet_field_button_width": _.partial(this.updateValueAndCall, '.mailpoet_field_button_width_input', _.partial(this.changePixelField, "styles.block.width").bind(this)),
- "change .mailpoet_field_button_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_width', _.partial(this.changePixelField, "styles.block.width").bind(this)),
- "keyup .mailpoet_field_button_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_width', _.partial(this.changePixelField, "styles.block.width").bind(this)),
-
- "input .mailpoet_field_button_line_height": _.partial(this.updateValueAndCall, '.mailpoet_field_button_line_height_input', _.partial(this.changePixelField, "styles.block.lineHeight").bind(this)),
- "change .mailpoet_field_button_line_height": _.partial(this.updateValueAndCall, '.mailpoet_field_button_line_height_input', _.partial(this.changePixelField, "styles.block.lineHeight").bind(this)),
- "change .mailpoet_field_button_line_height_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_line_height', _.partial(this.changePixelField, "styles.block.lineHeight").bind(this)),
- "keyup .mailpoet_field_button_line_height_input": _.partial(this.updateValueAndCall, '.mailpoet_field_button_line_height', _.partial(this.changePixelField, "styles.block.lineHeight").bind(this)),
-
- "click .mailpoet_field_button_replace_all_styles": "applyToAll",
- "click .mailpoet_done_editing": "close",
- };
- },
- behaviors: {
- ColorPickerBehavior: {},
- },
- initialize: function(params) {
- var panelParams = {
- element: this.$el,
- template: '',
- position: 'right',
- width: App.getConfig().get('sidepanelWidth'),
- };
- this.renderOptions = params.renderOptions || {};
- if (this.renderOptions.displayFormat === 'subpanel') {
- MailPoet.Modal.subpanel(panelParams);
- } else {
- MailPoet.Modal.panel(panelParams);
- }
- },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- availableStyles: App.getAvailableStyles().toJSON(),
- renderOptions: this.renderOptions,
- };
- },
- applyToAll: function() {
- App.getChannel().trigger('replaceAllButtonStyles', _.pick(this.model.toJSON(), 'styles', 'type'));
- },
- updateValueAndCall: function(fieldToUpdate, callable, event) {
- this.$(fieldToUpdate).val(jQuery(event.target).val());
- callable(event);
- },
- });
-
- Module.ButtonWidgetView = base.WidgetView.extend({
- getTemplate: function() { return templates.buttonInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.ButtonBlockModel();
- },
- }
- },
- });
-
- App.on('before:start', function() {
- App.registerBlockType('button', {
- blockModel: Module.ButtonBlockModel,
- blockView: Module.ButtonBlockView,
- });
-
- App.registerWidget({
- name: 'button',
- widgetView: Module.ButtonWidgetView,
- priority: 92,
- });
+ App.registerWidget({
+ name: 'button',
+ widgetView: Module.ButtonWidgetView,
+ priority: 92,
});
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/container.js b/assets/js/src/newsletter_editor/blocks/container.js
index 9a58665505..553739e596 100644
--- a/assets/js/src/newsletter_editor/blocks/container.js
+++ b/assets/js/src/newsletter_editor/blocks/container.js
@@ -11,338 +11,337 @@ define('newsletter_editor/blocks/container', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.container", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base'),
- BlockCollection;
+ var base = App.module('blocks.base'),
+ BlockCollection;
- Module.ContainerBlockModel = base.BlockModel.extend({
- defaults: function() {
- return this._getDefaults({
- type: 'container',
- orientation: 'vertical',
- styles: {
- block: {
- backgroundColor: 'transparent',
- },
- },
- blocks: new BlockCollection(),
- }, EditorApplication.getConfig().get('blockDefaults.container'));
+ Module.ContainerBlockModel = base.BlockModel.extend({
+ defaults: function() {
+ return this._getDefaults({
+ type: 'container',
+ orientation: 'vertical',
+ styles: {
+ block: {
+ backgroundColor: 'transparent',
+ },
},
- parse: function(response) {
- // If container has any blocks - add them to a collection
- if (response.type === 'container' && _.has(response, 'blocks')) {
- response.blocks = new BlockCollection(response.blocks, {
- parse: true,
- });
- }
- return response;
- },
- validate: function() {
- // Recursively propagate validation checks to blocks in the tree
- var invalidBlock = this.get('blocks').find(function(block) { return !block.isValid(); });
- if (invalidBlock) {
- return invalidBlock.validationError;
- }
- },
- });
-
- BlockCollection = Backbone.Collection.extend({
- model: base.BlockModel,
- initialize: function() {
- this.on('add change remove', function() { App.getChannel().trigger('autoSave'); });
- },
- parse: function(response) {
- var self = this;
- return _.map(response, function(block) {
- var Type = App.getBlockTypeModel(block.type);
- // TODO: If type has no registered model, use a backup one
- return new Type(block, {parse: true});
- });
- },
- });
-
- Module.ContainerBlockView = Marionette.CompositeView.extend({
- regionClass: Marionette.Region,
- className: 'mailpoet_block mailpoet_container_block mailpoet_droppable_block mailpoet_droppable_layout_block',
- getTemplate: function() { return templates.containerBlock; },
- childViewContainer: '> .mailpoet_container',
- getEmptyView: function() { return Module.ContainerBlockEmptyView; },
- emptyViewOptions: function() { return { renderOptions: this.renderOptions }; },
- modelEvents: {
- 'change': 'render'
- },
- events: {
- "mouseenter": "showTools",
- "mouseleave": "hideTools",
- "click .mailpoet_newsletter_layer_selector": "toggleEditingLayer",
- },
- regions: {
- toolsRegion: '> .mailpoet_tools',
- },
- ui: {
- tools: '> .mailpoet_tools'
- },
- behaviors: {
- ContainerDropZoneBehavior: {},
- DraggableBehavior: {
- cloneOriginal: true,
- hideOriginal: true,
- onDrop: function(options) {
- // After a clone of model has been dropped, cleanup
- // and destroy self
- options.dragBehavior.view.model.destroy();
- },
- onDragSubstituteBy: function(behavior) {
- var WidgetView, node;
- // When block is being dragged, display the widget icon instead.
- // This will create an instance of block's widget view and
- // use it's rendered DOM element instead of the content block
- if (_.isFunction(behavior.view.onDragSubstituteBy)) {
- WidgetView = new (behavior.view.onDragSubstituteBy())();
- WidgetView.render();
- node = WidgetView.$el.get(0).cloneNode(true);
- WidgetView.destroy();
- return node;
- }
- },
- testAttachToInstance: function(model, view) {
- // Attach Draggable only to layout containers and disable it
- // for root and column containers.
- return view.renderOptions.depth === 1;
- },
- },
- },
- onDragSubstituteBy: function() {
- // For two and three column layouts display their respective widgets,
- // otherwise always default to one column layout widget
- if (this.renderOptions.depth === 1) {
- if (this.model.get('blocks').length === 3) return Module.ThreeColumnContainerWidgetView;
- if (this.model.get('blocks').length === 2) return Module.TwoColumnContainerWidgetView;
- }
- return Module.OneColumnContainerWidgetView;
-
- },
- constructor: function() {
- // Set the block collection to be handled by this view as well
- arguments[0].collection = arguments[0].model.get('blocks');
- Marionette.CompositeView.apply(this, arguments);
- this.$el.addClass('mailpoet_editor_view_' + this.cid);
- },
- initialize: function(options) {
- this.renderOptions = _.defaults(options.renderOptions || {}, {});
- },
- // Determines which view type should be used for a child
- getChildView: function(model) {
- // TODO: If type does not have a type registered, use a generic one
- return App.getBlockTypeView(model.get('type'));
- },
- childViewOptions: function() {
- var newRenderOptions = _.clone(this.renderOptions);
- if (newRenderOptions.depth !== undefined) {
- newRenderOptions.depth += 1;
- }
- return {
- renderOptions: newRenderOptions
- };
- },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- viewCid: this.cid,
- };
- },
- onRender: function() {
- this._rebuildRegions();
- this.toolsView = new Module.ContainerBlockToolsView({
- model: this.model,
- tools: {
- settings: this.renderOptions.depth > 1,
- delete: this.renderOptions.depth === 1,
- move: this.renderOptions.depth === 1,
- layerSelector: this.renderOptions.depth === 1,
- },
- });
- this.toolsRegion.show(this.toolsView);
- },
- onBeforeDestroy: function() {
- this.regionManager.destroy();
- },
- showTools: function() {
- if (this.renderOptions.depth === 1 && !this.$el.hasClass('mailpoet_container_layer_active')) {
- this.$(this.ui.tools).show();
- this.toolsView.triggerMethod('showTools');
- }
- },
- hideTools: function() {
- if (this.renderOptions.depth === 1 && !this.$el.hasClass('mailpoet_container_layer_active')) {
- this.$(this.ui.tools).hide();
- this.toolsView.triggerMethod('hideTools');
- }
- },
- toggleEditingLayer: function(event) {
- var that = this,
- $toggleButton = this.$('> .mailpoet_tools .mailpoet_newsletter_layer_selector'),
- $overlay = jQuery('.mailpoet_layer_overlay'),
- $container = this.$('> .mailpoet_container'),
- enableContainerLayer = function() {
- that.$el.addClass('mailpoet_container_layer_active');
- $toggleButton.addClass('mailpoet_container_layer_active');
- $container.addClass('mailpoet_layer_highlight');
- $overlay.click(disableContainerLayer);
- $overlay.show();
- },
- disableContainerLayer = function() {
- that.$el.removeClass('mailpoet_container_layer_active');
- $toggleButton.removeClass('mailpoet_container_layer_active');
- $container.removeClass('mailpoet_layer_highlight');
- $overlay.hide();
- $overlay.off('click');
- };
- if ($toggleButton.hasClass('mailpoet_container_layer_active')) {
- disableContainerLayer();
- } else {
- enableContainerLayer();
- }
- event.stopPropagation();
- },
- _buildRegions: function(regions) {
- var that = this;
-
- var defaults = {
- regionClass: this.getOption('regionClass'),
- parentEl: function() { return that.$el; }
- };
-
- return this.regionManager.addRegions(regions, defaults);
- },
- _rebuildRegions: function() {
- if (this.regionManager === undefined) {
- this.regionManager = new Backbone.Marionette.RegionManager();
- }
- this.regionManager.destroy();
- _.extend(this, this._buildRegions(this.regions));
- },
- getDropFunc: function() {
- var that = this;
- return function() {
- var newModel = that.model.clone();
- that.model.destroy();
- return newModel;
- };
- },
- });
-
- Module.ContainerBlockEmptyView = Marionette.ItemView.extend({
- getTemplate: function() { return templates.containerEmpty; },
- initialize: function(options) {
- this.renderOptions = _.defaults(options.renderOptions || {}, {});
- },
- templateHelpers: function() {
- return {
- isRoot: this.renderOptions.depth === 0,
- };
- },
- });
-
- Module.ContainerBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.ContainerBlockSettingsView; },
- });
-
- Module.ContainerBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.containerBlockSettings; },
- events: function() {
- return {
- "change .mailpoet_field_container_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
- "click .mailpoet_done_editing": "close",
- };
- },
- behaviors: {
- ColorPickerBehavior: {},
- },
- });
-
- Module.OneColumnContainerWidgetView = base.WidgetView.extend({
- className: base.WidgetView.prototype.className + ' mailpoet_droppable_layout_block',
- getTemplate: function() { return templates.oneColumnLayoutInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.ContainerBlockModel({
- orientation: 'horizontal',
- blocks: [
- new Module.ContainerBlockModel(),
- ]
- });
- }
- }
- },
- });
-
- Module.TwoColumnContainerWidgetView = base.WidgetView.extend({
- className: base.WidgetView.prototype.className + ' mailpoet_droppable_layout_block',
- getTemplate: function() { return templates.twoColumnLayoutInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.ContainerBlockModel({
- orientation: 'horizontal',
- blocks: [
- new Module.ContainerBlockModel(),
- new Module.ContainerBlockModel(),
- ]
- });
- }
- }
- },
- });
-
- Module.ThreeColumnContainerWidgetView = base.WidgetView.extend({
- className: base.WidgetView.prototype.className + ' mailpoet_droppable_layout_block',
- getTemplate: function() { return templates.threeColumnLayoutInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.ContainerBlockModel({
- orientation: 'horizontal',
- blocks: [
- new Module.ContainerBlockModel(),
- new Module.ContainerBlockModel(),
- new Module.ContainerBlockModel(),
- ]
- });
- }
- }
- },
- });
-
- App.on('before:start', function() {
- App.registerBlockType('container', {
- blockModel: Module.ContainerBlockModel,
- blockView: Module.ContainerBlockView,
+ blocks: new BlockCollection(),
+ }, EditorApplication.getConfig().get('blockDefaults.container'));
+ },
+ parse: function(response) {
+ // If container has any blocks - add them to a collection
+ if (response.type === 'container' && _.has(response, 'blocks')) {
+ response.blocks = new BlockCollection(response.blocks, {
+ parse: true,
});
+ }
+ return response;
+ },
+ validate: function() {
+ // Recursively propagate validation checks to blocks in the tree
+ var invalidBlock = this.get('blocks').find(function(block) { return !block.isValid(); });
+ if (invalidBlock) {
+ return invalidBlock.validationError;
+ }
+ },
+ });
- App.registerLayoutWidget({
- name: 'oneColumnLayout',
- priority: 100,
- widgetView: Module.OneColumnContainerWidgetView,
- });
+ BlockCollection = Backbone.Collection.extend({
+ model: base.BlockModel,
+ initialize: function() {
+ this.on('add change remove', function() { App.getChannel().trigger('autoSave'); });
+ },
+ parse: function(response) {
+ var self = this;
+ return _.map(response, function(block) {
+ var Type = App.getBlockTypeModel(block.type);
+ // TODO: If type has no registered model, use a backup one
+ return new Type(block, {parse: true});
+ });
+ },
+ });
- App.registerLayoutWidget({
- name: 'twoColumnLayout',
- priority: 100,
- widgetView: Module.TwoColumnContainerWidgetView,
- });
+ Module.ContainerBlockView = Marionette.CompositeView.extend({
+ regionClass: Marionette.Region,
+ className: 'mailpoet_block mailpoet_container_block mailpoet_droppable_block mailpoet_droppable_layout_block',
+ getTemplate: function() { return templates.containerBlock; },
+ childViewContainer: '> .mailpoet_container',
+ getEmptyView: function() { return Module.ContainerBlockEmptyView; },
+ emptyViewOptions: function() { return { renderOptions: this.renderOptions }; },
+ modelEvents: {
+ 'change': 'render'
+ },
+ events: {
+ "mouseenter": "showTools",
+ "mouseleave": "hideTools",
+ "click .mailpoet_newsletter_layer_selector": "toggleEditingLayer",
+ },
+ regions: {
+ toolsRegion: '> .mailpoet_tools',
+ },
+ ui: {
+ tools: '> .mailpoet_tools'
+ },
+ behaviors: {
+ ContainerDropZoneBehavior: {},
+ DraggableBehavior: {
+ cloneOriginal: true,
+ hideOriginal: true,
+ onDrop: function(options) {
+ // After a clone of model has been dropped, cleanup
+ // and destroy self
+ options.dragBehavior.view.model.destroy();
+ },
+ onDragSubstituteBy: function(behavior) {
+ var WidgetView, node;
+ // When block is being dragged, display the widget icon instead.
+ // This will create an instance of block's widget view and
+ // use it's rendered DOM element instead of the content block
+ if (_.isFunction(behavior.view.onDragSubstituteBy)) {
+ WidgetView = new (behavior.view.onDragSubstituteBy())();
+ WidgetView.render();
+ node = WidgetView.$el.get(0).cloneNode(true);
+ WidgetView.destroy();
+ return node;
+ }
+ },
+ testAttachToInstance: function(model, view) {
+ // Attach Draggable only to layout containers and disable it
+ // for root and column containers.
+ return view.renderOptions.depth === 1;
+ },
+ },
+ },
+ onDragSubstituteBy: function() {
+ // For two and three column layouts display their respective widgets,
+ // otherwise always default to one column layout widget
+ if (this.renderOptions.depth === 1) {
+ if (this.model.get('blocks').length === 3) return Module.ThreeColumnContainerWidgetView;
+ if (this.model.get('blocks').length === 2) return Module.TwoColumnContainerWidgetView;
+ }
+ return Module.OneColumnContainerWidgetView;
- App.registerLayoutWidget({
- name: 'threeColumnLayout',
- priority: 100,
- widgetView: Module.ThreeColumnContainerWidgetView,
- });
+ },
+ constructor: function() {
+ // Set the block collection to be handled by this view as well
+ arguments[0].collection = arguments[0].model.get('blocks');
+ Marionette.CompositeView.apply(this, arguments);
+ this.$el.addClass('mailpoet_editor_view_' + this.cid);
+ },
+ initialize: function(options) {
+ this.renderOptions = _.defaults(options.renderOptions || {}, {});
+ },
+ // Determines which view type should be used for a child
+ getChildView: function(model) {
+ // TODO: If type does not have a type registered, use a generic one
+ return App.getBlockTypeView(model.get('type'));
+ },
+ childViewOptions: function() {
+ var newRenderOptions = _.clone(this.renderOptions);
+ if (newRenderOptions.depth !== undefined) {
+ newRenderOptions.depth += 1;
+ }
+ return {
+ renderOptions: newRenderOptions
+ };
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ viewCid: this.cid,
+ };
+ },
+ onRender: function() {
+ this._rebuildRegions();
+ this.toolsView = new Module.ContainerBlockToolsView({
+ model: this.model,
+ tools: {
+ settings: this.renderOptions.depth > 1,
+ delete: this.renderOptions.depth === 1,
+ move: this.renderOptions.depth === 1,
+ layerSelector: this.renderOptions.depth === 1,
+ },
+ });
+ this.toolsRegion.show(this.toolsView);
+ },
+ onBeforeDestroy: function() {
+ this.regionManager.destroy();
+ },
+ showTools: function() {
+ if (this.renderOptions.depth === 1 && !this.$el.hasClass('mailpoet_container_layer_active')) {
+ this.$(this.ui.tools).show();
+ this.toolsView.triggerMethod('showTools');
+ }
+ },
+ hideTools: function() {
+ if (this.renderOptions.depth === 1 && !this.$el.hasClass('mailpoet_container_layer_active')) {
+ this.$(this.ui.tools).hide();
+ this.toolsView.triggerMethod('hideTools');
+ }
+ },
+ toggleEditingLayer: function(event) {
+ var that = this,
+ $toggleButton = this.$('> .mailpoet_tools .mailpoet_newsletter_layer_selector'),
+ $overlay = jQuery('.mailpoet_layer_overlay'),
+ $container = this.$('> .mailpoet_container'),
+ enableContainerLayer = function() {
+ that.$el.addClass('mailpoet_container_layer_active');
+ $toggleButton.addClass('mailpoet_container_layer_active');
+ $container.addClass('mailpoet_layer_highlight');
+ $overlay.click(disableContainerLayer);
+ $overlay.show();
+ },
+ disableContainerLayer = function() {
+ that.$el.removeClass('mailpoet_container_layer_active');
+ $toggleButton.removeClass('mailpoet_container_layer_active');
+ $container.removeClass('mailpoet_layer_highlight');
+ $overlay.hide();
+ $overlay.off('click');
+ };
+ if ($toggleButton.hasClass('mailpoet_container_layer_active')) {
+ disableContainerLayer();
+ } else {
+ enableContainerLayer();
+ }
+ event.stopPropagation();
+ },
+ _buildRegions: function(regions) {
+ var that = this;
+
+ var defaults = {
+ regionClass: this.getOption('regionClass'),
+ parentEl: function() { return that.$el; }
+ };
+
+ return this.regionManager.addRegions(regions, defaults);
+ },
+ _rebuildRegions: function() {
+ if (this.regionManager === undefined) {
+ this.regionManager = new Backbone.Marionette.RegionManager();
+ }
+ this.regionManager.destroy();
+ _.extend(this, this._buildRegions(this.regions));
+ },
+ getDropFunc: function() {
+ var that = this;
+ return function() {
+ var newModel = that.model.clone();
+ that.model.destroy();
+ return newModel;
+ };
+ },
+ });
+
+ Module.ContainerBlockEmptyView = Marionette.ItemView.extend({
+ getTemplate: function() { return templates.containerEmpty; },
+ initialize: function(options) {
+ this.renderOptions = _.defaults(options.renderOptions || {}, {});
+ },
+ templateHelpers: function() {
+ return {
+ isRoot: this.renderOptions.depth === 0,
+ };
+ },
+ });
+
+ Module.ContainerBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.ContainerBlockSettingsView; },
+ });
+
+ Module.ContainerBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.containerBlockSettings; },
+ events: function() {
+ return {
+ "change .mailpoet_field_container_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
+ "click .mailpoet_done_editing": "close",
+ };
+ },
+ behaviors: {
+ ColorPickerBehavior: {},
+ },
+ });
+
+ Module.OneColumnContainerWidgetView = base.WidgetView.extend({
+ className: base.WidgetView.prototype.className + ' mailpoet_droppable_layout_block',
+ getTemplate: function() { return templates.oneColumnLayoutInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.ContainerBlockModel({
+ orientation: 'horizontal',
+ blocks: [
+ new Module.ContainerBlockModel(),
+ ]
+ });
+ }
+ }
+ },
+ });
+
+ Module.TwoColumnContainerWidgetView = base.WidgetView.extend({
+ className: base.WidgetView.prototype.className + ' mailpoet_droppable_layout_block',
+ getTemplate: function() { return templates.twoColumnLayoutInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.ContainerBlockModel({
+ orientation: 'horizontal',
+ blocks: [
+ new Module.ContainerBlockModel(),
+ new Module.ContainerBlockModel(),
+ ]
+ });
+ }
+ }
+ },
+ });
+
+ Module.ThreeColumnContainerWidgetView = base.WidgetView.extend({
+ className: base.WidgetView.prototype.className + ' mailpoet_droppable_layout_block',
+ getTemplate: function() { return templates.threeColumnLayoutInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.ContainerBlockModel({
+ orientation: 'horizontal',
+ blocks: [
+ new Module.ContainerBlockModel(),
+ new Module.ContainerBlockModel(),
+ new Module.ContainerBlockModel(),
+ ]
+ });
+ }
+ }
+ },
+ });
+
+ App.on('before:start', function() {
+ App.registerBlockType('container', {
+ blockModel: Module.ContainerBlockModel,
+ blockView: Module.ContainerBlockView,
});
+
+ App.registerLayoutWidget({
+ name: 'oneColumnLayout',
+ priority: 100,
+ widgetView: Module.OneColumnContainerWidgetView,
+ });
+
+ App.registerLayoutWidget({
+ name: 'twoColumnLayout',
+ priority: 100,
+ widgetView: Module.TwoColumnContainerWidgetView,
+ });
+
+ App.registerLayoutWidget({
+ name: 'threeColumnLayout',
+ priority: 100,
+ widgetView: Module.ThreeColumnContainerWidgetView,
+ });
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/divider.js b/assets/js/src/newsletter_editor/blocks/divider.js
index 9c578bb920..b2626da29b 100644
--- a/assets/js/src/newsletter_editor/blocks/divider.js
+++ b/assets/js/src/newsletter_editor/blocks/divider.js
@@ -9,165 +9,164 @@ define('newsletter_editor/blocks/divider', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.divider", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base');
+ var base = App.module('blocks.base');
- Module.DividerBlockModel = base.BlockModel.extend({
- defaults: function() {
- return this._getDefaults({
- type: 'divider',
- styles: {
- block: {
- backgroundColor: 'transparent',
- padding: '12px',
- borderStyle: 'solid',
- borderWidth: '1px',
- borderColor: '#000000',
- },
- },
- }, EditorApplication.getConfig().get('blockDefaults.divider'));
+ Module.DividerBlockModel = base.BlockModel.extend({
+ defaults: function() {
+ return this._getDefaults({
+ type: 'divider',
+ styles: {
+ block: {
+ backgroundColor: 'transparent',
+ padding: '12px',
+ borderStyle: 'solid',
+ borderWidth: '1px',
+ borderColor: '#000000',
+ },
},
+ }, EditorApplication.getConfig().get('blockDefaults.divider'));
+ },
+ });
+
+ Module.DividerBlockView = base.BlockView.extend({
+ className: "mailpoet_block mailpoet_divider_block mailpoet_droppable_block",
+ getTemplate: function() { return templates.dividerBlock; },
+ modelEvents: _.omit(base.BlockView.prototype.modelEvents, 'change'),
+ behaviors: _.defaults({
+ ResizableBehavior: {
+ elementSelector: '.mailpoet_content',
+ resizeHandleSelector: '.mailpoet_resize_handle',
+ transformationFunction: function(y) { return y / 2; },
+ minLength: 0, // TODO: Move this number to editor configuration
+ modelField: 'styles.block.padding',
+ },
+ }, base.BlockView.prototype.behaviors),
+ onDragSubstituteBy: function() { return Module.DividerWidgetView; },
+ initialize: function() {
+ base.BlockView.prototype.initialize.apply(this, arguments);
+ var that = this;
+
+ // Listen for attempts to change all dividers in one go
+ this._replaceDividerHandler = function(data) { that.model.set(data); that.model.trigger('applyToAll'); };
+ App.getChannel().on('replaceAllDividers', this._replaceDividerHandler);
+
+ this.listenTo(this.model, 'change:src change:styles.block.backgroundColor change:styles.block.borderStyle change:styles.block.borderWidth change:styles.block.borderColor applyToAll', this.render);
+ this.listenTo(this.model, 'change:styles.block.padding', this.changePadding);
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ viewCid: this.cid,
+ totalHeight: parseInt(this.model.get('styles.block.padding'), 10)*2 + parseInt(this.model.get('styles.block.borderWidth')) + 'px',
+ };
+ },
+ onRender: function() {
+ this.toolsView = new Module.DividerBlockToolsView({ model: this.model });
+ this.toolsRegion.show(this.toolsView);
+ },
+ onBeforeDestroy: function() {
+ App.getChannel().off('replaceAllDividers', this._replaceDividerHandler);
+ this.stopListening(this.model);
+ },
+ changePadding: function() {
+ this.$('.mailpoet_content').css('padding-top', this.model.get('styles.block.padding'));
+ this.$('.mailpoet_content').css('padding-bottom', this.model.get('styles.block.padding'));
+ this.$('.mailpoet_resize_handle_text').text(parseInt(this.model.get('styles.block.padding'), 10)*2 + parseInt(this.model.get('styles.block.borderWidth')) + 'px');
+ },
+ });
+
+ Module.DividerBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.DividerBlockSettingsView; },
+ });
+
+ Module.DividerBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.dividerBlockSettings; },
+ events: function() {
+ return {
+ "click .mailpoet_field_divider_style": 'changeStyle',
+
+ "input .mailpoet_field_divider_border_width": _.partial(this.updateValueAndCall, '.mailpoet_field_divider_border_width_input', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
+ "change .mailpoet_field_divider_border_width": _.partial(this.updateValueAndCall, '.mailpoet_field_divider_border_width_input', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
+ "change .mailpoet_field_divider_border_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_divider_border_width', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
+ "keyup .mailpoet_field_divider_border_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_divider_border_width', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
+
+ "change .mailpoet_field_divider_border_color": _.partial(this.changeColorField, "styles.block.borderColor"),
+ "change .mailpoet_field_divider_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
+ "click .mailpoet_button_divider_apply_to_all": "applyToAll",
+ "click .mailpoet_done_editing": "close",
+ };
+ },
+ modelEvents: function() {
+ return {
+ 'change:styles.block.borderColor': 'repaintDividerStyleOptions',
+ };
+ },
+ behaviors: {
+ ColorPickerBehavior: {},
+ },
+ initialize: function(params) {
+ var panelParams = {
+ element: this.$el,
+ template: '',
+ position: 'right',
+ width: App.getConfig().get('sidepanelWidth'),
+ };
+ this.renderOptions = params.renderOptions || {};
+ if (this.renderOptions.displayFormat === 'subpanel') {
+ MailPoet.Modal.subpanel(panelParams);
+ } else {
+ MailPoet.Modal.panel(panelParams);
+ }
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ availableStyles: App.getAvailableStyles().toJSON(),
+ renderOptions: this.renderOptions,
+ };
+ },
+ changeStyle: function(event) {
+ var style = jQuery(event.currentTarget).data('style');
+ this.model.set('styles.block.borderStyle', style);
+ this.$('.mailpoet_field_divider_style').removeClass('mailpoet_active_divider_style');
+ this.$('.mailpoet_field_divider_style[data-style="' + style + '"]').addClass('mailpoet_active_divider_style');
+ },
+ repaintDividerStyleOptions: function() {
+ this.$('.mailpoet_field_divider_style > div').css('border-top-color', this.model.get('styles.block.borderColor'));
+ },
+ applyToAll: function(event) {
+ App.getChannel().trigger('replaceAllDividers', this.model.toJSON());
+ },
+ updateValueAndCall: function(fieldToUpdate, callable, event) {
+ this.$(fieldToUpdate).val(jQuery(event.target).val());
+ callable(event);
+ },
+ });
+
+ Module.DividerWidgetView = base.WidgetView.extend({
+ getTemplate: function() { return templates.dividerInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.DividerBlockModel();
+ },
+ }
+ },
+ });
+ App.on('before:start', function() {
+ App.registerBlockType('divider', {
+ blockModel: Module.DividerBlockModel,
+ blockView: Module.DividerBlockView,
});
- Module.DividerBlockView = base.BlockView.extend({
- className: "mailpoet_block mailpoet_divider_block mailpoet_droppable_block",
- getTemplate: function() { return templates.dividerBlock; },
- modelEvents: _.omit(base.BlockView.prototype.modelEvents, 'change'),
- behaviors: _.defaults({
- ResizableBehavior: {
- elementSelector: '.mailpoet_content',
- resizeHandleSelector: '.mailpoet_resize_handle',
- transformationFunction: function(y) { return y / 2; },
- minLength: 0, // TODO: Move this number to editor configuration
- modelField: 'styles.block.padding',
- },
- }, base.BlockView.prototype.behaviors),
- onDragSubstituteBy: function() { return Module.DividerWidgetView; },
- initialize: function() {
- base.BlockView.prototype.initialize.apply(this, arguments);
- var that = this;
-
- // Listen for attempts to change all dividers in one go
- this._replaceDividerHandler = function(data) { that.model.set(data); that.model.trigger('applyToAll'); };
- App.getChannel().on('replaceAllDividers', this._replaceDividerHandler);
-
- this.listenTo(this.model, 'change:src change:styles.block.backgroundColor change:styles.block.borderStyle change:styles.block.borderWidth change:styles.block.borderColor applyToAll', this.render);
- this.listenTo(this.model, 'change:styles.block.padding', this.changePadding);
- },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- viewCid: this.cid,
- totalHeight: parseInt(this.model.get('styles.block.padding'), 10)*2 + parseInt(this.model.get('styles.block.borderWidth')) + 'px',
- };
- },
- onRender: function() {
- this.toolsView = new Module.DividerBlockToolsView({ model: this.model });
- this.toolsRegion.show(this.toolsView);
- },
- onBeforeDestroy: function() {
- App.getChannel().off('replaceAllDividers', this._replaceDividerHandler);
- this.stopListening(this.model);
- },
- changePadding: function() {
- this.$('.mailpoet_content').css('padding-top', this.model.get('styles.block.padding'));
- this.$('.mailpoet_content').css('padding-bottom', this.model.get('styles.block.padding'));
- this.$('.mailpoet_resize_handle_text').text(parseInt(this.model.get('styles.block.padding'), 10)*2 + parseInt(this.model.get('styles.block.borderWidth')) + 'px');
- },
- });
-
- Module.DividerBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.DividerBlockSettingsView; },
- });
-
- Module.DividerBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.dividerBlockSettings; },
- events: function() {
- return {
- "click .mailpoet_field_divider_style": 'changeStyle',
-
- "input .mailpoet_field_divider_border_width": _.partial(this.updateValueAndCall, '.mailpoet_field_divider_border_width_input', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
- "change .mailpoet_field_divider_border_width": _.partial(this.updateValueAndCall, '.mailpoet_field_divider_border_width_input', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
- "change .mailpoet_field_divider_border_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_divider_border_width', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
- "keyup .mailpoet_field_divider_border_width_input": _.partial(this.updateValueAndCall, '.mailpoet_field_divider_border_width', _.partial(this.changePixelField, "styles.block.borderWidth").bind(this)),
-
- "change .mailpoet_field_divider_border_color": _.partial(this.changeColorField, "styles.block.borderColor"),
- "change .mailpoet_field_divider_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
- "click .mailpoet_button_divider_apply_to_all": "applyToAll",
- "click .mailpoet_done_editing": "close",
- };
- },
- modelEvents: function() {
- return {
- 'change:styles.block.borderColor': 'repaintDividerStyleOptions',
- };
- },
- behaviors: {
- ColorPickerBehavior: {},
- },
- initialize: function(params) {
- var panelParams = {
- element: this.$el,
- template: '',
- position: 'right',
- width: App.getConfig().get('sidepanelWidth'),
- };
- this.renderOptions = params.renderOptions || {};
- if (this.renderOptions.displayFormat === 'subpanel') {
- MailPoet.Modal.subpanel(panelParams);
- } else {
- MailPoet.Modal.panel(panelParams);
- }
- },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- availableStyles: App.getAvailableStyles().toJSON(),
- renderOptions: this.renderOptions,
- };
- },
- changeStyle: function(event) {
- var style = jQuery(event.currentTarget).data('style');
- this.model.set('styles.block.borderStyle', style);
- this.$('.mailpoet_field_divider_style').removeClass('mailpoet_active_divider_style');
- this.$('.mailpoet_field_divider_style[data-style="' + style + '"]').addClass('mailpoet_active_divider_style');
- },
- repaintDividerStyleOptions: function() {
- this.$('.mailpoet_field_divider_style > div').css('border-top-color', this.model.get('styles.block.borderColor'));
- },
- applyToAll: function(event) {
- App.getChannel().trigger('replaceAllDividers', this.model.toJSON());
- },
- updateValueAndCall: function(fieldToUpdate, callable, event) {
- this.$(fieldToUpdate).val(jQuery(event.target).val());
- callable(event);
- },
- });
-
- Module.DividerWidgetView = base.WidgetView.extend({
- getTemplate: function() { return templates.dividerInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.DividerBlockModel();
- },
- }
- },
- });
- App.on('before:start', function() {
- App.registerBlockType('divider', {
- blockModel: Module.DividerBlockModel,
- blockView: Module.DividerBlockView,
- });
-
- App.registerWidget({
- name: 'divider',
- widgetView: Module.DividerWidgetView,
- priority: 93,
- });
+ App.registerWidget({
+ name: 'divider',
+ widgetView: Module.DividerWidgetView,
+ priority: 93,
});
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/footer.js b/assets/js/src/newsletter_editor/blocks/footer.js
index 709ea38df2..b204773cfa 100644
--- a/assets/js/src/newsletter_editor/blocks/footer.js
+++ b/assets/js/src/newsletter_editor/blocks/footer.js
@@ -9,139 +9,138 @@ define('newsletter_editor/blocks/footer', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.footer", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base');
+ var base = App.module('blocks.base');
- Module.FooterBlockModel = base.BlockModel.extend({
- defaults: function() {
- return this._getDefaults({
- type: 'footer',
- text: 'Unsubscribe | Manage subscription
Add your postal address here!',
- styles: {
- block: {
- backgroundColor: 'transparent',
- },
- text: {
- fontColor: '#000000',
- fontFamily: 'Arial',
- fontSize: '12px',
- textAlign: 'center',
- },
- link: {
- fontColor: '#0000ff',
- textDecoration: 'none',
- },
- },
- }, EditorApplication.getConfig().get('blockDefaults.footer'));
+ Module.FooterBlockModel = base.BlockModel.extend({
+ defaults: function() {
+ return this._getDefaults({
+ type: 'footer',
+ text: 'Unsubscribe | Manage subscription
Add your postal address here!',
+ styles: {
+ block: {
+ backgroundColor: 'transparent',
+ },
+ text: {
+ fontColor: '#000000',
+ fontFamily: 'Arial',
+ fontSize: '12px',
+ textAlign: 'center',
+ },
+ link: {
+ fontColor: '#0000ff',
+ textDecoration: 'none',
+ },
},
+ }, EditorApplication.getConfig().get('blockDefaults.footer'));
+ },
+ });
+
+ Module.FooterBlockView = base.BlockView.extend({
+ className: "mailpoet_block mailpoet_footer_block mailpoet_droppable_block",
+ getTemplate: function() { return templates.footerBlock; },
+ modelEvents: {
+ 'change:styles.block.backgroundColor change:styles.text.fontColor change:styles.text.fontFamily change:styles.text.fontSize change:styles.text.textAlign change:styles.link.fontColor change:styles.link.textDecoration': 'render',
+ },
+ onDragSubstituteBy: function() { return Module.FooterWidgetView; },
+ onRender: function() {
+ this.toolsView = new Module.FooterBlockToolsView({ model: this.model });
+ this.toolsRegion.show(this.toolsView);
+ },
+ onDomRefresh: function() {
+ this.attachTextEditor();
+ },
+ attachTextEditor: function() {
+ var that = this;
+ this.$('.mailpoet_content').tinymce({
+ inline: true,
+
+ menubar: false,
+ toolbar: "bold italic link unlink forecolor mailpoet_custom_fields",
+
+ valid_elements: "p[class|style],span[class|style],a[href|class|title|target|style],strong[class|style],em[class|style],strike,br",
+ invalid_elements: "script",
+ style_formats: [
+ {title: 'Paragraph', block: 'p'},
+ ],
+
+ plugins: "wplink textcolor mailpoet_custom_fields",
+
+ setup: function(editor) {
+ editor.on('change', function(e) {
+ that.model.set('text', editor.getContent());
+ });
+
+ editor.on('focus', function(e) {
+ that.disableShowingTools();
+ });
+
+ editor.on('blur', function(e) {
+ that.enableShowingTools();
+ });
+ },
+
+ mailpoet_custom_fields: App.getConfig().get('customFields').toJSON(),
+ mailpoet_custom_fields_window_title: App.getConfig().get('translations.customFieldsWindowTitle'),
+ });
+ },
+ });
+
+ Module.FooterBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.FooterBlockSettingsView; },
+ });
+
+ Module.FooterBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.footerBlockSettings; },
+ events: function() {
+ return {
+ "change .mailpoet_field_footer_text_color": _.partial(this.changeColorField, "styles.text.fontColor"),
+ "change .mailpoet_field_footer_text_font_family": _.partial(this.changeField, "styles.text.fontFamily"),
+ "change .mailpoet_field_footer_text_size": _.partial(this.changeField, "styles.text.fontSize"),
+ "change #mailpoet_field_footer_link_color": _.partial(this.changeColorField, "styles.link.fontColor"),
+ "change #mailpoet_field_footer_link_underline": function(event) {
+ this.model.set('styles.link.textDecoration', (event.target.checked) ? event.target.value : 'none');
+ },
+ "change .mailpoet_field_footer_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
+ "change .mailpoet_field_footer_alignment": _.partial(this.changeField, "styles.text.textAlign"),
+ "click .mailpoet_done_editing": "close",
+ };
+ },
+ behaviors: {
+ ColorPickerBehavior: {},
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ availableStyles: App.getAvailableStyles().toJSON(),
+ };
+ },
+ });
+
+ Module.FooterWidgetView = base.WidgetView.extend({
+ getTemplate: function() { return templates.footerInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.FooterBlockModel();
+ },
+ }
+ },
+ });
+
+ App.on('before:start', function() {
+ App.registerBlockType('footer', {
+ blockModel: Module.FooterBlockModel,
+ blockView: Module.FooterBlockView,
});
- Module.FooterBlockView = base.BlockView.extend({
- className: "mailpoet_block mailpoet_footer_block mailpoet_droppable_block",
- getTemplate: function() { return templates.footerBlock; },
- modelEvents: {
- 'change:styles.block.backgroundColor change:styles.text.fontColor change:styles.text.fontFamily change:styles.text.fontSize change:styles.text.textAlign change:styles.link.fontColor change:styles.link.textDecoration': 'render',
- },
- onDragSubstituteBy: function() { return Module.FooterWidgetView; },
- onRender: function() {
- this.toolsView = new Module.FooterBlockToolsView({ model: this.model });
- this.toolsRegion.show(this.toolsView);
- },
- onDomRefresh: function() {
- this.attachTextEditor();
- },
- attachTextEditor: function() {
- var that = this;
- this.$('.mailpoet_content').tinymce({
- inline: true,
-
- menubar: false,
- toolbar: "bold italic link unlink forecolor mailpoet_custom_fields",
-
- valid_elements: "p[class|style],span[class|style],a[href|class|title|target|style],strong[class|style],em[class|style],strike,br",
- invalid_elements: "script",
- style_formats: [
- {title: 'Paragraph', block: 'p'},
- ],
-
- plugins: "wplink textcolor mailpoet_custom_fields",
-
- setup: function(editor) {
- editor.on('change', function(e) {
- that.model.set('text', editor.getContent());
- });
-
- editor.on('focus', function(e) {
- that.disableShowingTools();
- });
-
- editor.on('blur', function(e) {
- that.enableShowingTools();
- });
- },
-
- mailpoet_custom_fields: App.getConfig().get('customFields').toJSON(),
- mailpoet_custom_fields_window_title: App.getConfig().get('translations.customFieldsWindowTitle'),
- });
- },
- });
-
- Module.FooterBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.FooterBlockSettingsView; },
- });
-
- Module.FooterBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.footerBlockSettings; },
- events: function() {
- return {
- "change .mailpoet_field_footer_text_color": _.partial(this.changeColorField, "styles.text.fontColor"),
- "change .mailpoet_field_footer_text_font_family": _.partial(this.changeField, "styles.text.fontFamily"),
- "change .mailpoet_field_footer_text_size": _.partial(this.changeField, "styles.text.fontSize"),
- "change #mailpoet_field_footer_link_color": _.partial(this.changeColorField, "styles.link.fontColor"),
- "change #mailpoet_field_footer_link_underline": function(event) {
- this.model.set('styles.link.textDecoration', (event.target.checked) ? event.target.value : 'none');
- },
- "change .mailpoet_field_footer_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
- "change .mailpoet_field_footer_alignment": _.partial(this.changeField, "styles.text.textAlign"),
- "click .mailpoet_done_editing": "close",
- };
- },
- behaviors: {
- ColorPickerBehavior: {},
- },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- availableStyles: App.getAvailableStyles().toJSON(),
- };
- },
- });
-
- Module.FooterWidgetView = base.WidgetView.extend({
- getTemplate: function() { return templates.footerInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.FooterBlockModel();
- },
- }
- },
- });
-
- App.on('before:start', function() {
- App.registerBlockType('footer', {
- blockModel: Module.FooterBlockModel,
- blockView: Module.FooterBlockView,
- });
-
- App.registerWidget({
- name: 'footer',
- widgetView: Module.FooterWidgetView,
- priority: 99,
- });
+ App.registerWidget({
+ name: 'footer',
+ widgetView: Module.FooterWidgetView,
+ priority: 99,
});
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/header.js b/assets/js/src/newsletter_editor/blocks/header.js
index f5dbad4f45..c7e291a1a6 100644
--- a/assets/js/src/newsletter_editor/blocks/header.js
+++ b/assets/js/src/newsletter_editor/blocks/header.js
@@ -9,139 +9,138 @@ define('newsletter_editor/blocks/header', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.header", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base');
+ var base = App.module('blocks.base');
- Module.HeaderBlockModel = base.BlockModel.extend({
- defaults: function() {
- return this._getDefaults({
- type: 'header',
- text: 'Display problems? View it in your browser',
- styles: {
- block: {
- backgroundColor: 'transparent',
- },
- text: {
- fontColor: '#000000',
- fontFamily: 'Arial',
- fontSize: '12px',
- textAlign: 'center',
- },
- link: {
- fontColor: '#0000ff',
- textDecoration: 'underline',
- },
- },
- }, EditorApplication.getConfig().get('blockDefaults.header'));
+ Module.HeaderBlockModel = base.BlockModel.extend({
+ defaults: function() {
+ return this._getDefaults({
+ type: 'header',
+ text: 'Display problems? View it in your browser',
+ styles: {
+ block: {
+ backgroundColor: 'transparent',
+ },
+ text: {
+ fontColor: '#000000',
+ fontFamily: 'Arial',
+ fontSize: '12px',
+ textAlign: 'center',
+ },
+ link: {
+ fontColor: '#0000ff',
+ textDecoration: 'underline',
+ },
},
+ }, EditorApplication.getConfig().get('blockDefaults.header'));
+ },
+ });
+
+ Module.HeaderBlockView = base.BlockView.extend({
+ className: "mailpoet_block mailpoet_header_block mailpoet_droppable_block",
+ getTemplate: function() { return templates.headerBlock; },
+ modelEvents: {
+ 'change:styles.block.backgroundColor change:styles.text.fontColor change:styles.text.fontFamily change:styles.text.fontSize change:styles.text.textAlign change:styles.link.fontColor change:styles.link.textDecoration': 'render',
+ },
+ onDragSubstituteBy: function() { return Module.HeaderWidgetView; },
+ onRender: function() {
+ this.toolsView = new Module.HeaderBlockToolsView({ model: this.model });
+ this.toolsRegion.show(this.toolsView);
+ },
+ onDomRefresh: function() {
+ this.attachTextEditor();
+ },
+ attachTextEditor: function() {
+ var that = this;
+ this.$('.mailpoet_content').tinymce({
+ inline: true,
+
+ menubar: false,
+ toolbar: "bold italic link unlink forecolor mailpoet_custom_fields",
+
+ valid_elements: "p[class|style],span[class|style],a[href|class|title|target|style],strong[class|style],em[class|style],strike,br",
+ invalid_elements: "script",
+ style_formats: [
+ {title: 'Paragraph', block: 'p'},
+ ],
+
+ plugins: "wplink textcolor mailpoet_custom_fields",
+
+ setup: function(editor) {
+ editor.on('change', function(e) {
+ that.model.set('text', editor.getContent());
+ });
+
+ editor.on('focus', function(e) {
+ that.disableShowingTools();
+ });
+
+ editor.on('blur', function(e) {
+ that.enableShowingTools();
+ });
+ },
+
+ mailpoet_custom_fields: App.getConfig().get('customFields').toJSON(),
+ mailpoet_custom_fields_window_title: App.getConfig().get('translations.customFieldsWindowTitle'),
+ });
+ },
+ });
+
+ Module.HeaderBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.HeaderBlockSettingsView; },
+ });
+
+ Module.HeaderBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.headerBlockSettings; },
+ events: function() {
+ return {
+ "change .mailpoet_field_header_text_color": _.partial(this.changeColorField, "styles.text.fontColor"),
+ "change .mailpoet_field_header_text_font_family": _.partial(this.changeField, "styles.text.fontFamily"),
+ "change .mailpoet_field_header_text_size": _.partial(this.changeField, "styles.text.fontSize"),
+ "change #mailpoet_field_header_link_color": _.partial(this.changeColorField, "styles.link.fontColor"),
+ "change #mailpoet_field_header_link_underline": function(event) {
+ this.model.set('styles.link.textDecoration', (event.target.checked) ? event.target.value : 'none');
+ },
+ "change .mailpoet_field_header_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
+ "change .mailpoet_field_header_alignment": _.partial(this.changeField, "styles.text.textAlign"),
+ "click .mailpoet_done_editing": "close",
+ };
+ },
+ behaviors: {
+ ColorPickerBehavior: {},
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ availableStyles: App.getAvailableStyles().toJSON(),
+ };
+ },
+ });
+
+ Module.HeaderWidgetView = base.WidgetView.extend({
+ getTemplate: function() { return templates.headerInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.HeaderBlockModel();
+ },
+ }
+ },
+ });
+
+ App.on('before:start', function() {
+ App.registerBlockType('header', {
+ blockModel: Module.HeaderBlockModel,
+ blockView: Module.HeaderBlockView,
});
- Module.HeaderBlockView = base.BlockView.extend({
- className: "mailpoet_block mailpoet_header_block mailpoet_droppable_block",
- getTemplate: function() { return templates.headerBlock; },
- modelEvents: {
- 'change:styles.block.backgroundColor change:styles.text.fontColor change:styles.text.fontFamily change:styles.text.fontSize change:styles.text.textAlign change:styles.link.fontColor change:styles.link.textDecoration': 'render',
- },
- onDragSubstituteBy: function() { return Module.HeaderWidgetView; },
- onRender: function() {
- this.toolsView = new Module.HeaderBlockToolsView({ model: this.model });
- this.toolsRegion.show(this.toolsView);
- },
- onDomRefresh: function() {
- this.attachTextEditor();
- },
- attachTextEditor: function() {
- var that = this;
- this.$('.mailpoet_content').tinymce({
- inline: true,
-
- menubar: false,
- toolbar: "bold italic link unlink forecolor mailpoet_custom_fields",
-
- valid_elements: "p[class|style],span[class|style],a[href|class|title|target|style],strong[class|style],em[class|style],strike,br",
- invalid_elements: "script",
- style_formats: [
- {title: 'Paragraph', block: 'p'},
- ],
-
- plugins: "wplink textcolor mailpoet_custom_fields",
-
- setup: function(editor) {
- editor.on('change', function(e) {
- that.model.set('text', editor.getContent());
- });
-
- editor.on('focus', function(e) {
- that.disableShowingTools();
- });
-
- editor.on('blur', function(e) {
- that.enableShowingTools();
- });
- },
-
- mailpoet_custom_fields: App.getConfig().get('customFields').toJSON(),
- mailpoet_custom_fields_window_title: App.getConfig().get('translations.customFieldsWindowTitle'),
- });
- },
- });
-
- Module.HeaderBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.HeaderBlockSettingsView; },
- });
-
- Module.HeaderBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.headerBlockSettings; },
- events: function() {
- return {
- "change .mailpoet_field_header_text_color": _.partial(this.changeColorField, "styles.text.fontColor"),
- "change .mailpoet_field_header_text_font_family": _.partial(this.changeField, "styles.text.fontFamily"),
- "change .mailpoet_field_header_text_size": _.partial(this.changeField, "styles.text.fontSize"),
- "change #mailpoet_field_header_link_color": _.partial(this.changeColorField, "styles.link.fontColor"),
- "change #mailpoet_field_header_link_underline": function(event) {
- this.model.set('styles.link.textDecoration', (event.target.checked) ? event.target.value : 'none');
- },
- "change .mailpoet_field_header_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
- "change .mailpoet_field_header_alignment": _.partial(this.changeField, "styles.text.textAlign"),
- "click .mailpoet_done_editing": "close",
- };
- },
- behaviors: {
- ColorPickerBehavior: {},
- },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- availableStyles: App.getAvailableStyles().toJSON(),
- };
- },
- });
-
- Module.HeaderWidgetView = base.WidgetView.extend({
- getTemplate: function() { return templates.headerInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.HeaderBlockModel();
- },
- }
- },
- });
-
- App.on('before:start', function() {
- App.registerBlockType('header', {
- blockModel: Module.HeaderBlockModel,
- blockView: Module.HeaderBlockView,
- });
-
- App.registerWidget({
- name: 'header',
- widgetView: Module.HeaderWidgetView,
- priority: 98,
- });
+ App.registerWidget({
+ name: 'header',
+ widgetView: Module.HeaderWidgetView,
+ priority: 98,
});
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/image.js b/assets/js/src/newsletter_editor/blocks/image.js
index 5006ec06c0..d9e112069d 100644
--- a/assets/js/src/newsletter_editor/blocks/image.js
+++ b/assets/js/src/newsletter_editor/blocks/image.js
@@ -9,381 +9,380 @@ define('newsletter_editor/blocks/image', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.image", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base'),
- ImageWidgetView;
+ var base = App.module('blocks.base'),
+ ImageWidgetView;
- Module.ImageBlockModel = base.BlockModel.extend({
- defaults: function() {
- return this._getDefaults({
- type: 'image',
- link: 'http://example.org',
- src: 'no-image.png',
- alt: 'An image of...',
- padded: true, // true | false - Padded or full width
- width: '64px',
- height: '64px',
- styles: {
- block: {
- textAlign: 'center',
- },
- },
- }, EditorApplication.getConfig().get('blockDefaults.image'));
+ Module.ImageBlockModel = base.BlockModel.extend({
+ defaults: function() {
+ return this._getDefaults({
+ type: 'image',
+ link: 'http://example.org',
+ src: 'no-image.png',
+ alt: 'An image of...',
+ padded: true, // true | false - Padded or full width
+ width: '64px',
+ height: '64px',
+ styles: {
+ block: {
+ textAlign: 'center',
+ },
},
- });
+ }, EditorApplication.getConfig().get('blockDefaults.image'));
+ },
+ });
+
+ Module.ImageBlockView = base.BlockView.extend({
+ className: "mailpoet_block mailpoet_image_block mailpoet_droppable_block",
+ getTemplate: function() { return templates.imageBlock; },
+ initialize: function() {
+ this.on('showSettings', this.showSettings);
+ },
+ onDragSubstituteBy: function() { return Module.ImageWidgetView; },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ viewCid: this.cid,
+ imageMissingSrc: App.getConfig().get('urls.imageMissing'),
+ };
+ },
+ onRender: function() {
+ this.toolsView = new Module.ImageBlockToolsView({ model: this.model });
+ this.toolsRegion.show(this.toolsView);
+
+ if (this.model.get('padded')) {
+ this.$el.removeClass('mailpoet_full_image');
+ } else {
+ this.$el.addClass('mailpoet_full_image');
+ }
+ },
+ showSettings: function(options) {
+ this.toolsView.triggerMethod('showSettings', options);
+ },
+ onBeforeDestroy: function() {
+ this.off('showSettings');
+ },
+ });
+
+ Module.ImageBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.ImageBlockSettingsView; },
+ initialize: function() {
+ base.BlockToolsView.prototype.initialize.apply(this, arguments);
+ this.on('showSettings', this.changeSettings);
+ },
+ changeSettings: function(options) {
+ (new Module.ImageBlockSettingsView({
+ model: this.model,
+ showImageManager: (options.showImageManager === true),
+ })).render();
+ },
+ onBeforeDestroy: function() {
+ this.off('showSettings');
+ },
+ });
+
+ Module.ImageBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.imageBlockSettings; },
+ events: function() {
+ return {
+ "keyup .mailpoet_field_image_link": _.partial(this.changeField, "link"),
+ "keyup .mailpoet_field_image_address": _.partial(this.changeField, "src"),
+ "keyup .mailpoet_field_image_alt_text": _.partial(this.changeField, "alt"),
+ "change .mailpoet_field_image_padded": _.partial(this.changeBoolField, "padded"),
+ "change .mailpoet_field_image_alignment": _.partial(this.changeField, "styles.block.textAlign"),
+ "click .mailpoet_field_image_select_another_image": "showMediaManager",
+ "click .mailpoet_done_editing": "close",
+ };
+ },
+ initialize: function(options) {
+ base.BlockSettingsView.prototype.initialize.apply(this, arguments);
+
+ if (options.showImageManager) {
+ this.showMediaManager();
+ }
+ },
+ showMediaManager: function() {
+ if (this._mediaManager) {
+ this._mediaManager.resetSelections();
+ this._mediaManager.open();
+ return;
+ }
+
+ var MediaManager = wp.media.view.MediaFrame.Select.extend({
- Module.ImageBlockView = base.BlockView.extend({
- className: "mailpoet_block mailpoet_image_block mailpoet_droppable_block",
- getTemplate: function() { return templates.imageBlock; },
initialize: function() {
- this.on('showSettings', this.showSettings);
+ wp.media.view.MediaFrame.prototype.initialize.apply(this, arguments);
+
+ _.defaults(this.options, {
+ multiple: true,
+ editing: false,
+ state: 'insert'
+ });
+
+ this.createSelection();
+ this.createStates();
+ this.bindHandlers();
+ this.createIframeStates();
+
+ // Hide title
+ this.$el.addClass('hide-title');
},
- onDragSubstituteBy: function() { return Module.ImageWidgetView; },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- viewCid: this.cid,
- imageMissingSrc: App.getConfig().get('urls.imageMissing'),
+
+ resetSelections: function() {
+ this.state().get('selection').reset();
+ },
+
+ createQuery: function(options) {
+ var query = wp.media.query(options);
+ return query;
+ },
+
+ createStates: function() {
+ var options = this.options;
+
+ // Add the default states.
+ this.states.add([
+ // Main states.
+ new wp.media.controller.Library({
+ id: 'insert',
+ title: 'Add images',
+ priority: 20,
+ toolbar: 'main-insert',
+ filterable: 'image',
+ library: this.createQuery(options.library),
+ multiple: options.multiple ? 'reset' : false,
+ editable: false,
+
+ // If the user isn't allowed to edit fields,
+ // can they still edit it locally?
+ allowLocalEdits: false,
+
+ // Show the attachment display settings.
+ displaySettings: false,
+ // Update user settings when users adjust the
+ // attachment display settings.
+ displayUserSettings: false
+ }),
+ ]);
+
+ if(wp.media.view.settings.post.featuredImageId) {
+ this.states.add(new wp.media.controller.FeaturedImage());
+ }
+ },
+
+ bindHandlers: function() {
+ // from Select
+ this.on('router:create:browse', this.createRouter, this);
+ this.on('router:render:browse', this.browseRouter, this);
+ this.on('content:create:browse', this.browseContent, this);
+ this.on('content:render:upload', this.uploadContent, this);
+ this.on('toolbar:create:select', this.createSelectToolbar, this);
+
+ this.on('menu:create:gallery', this.createMenu, this);
+ this.on('toolbar:create:main-insert', this.createToolbar, this);
+ this.on('toolbar:create:main-gallery', this.createToolbar, this);
+ this.on('toolbar:create:main-embed', this.mainEmbedToolbar, this);
+
+ this.on('updateExcluded', this.browseContent, this);
+
+ var handlers = {
+ content: {
+ 'embed': 'embedContent',
+ 'edit-selection': 'editSelectionContent'
+ },
+ toolbar: {
+ 'main-insert': 'mainInsertToolbar'
+ }
};
- },
- onRender: function() {
- this.toolsView = new Module.ImageBlockToolsView({ model: this.model });
- this.toolsRegion.show(this.toolsView);
- if (this.model.get('padded')) {
- this.$el.removeClass('mailpoet_full_image');
- } else {
- this.$el.addClass('mailpoet_full_image');
+ _.each(handlers, function(regionHandlers, region) {
+ _.each(regionHandlers, function(callback, handler) {
+ this.on(region + ':render:' + handler, this[callback], this);
+ }, this);
+ }, this);
+ },
+
+ uploadContent: function() {
+ wp.media.view.MediaFrame.Select.prototype.uploadContent.apply(this, arguments);
+ this.$el.addClass('hide-toolbar');
+ },
+
+ // Content
+ embedContent: function() {
+ var view = new wp.media.view.Embed({
+ controller: this,
+ model: this.state()
+ }).render();
+
+ this.content.set(view);
+ view.url.focus();
+ },
+
+ editSelectionContent: function() {
+ var state = this.state(),
+ selection = state.get('selection'),
+ view;
+
+ view = new wp.media.view.AttachmentsBrowser({
+ controller: this,
+ collection: selection,
+ selection: selection,
+ model: state,
+ sortable: true,
+ search: false,
+ dragInfo: true,
+
+ AttachmentView: wp.media.view.Attachment.EditSelection
+ }).render();
+
+ view.toolbar.set('backToLibrary', {
+ text: 'Return to library',
+ priority: -100,
+
+ click: function() {
+ this.controller.content.mode('browse');
}
- },
- showSettings: function(options) {
- this.toolsView.triggerMethod('showSettings', options);
- },
- onBeforeDestroy: function() {
- this.off('showSettings');
- },
- });
+ });
- Module.ImageBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.ImageBlockSettingsView; },
- initialize: function() {
- base.BlockToolsView.prototype.initialize.apply(this, arguments);
- this.on('showSettings', this.changeSettings);
+ // Browse our library of attachments.
+ this.content.set(view);
},
- changeSettings: function(options) {
- (new Module.ImageBlockSettingsView({
- model: this.model,
- showImageManager: (options.showImageManager === true),
- })).render();
- },
- onBeforeDestroy: function() {
- this.off('showSettings');
- },
- });
- Module.ImageBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.imageBlockSettings; },
- events: function() {
- return {
- "keyup .mailpoet_field_image_link": _.partial(this.changeField, "link"),
- "keyup .mailpoet_field_image_address": _.partial(this.changeField, "src"),
- "keyup .mailpoet_field_image_alt_text": _.partial(this.changeField, "alt"),
- "change .mailpoet_field_image_padded": _.partial(this.changeBoolField, "padded"),
- "change .mailpoet_field_image_alignment": _.partial(this.changeField, "styles.block.textAlign"),
- "click .mailpoet_field_image_select_another_image": "showMediaManager",
- "click .mailpoet_done_editing": "close",
- };
- },
- initialize: function(options) {
- base.BlockSettingsView.prototype.initialize.apply(this, arguments);
+ // Toolbars
+ selectionStatusToolbar: function(view) {
+ var editable = this.state().get('editable');
- if (options.showImageManager) {
- this.showMediaManager();
+ view.set('selection', new wp.media.view.Selection({
+ controller: this,
+ collection: this.state().get('selection'),
+ priority: -40,
+
+ // If the selection is editable, pass the callback to
+ // switch the content mode.
+ editable: editable && function() {
+ this.controller.content.mode('edit-selection');
}
+ }).render() );
},
- showMediaManager: function() {
- if (this._mediaManager) {
- this._mediaManager.resetSelections();
- this._mediaManager.open();
- return;
+
+ mainInsertToolbar: function(view) {
+ var controller = this;
+
+ this.selectionStatusToolbar(view);
+
+ view.set('insert', {
+ style: 'primary',
+ priority: 80,
+ text: 'Select Image',
+ requires: { selection: true },
+
+ click: function() {
+ var state = controller.state(),
+ selection = state.get('selection');
+
+ controller.close();
+ state.trigger('insert', selection).reset();
}
-
- var MediaManager = wp.media.view.MediaFrame.Select.extend({
-
- initialize: function() {
- wp.media.view.MediaFrame.prototype.initialize.apply(this, arguments);
-
- _.defaults(this.options, {
- multiple: true,
- editing: false,
- state: 'insert'
- });
-
- this.createSelection();
- this.createStates();
- this.bindHandlers();
- this.createIframeStates();
-
- // Hide title
- this.$el.addClass('hide-title');
- },
-
- resetSelections: function() {
- this.state().get('selection').reset();
- },
-
- createQuery: function(options) {
- var query = wp.media.query(options);
- return query;
- },
-
- createStates: function() {
- var options = this.options;
-
- // Add the default states.
- this.states.add([
- // Main states.
- new wp.media.controller.Library({
- id: 'insert',
- title: 'Add images',
- priority: 20,
- toolbar: 'main-insert',
- filterable: 'image',
- library: this.createQuery(options.library),
- multiple: options.multiple ? 'reset' : false,
- editable: false,
-
- // If the user isn't allowed to edit fields,
- // can they still edit it locally?
- allowLocalEdits: false,
-
- // Show the attachment display settings.
- displaySettings: false,
- // Update user settings when users adjust the
- // attachment display settings.
- displayUserSettings: false
- }),
- ]);
-
- if(wp.media.view.settings.post.featuredImageId) {
- this.states.add(new wp.media.controller.FeaturedImage());
- }
- },
-
- bindHandlers: function() {
- // from Select
- this.on('router:create:browse', this.createRouter, this);
- this.on('router:render:browse', this.browseRouter, this);
- this.on('content:create:browse', this.browseContent, this);
- this.on('content:render:upload', this.uploadContent, this);
- this.on('toolbar:create:select', this.createSelectToolbar, this);
-
- this.on('menu:create:gallery', this.createMenu, this);
- this.on('toolbar:create:main-insert', this.createToolbar, this);
- this.on('toolbar:create:main-gallery', this.createToolbar, this);
- this.on('toolbar:create:main-embed', this.mainEmbedToolbar, this);
-
- this.on('updateExcluded', this.browseContent, this);
-
- var handlers = {
- content: {
- 'embed': 'embedContent',
- 'edit-selection': 'editSelectionContent'
- },
- toolbar: {
- 'main-insert': 'mainInsertToolbar'
- }
- };
-
- _.each(handlers, function(regionHandlers, region) {
- _.each(regionHandlers, function(callback, handler) {
- this.on(region + ':render:' + handler, this[callback], this);
- }, this);
- }, this);
- },
-
- uploadContent: function() {
- wp.media.view.MediaFrame.Select.prototype.uploadContent.apply(this, arguments);
- this.$el.addClass('hide-toolbar');
- },
-
- // Content
- embedContent: function() {
- var view = new wp.media.view.Embed({
- controller: this,
- model: this.state()
- }).render();
-
- this.content.set(view);
- view.url.focus();
- },
-
- editSelectionContent: function() {
- var state = this.state(),
- selection = state.get('selection'),
- view;
-
- view = new wp.media.view.AttachmentsBrowser({
- controller: this,
- collection: selection,
- selection: selection,
- model: state,
- sortable: true,
- search: false,
- dragInfo: true,
-
- AttachmentView: wp.media.view.Attachment.EditSelection
- }).render();
-
- view.toolbar.set('backToLibrary', {
- text: 'Return to library',
- priority: -100,
-
- click: function() {
- this.controller.content.mode('browse');
- }
- });
-
- // Browse our library of attachments.
- this.content.set(view);
- },
-
- // Toolbars
- selectionStatusToolbar: function(view) {
- var editable = this.state().get('editable');
-
- view.set('selection', new wp.media.view.Selection({
- controller: this,
- collection: this.state().get('selection'),
- priority: -40,
-
- // If the selection is editable, pass the callback to
- // switch the content mode.
- editable: editable && function() {
- this.controller.content.mode('edit-selection');
- }
- }).render() );
- },
-
- mainInsertToolbar: function(view) {
- var controller = this;
-
- this.selectionStatusToolbar(view);
-
- view.set('insert', {
- style: 'primary',
- priority: 80,
- text: 'Select Image',
- requires: { selection: true },
-
- click: function() {
- var state = controller.state(),
- selection = state.get('selection');
-
- controller.close();
- state.trigger('insert', selection).reset();
- }
- });
- },
-
- mainEmbedToolbar: function(toolbar) {
- toolbar.view = new wp.media.view.Toolbar.Embed({
- controller: this,
- text: 'Add images'
- });
- }
-
- });
-
- var theFrame = this._mediaManager = new MediaManager({
- id: 'mailpoet-media-manager',
- frame: 'select',
- title: 'Select image',
- editing: false,
- multiple: false,
- library: {
- type: 'image'
- },
- displaySettings: false,
- button: {
- text: 'Select',
- },
- }),
- that = this;
-
- this._mediaManager.on('insert', function() {
- // Append media manager image selections to Images tab
- var selection = theFrame.state().get('selection');
- selection.each(function(attachment) {
- var sizes = attachment.get('sizes'),
- // Following advice from Becs, the target width should
- // be a double of one column width to render well on
- // retina screen devices
- targetImageWidth = 1200,
-
- // For main image use the size, that's closest to being 600px in width
- sizeKeys = _.keys(sizes),
-
- // Pick the width that is closest to target width
- increasingByWidthDifference = _.sortBy(
- _.keys(sizes),
- function(size) { return Math.abs(targetImageWidth - sizes[size].width); }
- ),
- bestWidth = sizes[_.first(increasingByWidthDifference)].width,
- imagesOfBestWidth = _.filter(_.values(sizes), function(size) { return size.width === bestWidth; }),
-
- // Maximize the height if there are multiple images with same width
- mainSize = _.max(imagesOfBestWidth, function(size) { return size.height; });
-
- that.model.set({
- height: mainSize.height + 'px',
- width: mainSize.width + 'px',
- src: mainSize.url,
- alt: (attachment.get('alt') !== "" && attachment.get('alt') !== undefined) ? attachment.get('alt') : attachment.get('title'),
- });
- // Rerender settings view due to changes from outside of settings view
- that.render();
- });
- });
-
- this._mediaManager.open();
+ });
},
- onBeforeDestroy: function() {
- if (typeof this._mediaManager === 'object') {
- this._mediaManager.remove();
- }
- },
- });
- ImageWidgetView = base.WidgetView.extend({
- getTemplate: function() { return templates.imageInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.ImageBlockModel();
- },
- onDrop: function(options) {
- options.droppedView.triggerMethod('showSettings', { showImageManager: true });
- },
- }
- },
- });
- Module.ImageWidgetView = ImageWidgetView;
+ mainEmbedToolbar: function(toolbar) {
+ toolbar.view = new wp.media.view.Toolbar.Embed({
+ controller: this,
+ text: 'Add images'
+ });
+ }
- App.on('before:start', function() {
- App.registerBlockType('image', {
- blockModel: Module.ImageBlockModel,
- blockView: Module.ImageBlockView,
+ });
+
+ var theFrame = this._mediaManager = new MediaManager({
+ id: 'mailpoet-media-manager',
+ frame: 'select',
+ title: 'Select image',
+ editing: false,
+ multiple: false,
+ library: {
+ type: 'image'
+ },
+ displaySettings: false,
+ button: {
+ text: 'Select',
+ },
+ }),
+ that = this;
+
+ this._mediaManager.on('insert', function() {
+ // Append media manager image selections to Images tab
+ var selection = theFrame.state().get('selection');
+ selection.each(function(attachment) {
+ var sizes = attachment.get('sizes'),
+ // Following advice from Becs, the target width should
+ // be a double of one column width to render well on
+ // retina screen devices
+ targetImageWidth = 1200,
+
+ // For main image use the size, that's closest to being 600px in width
+ sizeKeys = _.keys(sizes),
+
+ // Pick the width that is closest to target width
+ increasingByWidthDifference = _.sortBy(
+ _.keys(sizes),
+ function(size) { return Math.abs(targetImageWidth - sizes[size].width); }
+ ),
+ bestWidth = sizes[_.first(increasingByWidthDifference)].width,
+ imagesOfBestWidth = _.filter(_.values(sizes), function(size) { return size.width === bestWidth; }),
+
+ // Maximize the height if there are multiple images with same width
+ mainSize = _.max(imagesOfBestWidth, function(size) { return size.height; });
+
+ that.model.set({
+ height: mainSize.height + 'px',
+ width: mainSize.width + 'px',
+ src: mainSize.url,
+ alt: (attachment.get('alt') !== "" && attachment.get('alt') !== undefined) ? attachment.get('alt') : attachment.get('title'),
+ });
+ // Rerender settings view due to changes from outside of settings view
+ that.render();
});
+ });
- App.registerWidget({
- name: 'image',
- widgetView: Module.ImageWidgetView,
- priority: 91,
- });
+ this._mediaManager.open();
+ },
+ onBeforeDestroy: function() {
+ if (typeof this._mediaManager === 'object') {
+ this._mediaManager.remove();
+ }
+ },
+ });
+
+ ImageWidgetView = base.WidgetView.extend({
+ getTemplate: function() { return templates.imageInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.ImageBlockModel();
+ },
+ onDrop: function(options) {
+ options.droppedView.triggerMethod('showSettings', { showImageManager: true });
+ },
+ }
+ },
+ });
+ Module.ImageWidgetView = ImageWidgetView;
+
+ App.on('before:start', function() {
+ App.registerBlockType('image', {
+ blockModel: Module.ImageBlockModel,
+ blockView: Module.ImageBlockView,
});
+
+ App.registerWidget({
+ name: 'image',
+ widgetView: Module.ImageWidgetView,
+ priority: 91,
+ });
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/posts.js b/assets/js/src/newsletter_editor/blocks/posts.js
index d973e4c2c8..070f32b162 100644
--- a/assets/js/src/newsletter_editor/blocks/posts.js
+++ b/assets/js/src/newsletter_editor/blocks/posts.js
@@ -18,463 +18,462 @@ define('newsletter_editor/blocks/posts', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.posts", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base');
+ var base = App.module('blocks.base');
- Module.PostsBlockModel = base.BlockModel.extend({
- stale: ['_selectedPosts', '_availablePosts'],
- defaults: function() {
- return this._getDefaults({
- type: 'posts',
- amount: '10',
- contentType: 'post', // 'post'|'page'|'mailpoet_page'
- postStatus: 'publish', // 'draft'|'pending'|'private'|'publish'|'future'
- terms: [], // List of category and tag objects
- search: '', // Search keyword term
- inclusionType: 'include', // 'include'|'exclude'
- displayType: 'excerpt', // 'excerpt'|'full'|'titleOnly'
- titleFormat: 'h1', // 'h1'|'h2'|'h3'|'ul'
- titlePosition: 'inTextBlock', // 'inTextBlock'|'aboveBlock',
- titleAlignment: 'left', // 'left'|'center'|'right'
- titleIsLink: false, // false|true
- imagePadded: true, // true|false
- //imageAlignment: 'centerPadded', // 'centerFull'|'centerPadded'|'left'|'right'|'alternate'|'none'
- showAuthor: 'no', // 'no'|'aboveText'|'belowText'
- authorPrecededBy: 'Author:',
- showCategories: 'no', // 'no'|'aboveText'|'belowText'
- categoriesPrecededBy: 'Categories:',
- readMoreType: 'link', // 'link'|'button'
- readMoreText: 'Read more', // 'link'|'button'
- readMoreButton: {
- text: 'Read more',
- url: '[postLink]'
- },
- sortBy: 'newest', // 'newest'|'oldest',
- showDivider: true, // true|false
- divider: {},
- _selectedPosts: [],
- _availablePosts: [],
- }, EditorApplication.getConfig().get('blockDefaults.posts'));
+ Module.PostsBlockModel = base.BlockModel.extend({
+ stale: ['_selectedPosts', '_availablePosts'],
+ defaults: function() {
+ return this._getDefaults({
+ type: 'posts',
+ amount: '10',
+ contentType: 'post', // 'post'|'page'|'mailpoet_page'
+ postStatus: 'publish', // 'draft'|'pending'|'private'|'publish'|'future'
+ terms: [], // List of category and tag objects
+ search: '', // Search keyword term
+ inclusionType: 'include', // 'include'|'exclude'
+ displayType: 'excerpt', // 'excerpt'|'full'|'titleOnly'
+ titleFormat: 'h1', // 'h1'|'h2'|'h3'|'ul'
+ titlePosition: 'inTextBlock', // 'inTextBlock'|'aboveBlock',
+ titleAlignment: 'left', // 'left'|'center'|'right'
+ titleIsLink: false, // false|true
+ imagePadded: true, // true|false
+ //imageAlignment: 'centerPadded', // 'centerFull'|'centerPadded'|'left'|'right'|'alternate'|'none'
+ showAuthor: 'no', // 'no'|'aboveText'|'belowText'
+ authorPrecededBy: 'Author:',
+ showCategories: 'no', // 'no'|'aboveText'|'belowText'
+ categoriesPrecededBy: 'Categories:',
+ readMoreType: 'link', // 'link'|'button'
+ readMoreText: 'Read more', // 'link'|'button'
+ readMoreButton: {
+ text: 'Read more',
+ url: '[postLink]'
},
- relations: function() {
- return {
- readMoreButton: App.getBlockTypeModel('button'),
- divider: App.getBlockTypeModel('divider'),
- _selectedPosts: Backbone.Collection,
- _availablePosts: Backbone.Collection,
- };
- },
- initialize: function() {
- var that = this;
- // Attach Radio.Requests API primarily for highlighting
- _.extend(this, Backbone.Radio.Requests);
+ sortBy: 'newest', // 'newest'|'oldest',
+ showDivider: true, // true|false
+ divider: {},
+ _selectedPosts: [],
+ _availablePosts: [],
+ }, EditorApplication.getConfig().get('blockDefaults.posts'));
+ },
+ relations: function() {
+ return {
+ readMoreButton: App.getBlockTypeModel('button'),
+ divider: App.getBlockTypeModel('divider'),
+ _selectedPosts: Backbone.Collection,
+ _availablePosts: Backbone.Collection,
+ };
+ },
+ initialize: function() {
+ var that = this;
+ // Attach Radio.Requests API primarily for highlighting
+ _.extend(this, Backbone.Radio.Requests);
- this.fetchAvailablePosts();
- this.on('change:amount change:contentType change:terms change:inclusionType change:postStatus change:search change:sortBy', this._scheduleFetchAvailablePosts, this);
- this.on('insertSelectedPosts', this._insertSelectedPosts, this);
- },
- fetchAvailablePosts: function() {
- var that = this;
- // TODO: Move this logic to new AJAX query format
- //mailpoet_post_wpi('posts.php', this.toJSON(), function(response) {
- //console.log('Posts fetched', arguments);
- //that.get('_availablePosts').reset(response);
- //that.get('_selectedPosts').reset(); // Empty out the collection
- //that.trigger('change:_availablePosts');
- //}, function() {
- //console.log('Posts fetchPosts error', arguments);
- //});
- },
- /**
- * Batch more changes during a specific time, instead of fetching
- * ALC posts on each model change
- */
- _scheduleFetchAvailablePosts: function() {
- var timeout = 500,
- that = this;
- if (this._fetchPostsTimer !== undefined) {
- clearTimeout(this._fetchPostsTimer);
- }
- this._fetchPostsTimer = setTimeout(function() {
- that.fetchAvailablePosts();
- that._fetchPostsTimer = undefined;
- }, timeout);
- },
- _insertSelectedPosts: function() {
- var that = this,
- data = this.toJSON(),
- index = this.collection.indexOf(this),
- collection = this.collection;
+ this.fetchAvailablePosts();
+ this.on('change:amount change:contentType change:terms change:inclusionType change:postStatus change:search change:sortBy', this._scheduleFetchAvailablePosts, this);
+ this.on('insertSelectedPosts', this._insertSelectedPosts, this);
+ },
+ fetchAvailablePosts: function() {
+ var that = this;
+ // TODO: Move this logic to new AJAX query format
+ //mailpoet_post_wpi('posts.php', this.toJSON(), function(response) {
+ //console.log('Posts fetched', arguments);
+ //that.get('_availablePosts').reset(response);
+ //that.get('_selectedPosts').reset(); // Empty out the collection
+ //that.trigger('change:_availablePosts');
+ //}, function() {
+ //console.log('Posts fetchPosts error', arguments);
+ //});
+ },
+ /**
+ * Batch more changes during a specific time, instead of fetching
+ * ALC posts on each model change
+ */
+ _scheduleFetchAvailablePosts: function() {
+ var timeout = 500,
+ that = this;
+ if (this._fetchPostsTimer !== undefined) {
+ clearTimeout(this._fetchPostsTimer);
+ }
+ this._fetchPostsTimer = setTimeout(function() {
+ that.fetchAvailablePosts();
+ that._fetchPostsTimer = undefined;
+ }, timeout);
+ },
+ _insertSelectedPosts: function() {
+ var that = this,
+ data = this.toJSON(),
+ index = this.collection.indexOf(this),
+ collection = this.collection;
- data.posts = this.get('_selectedPosts').pluck('ID');
+ data.posts = this.get('_selectedPosts').pluck('ID');
- if (data.posts.length === 0) return;
+ if (data.posts.length === 0) return;
- // TODO: Move query logic to new AJAX format
- //mailpoet_post_wpi('automated_latest_content.php', data, function(response) {
- //console.log('Available posts fetched', arguments);
- //collection.add(response, { at: index });
- //}, function() {
- //console.log('Posts fetchPosts error', arguments);
- //});
- },
- });
+ // TODO: Move query logic to new AJAX format
+ //mailpoet_post_wpi('automated_latest_content.php', data, function(response) {
+ //console.log('Available posts fetched', arguments);
+ //collection.add(response, { at: index });
+ //}, function() {
+ //console.log('Posts fetchPosts error', arguments);
+ //});
+ },
+ });
- Module.PostsBlockView = base.BlockView.extend({
- className: "mailpoet_block mailpoet_posts_block mailpoet_droppable_block",
- getTemplate: function() { return templates.postsBlock; },
- modelEvents: {},
- onDragSubstituteBy: function() { return Module.PostsWidgetView; },
- initialize: function() {
- this.toolsView = new Module.PostsBlockToolsView({ model: this.model });
- this.on('showSettings', this.showSettings);
- this.model.reply('blockView', this.notifyAboutSelf, this);
- },
- onRender: function() {
- if (!this.toolsRegion.hasView()) {
- this.toolsRegion.show(this.toolsView);
- }
- this.trigger('showSettings');
- },
- showSettings: function(options) {
- this.toolsView.triggerMethod('showSettings', options);
- },
- notifyAboutSelf: function() {
- return this;
- },
- onBeforeDestroy: function() {
- this.model.stopReplying('blockView', this.notifyAboutSelf, this);
- },
- });
+ Module.PostsBlockView = base.BlockView.extend({
+ className: "mailpoet_block mailpoet_posts_block mailpoet_droppable_block",
+ getTemplate: function() { return templates.postsBlock; },
+ modelEvents: {},
+ onDragSubstituteBy: function() { return Module.PostsWidgetView; },
+ initialize: function() {
+ this.toolsView = new Module.PostsBlockToolsView({ model: this.model });
+ this.on('showSettings', this.showSettings);
+ this.model.reply('blockView', this.notifyAboutSelf, this);
+ },
+ onRender: function() {
+ if (!this.toolsRegion.hasView()) {
+ this.toolsRegion.show(this.toolsView);
+ }
+ this.trigger('showSettings');
+ },
+ showSettings: function(options) {
+ this.toolsView.triggerMethod('showSettings', options);
+ },
+ notifyAboutSelf: function() {
+ return this;
+ },
+ onBeforeDestroy: function() {
+ this.model.stopReplying('blockView', this.notifyAboutSelf, this);
+ },
+ });
- Module.PostsBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.PostsBlockSettingsView; },
- initialize: function() {
- base.BlockToolsView.prototype.initialize.apply(this, arguments);
- this.on('showSettings', this.changeSettings);
- this.settingsView = new Module.PostsBlockSettingsView({ model: this.model });
- },
- changeSettings: function() {
- this.settingsView.render();
- },
- onBeforeDestroy: function() {
- this.settingsView.destroy();
- this.off('showSettings');
- MailPoet.Modal.close();
- },
- });
+ Module.PostsBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.PostsBlockSettingsView; },
+ initialize: function() {
+ base.BlockToolsView.prototype.initialize.apply(this, arguments);
+ this.on('showSettings', this.changeSettings);
+ this.settingsView = new Module.PostsBlockSettingsView({ model: this.model });
+ },
+ changeSettings: function() {
+ this.settingsView.render();
+ },
+ onBeforeDestroy: function() {
+ this.settingsView.destroy();
+ this.off('showSettings');
+ MailPoet.Modal.close();
+ },
+ });
- Module.PostsBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.postsBlockSettings; },
- regions: {
- selectionRegion: '.mailpoet_settings_posts_selection',
- displayOptionsRegion: '.mailpoet_settings_posts_display_options',
- },
- events: {
- 'click .mailpoet_settings_posts_show_display_options': 'switchToDisplayOptions',
- 'click .mailpoet_settings_posts_show_post_selection': 'switchToPostSelection',
- 'click .mailpoet_settings_posts_insert_selected': 'insertPosts',
- },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- };
- },
- initialize: function() {
- this.selectionView = new PostSelectionSettingsView({ model: this.model });
- this.displayOptionsView = new PostsDisplayOptionsSettingsView({ model: this.model });
- },
- onRender: function() {
- var that = this,
- blockView = this.model.request('blockView');
+ Module.PostsBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.postsBlockSettings; },
+ regions: {
+ selectionRegion: '.mailpoet_settings_posts_selection',
+ displayOptionsRegion: '.mailpoet_settings_posts_display_options',
+ },
+ events: {
+ 'click .mailpoet_settings_posts_show_display_options': 'switchToDisplayOptions',
+ 'click .mailpoet_settings_posts_show_post_selection': 'switchToPostSelection',
+ 'click .mailpoet_settings_posts_insert_selected': 'insertPosts',
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ };
+ },
+ initialize: function() {
+ this.selectionView = new PostSelectionSettingsView({ model: this.model });
+ this.displayOptionsView = new PostsDisplayOptionsSettingsView({ model: this.model });
+ },
+ onRender: function() {
+ var that = this,
+ blockView = this.model.request('blockView');
- this.selectionRegion.show(this.selectionView);
- this.displayOptionsRegion.show(this.displayOptionsView);
+ this.selectionRegion.show(this.selectionView);
+ this.displayOptionsRegion.show(this.displayOptionsView);
- MailPoet.Modal.panel({
- element: this.$el,
- template: '',
- position: 'right',
- overlay: true,
- highlight: blockView.$el,
- width: App.getConfig().get('sidepanelWidth'),
- onCancel: function() {
- // Self destroy the block if the user closes settings modal
- that.model.destroy();
- },
+ MailPoet.Modal.panel({
+ element: this.$el,
+ template: '',
+ position: 'right',
+ overlay: true,
+ highlight: blockView.$el,
+ width: App.getConfig().get('sidepanelWidth'),
+ onCancel: function() {
+ // Self destroy the block if the user closes settings modal
+ that.model.destroy();
+ },
+ });
+ },
+ switchToDisplayOptions: function() {
+ // Switch content view
+ this.$('.mailpoet_settings_posts_selection').addClass('mailpoet_hidden');
+ this.$('.mailpoet_settings_posts_display_options').removeClass('mailpoet_hidden');
+
+ // Switch controls
+ this.$('.mailpoet_settings_posts_show_display_options').addClass('mailpoet_hidden');
+ this.$('.mailpoet_settings_posts_show_post_selection').removeClass('mailpoet_hidden');
+ },
+ switchToPostSelection: function() {
+ // Switch content view
+ this.$('.mailpoet_settings_posts_display_options').addClass('mailpoet_hidden');
+ this.$('.mailpoet_settings_posts_selection').removeClass('mailpoet_hidden');
+
+ // Switch controls
+ this.$('.mailpoet_settings_posts_show_post_selection').addClass('mailpoet_hidden');
+ this.$('.mailpoet_settings_posts_show_display_options').removeClass('mailpoet_hidden');
+ },
+ insertPosts: function() {
+ this.model.trigger('insertSelectedPosts');
+ this.model.destroy();
+ },
+ });
+
+ var PostSelectionSettingsView = Marionette.CompositeView.extend({
+ getTemplate: function() { return templates.postSelectionPostsBlockSettings; },
+ getChildView: function() { return SinglePostSelectionSettingsView; },
+ childViewContainer: '.mailpoet_post_selection_container',
+ getEmptyView: function() { return EmptyPostSelectionSettingsView; },
+ childViewOptions: function() {
+ return {
+ blockModel: this.model,
+ };
+ },
+ events: function() {
+ return {
+ 'change .mailpoet_settings_posts_content_type': _.partial(this.changeField, 'contentType'),
+ 'change .mailpoet_posts_post_status': _.partial(this.changeField, 'postStatus'),
+ 'keyup .mailpoet_posts_search_term': _.partial(this.changeField, 'search'),
+ };
+ },
+ constructor: function() {
+ // Set the block collection to be handled by this view as well
+ arguments[0].collection = arguments[0].model.get('_availablePosts');
+ Marionette.CompositeView.apply(this, arguments);
+ },
+ onRender: function() {
+ var that = this;
+
+ this.$('.mailpoet_posts_categories_and_tags').select2({
+ multiple: true,
+ allowClear: true,
+ ajax: {
+ url: App.getConfig().get('urls.termSearch'),
+ type: 'POST',
+ dataType: 'json',
+ delay: 250,
+ data: function(searchParameter, page) {
+ return JSON.stringify({
+ postType: that.model.get('contentType'),
+ search: searchParameter,
+ limit: 10, // TODO: Move this hardcoded limit to Config
+ page: page,
});
- },
- switchToDisplayOptions: function() {
- // Switch content view
- this.$('.mailpoet_settings_posts_selection').addClass('mailpoet_hidden');
- this.$('.mailpoet_settings_posts_display_options').removeClass('mailpoet_hidden');
-
- // Switch controls
- this.$('.mailpoet_settings_posts_show_display_options').addClass('mailpoet_hidden');
- this.$('.mailpoet_settings_posts_show_post_selection').removeClass('mailpoet_hidden');
- },
- switchToPostSelection: function() {
- // Switch content view
- this.$('.mailpoet_settings_posts_display_options').addClass('mailpoet_hidden');
- this.$('.mailpoet_settings_posts_selection').removeClass('mailpoet_hidden');
-
- // Switch controls
- this.$('.mailpoet_settings_posts_show_post_selection').addClass('mailpoet_hidden');
- this.$('.mailpoet_settings_posts_show_display_options').removeClass('mailpoet_hidden');
- },
- insertPosts: function() {
- this.model.trigger('insertSelectedPosts');
- this.model.destroy();
- },
- });
-
- var PostSelectionSettingsView = Marionette.CompositeView.extend({
- getTemplate: function() { return templates.postSelectionPostsBlockSettings; },
- getChildView: function() { return SinglePostSelectionSettingsView; },
- childViewContainer: '.mailpoet_post_selection_container',
- getEmptyView: function() { return EmptyPostSelectionSettingsView; },
- childViewOptions: function() {
+ },
+ /**
+ * Parse results for select2.
+ * Returns object, where `results` key holds a list of
+ * select item objects
+ */
+ results: function (data, page) {
return {
- blockModel: this.model,
- };
- },
- events: function() {
- return {
- 'change .mailpoet_settings_posts_content_type': _.partial(this.changeField, 'contentType'),
- 'change .mailpoet_posts_post_status': _.partial(this.changeField, 'postStatus'),
- 'keyup .mailpoet_posts_search_term': _.partial(this.changeField, 'search'),
- };
- },
- constructor: function() {
- // Set the block collection to be handled by this view as well
- arguments[0].collection = arguments[0].model.get('_availablePosts');
- Marionette.CompositeView.apply(this, arguments);
- },
- onRender: function() {
- var that = this;
-
- this.$('.mailpoet_posts_categories_and_tags').select2({
- multiple: true,
- allowClear: true,
- ajax: {
- url: App.getConfig().get('urls.termSearch'),
- type: 'POST',
- dataType: 'json',
- delay: 250,
- data: function(searchParameter, page) {
- return JSON.stringify({
- postType: that.model.get('contentType'),
- search: searchParameter,
- limit: 10, // TODO: Move this hardcoded limit to Config
- page: page,
- });
- },
- /**
- * Parse results for select2.
- * Returns object, where `results` key holds a list of
- * select item objects
- */
- results: function (data, page) {
- return {
- results: _.map(
- data.results,
- function(item) {
- return _.defaults({
- text: data.taxonomies[item.taxonomy].labels.singular_name + ': ' + item.name,
- id: item.term_id
- }, item);
- }
- )
- };
- }
- },
- }).trigger( 'change' ).on({
- 'change': function(e){
- var data = [];
-
- if (typeof data === 'string') {
- if (data === '') {
- data = [];
- } else {
- data = JSON.parse(data);
- }
- }
-
- if ( e.added ){
- data.push(e.added);
- }
-
- // Update ALC model
- that.model.set('terms', data);
-
- $(this).data('selected', JSON.stringify(data));
+ results: _.map(
+ data.results,
+ function(item) {
+ return _.defaults({
+ text: data.taxonomies[item.taxonomy].labels.singular_name + ': ' + item.name,
+ id: item.term_id
+ }, item);
}
- });
- },
- onBeforeDestroy: function() {
- // Force close select2 if it hasn't closed yet
- this.$('.mailpoet_posts_categories_and_tags').select2('close');
- },
- changeField: function(field, event) {
- this.model.set(field, jQuery(event.target).val());
- },
- });
-
- var EmptyPostSelectionSettingsView = Marionette.ItemView.extend({
- getTemplate: function() { return templates.emptyPostPostsBlockSettings; },
- });
-
- var SinglePostSelectionSettingsView = Marionette.ItemView.extend({
- getTemplate: function() { return templates.singlePostPostsBlockSettings; },
- events: function() {
- return {
- 'change .mailpoet_select_post_checkbox': 'postSelectionChange',
+ )
};
+ }
},
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- index: this._index,
- };
- },
- initialize: function(options) {
- this.blockModel = options.blockModel;
- },
- postSelectionChange: function(event) {
- var checkBox = jQuery(event.target),
- selectedPostsCollection = this.blockModel.get('_selectedPosts');
- if (checkBox.prop('checked')) {
- selectedPostsCollection.add(this.model);
+ }).trigger( 'change' ).on({
+ 'change': function(e){
+ var data = [];
+
+ if (typeof data === 'string') {
+ if (data === '') {
+ data = [];
} else {
- selectedPostsCollection.remove(this.model);
+ data = JSON.parse(data);
}
+ }
+
+ if ( e.added ){
+ data.push(e.added);
+ }
+
+ // Update ALC model
+ that.model.set('terms', data);
+
+ $(this).data('selected', JSON.stringify(data));
+ }
+ });
+ },
+ onBeforeDestroy: function() {
+ // Force close select2 if it hasn't closed yet
+ this.$('.mailpoet_posts_categories_and_tags').select2('close');
+ },
+ changeField: function(field, event) {
+ this.model.set(field, jQuery(event.target).val());
+ },
+ });
+
+ var EmptyPostSelectionSettingsView = Marionette.ItemView.extend({
+ getTemplate: function() { return templates.emptyPostPostsBlockSettings; },
+ });
+
+ var SinglePostSelectionSettingsView = Marionette.ItemView.extend({
+ getTemplate: function() { return templates.singlePostPostsBlockSettings; },
+ events: function() {
+ return {
+ 'change .mailpoet_select_post_checkbox': 'postSelectionChange',
+ };
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ index: this._index,
+ };
+ },
+ initialize: function(options) {
+ this.blockModel = options.blockModel;
+ },
+ postSelectionChange: function(event) {
+ var checkBox = jQuery(event.target),
+ selectedPostsCollection = this.blockModel.get('_selectedPosts');
+ if (checkBox.prop('checked')) {
+ selectedPostsCollection.add(this.model);
+ } else {
+ selectedPostsCollection.remove(this.model);
+ }
+ },
+ });
+
+ var PostsDisplayOptionsSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.displayOptionsPostsBlockSettings; },
+ events: function() {
+ return {
+ "click .mailpoet_posts_select_button": 'showButtonSettings',
+ "click .mailpoet_posts_select_divider": 'showDividerSettings',
+ "change .mailpoet_posts_read_more_type": 'changeReadMoreType',
+ "change .mailpoet_posts_display_type": 'changeDisplayType',
+ "change .mailpoet_posts_title_format": 'changeTitleFormat',
+ "change .mailpoet_posts_title_as_links": _.partial(this.changeBoolField, 'titleIsLink'),
+ "change .mailpoet_posts_show_divider": _.partial(this.changeBoolField, 'showDivider'),
+ "keyup .mailpoet_posts_show_amount": _.partial(this.changeField, "amount"),
+ "change .mailpoet_posts_content_type": _.partial(this.changeField, "contentType"),
+ "change .mailpoet_posts_include_or_exclude": _.partial(this.changeField, "inclusionType"),
+ "change .mailpoet_posts_title_position": _.partial(this.changeField, "titlePosition"),
+ "change .mailpoet_posts_title_alignment": _.partial(this.changeField, "titleAlignment"),
+ "change .mailpoet_posts_image_padded": _.partial(this.changeBoolField, "imagePadded"),
+ "change .mailpoet_posts_show_author": _.partial(this.changeField, "showAuthor"),
+ "keyup .mailpoet_posts_author_preceded_by": _.partial(this.changeField, "authorPrecededBy"),
+ "change .mailpoet_posts_show_categories": _.partial(this.changeField, "showCategories"),
+ "keyup .mailpoet_posts_categories": _.partial(this.changeField, "categoriesPrecededBy"),
+ "keyup .mailpoet_posts_read_more_text": _.partial(this.changeField, "readMoreText"),
+ "change .mailpoet_posts_sort_by": _.partial(this.changeField, "sortBy"),
+ };
+ },
+ behaviors: {
+ ColorPickerBehavior: {},
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ };
+ },
+ showButtonSettings: function(event) {
+ var buttonModule = App.module('blocks.button');
+ (new buttonModule.ButtonBlockSettingsView({
+ model: this.model.get('readMoreButton'),
+ renderOptions: {
+ displayFormat: 'subpanel',
+ hideLink: true,
+ hideApplyToAll: true,
},
+ })).render();
+ },
+ showDividerSettings: function(event) {
+ var dividerModule = App.module('blocks.divider');
+ (new dividerModule.DividerBlockSettingsView({
+ model: this.model.get('divider'),
+ renderOptions: {
+ displayFormat: 'subpanel',
+ hideApplyToAll: true,
+ },
+ })).render();
+ },
+ changeReadMoreType: function(event) {
+ var value = jQuery(event.target).val();
+ if (value == 'link') {
+ this.$('.mailpoet_posts_read_more_text').removeClass('mailpoet_hidden');
+ this.$('.mailpoet_posts_select_button').addClass('mailpoet_hidden');
+ } else if (value == 'button') {
+ this.$('.mailpoet_posts_read_more_text').addClass('mailpoet_hidden');
+ this.$('.mailpoet_posts_select_button').removeClass('mailpoet_hidden');
+ }
+ this.changeField('readMoreType', event);
+ },
+ changeDisplayType: function(event) {
+ var value = jQuery(event.target).val();
+ if (value == 'titleOnly') {
+ this.$('.mailpoet_posts_title_position_container').addClass('mailpoet_hidden');
+ this.$('.mailpoet_posts_title_as_list').removeClass('mailpoet_hidden');
+ } else {
+ this.$('.mailpoet_posts_title_position_container').removeClass('mailpoet_hidden');
+ this.$('.mailpoet_posts_title_as_list').addClass('mailpoet_hidden');
+
+ // Reset titleFormat if it was set to List when switching away from displayType=titleOnly
+ if (this.model.get('titleFormat') === 'ul') {
+ this.model.set('titleFormat', 'h1');
+ this.$('.mailpoet_posts_title_format').val(['h1']);
+ this.$('.mailpoet_posts_title_as_link').removeClass('mailpoet_hidden');
+ }
+ }
+ this.changeField('displayType', event);
+ },
+ changeTitleFormat: function(event) {
+ var value = jQuery(event.target).val();
+ if (value == 'ul') {
+ this.$('.mailpoet_posts_non_title_list_options').addClass('mailpoet_hidden');
+
+ this.model.set('titleIsLink', true);
+ this.$('.mailpoet_posts_title_as_link').addClass('mailpoet_hidden');
+ this.$('.mailpoet_posts_title_as_links').val(['true']);
+ } else {
+ this.$('.mailpoet_posts_non_title_list_options').removeClass('mailpoet_hidden');
+ this.$('.mailpoet_posts_title_as_link').removeClass('mailpoet_hidden');
+ }
+ this.changeField('titleFormat', event);
+ },
+ });
+
+ Module.PostsWidgetView = base.WidgetView.extend({
+ getTemplate: function() { return templates.postsInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.PostsBlockModel({}, { parse: true });
+ }
+ }
+ },
+ });
+
+ App.on('before:start', function() {
+ App.registerBlockType('posts', {
+ blockModel: Module.PostsBlockModel,
+ blockView: Module.PostsBlockView,
});
- var PostsDisplayOptionsSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.displayOptionsPostsBlockSettings; },
- events: function() {
- return {
- "click .mailpoet_posts_select_button": 'showButtonSettings',
- "click .mailpoet_posts_select_divider": 'showDividerSettings',
- "change .mailpoet_posts_read_more_type": 'changeReadMoreType',
- "change .mailpoet_posts_display_type": 'changeDisplayType',
- "change .mailpoet_posts_title_format": 'changeTitleFormat',
- "change .mailpoet_posts_title_as_links": _.partial(this.changeBoolField, 'titleIsLink'),
- "change .mailpoet_posts_show_divider": _.partial(this.changeBoolField, 'showDivider'),
- "keyup .mailpoet_posts_show_amount": _.partial(this.changeField, "amount"),
- "change .mailpoet_posts_content_type": _.partial(this.changeField, "contentType"),
- "change .mailpoet_posts_include_or_exclude": _.partial(this.changeField, "inclusionType"),
- "change .mailpoet_posts_title_position": _.partial(this.changeField, "titlePosition"),
- "change .mailpoet_posts_title_alignment": _.partial(this.changeField, "titleAlignment"),
- "change .mailpoet_posts_image_padded": _.partial(this.changeBoolField, "imagePadded"),
- "change .mailpoet_posts_show_author": _.partial(this.changeField, "showAuthor"),
- "keyup .mailpoet_posts_author_preceded_by": _.partial(this.changeField, "authorPrecededBy"),
- "change .mailpoet_posts_show_categories": _.partial(this.changeField, "showCategories"),
- "keyup .mailpoet_posts_categories": _.partial(this.changeField, "categoriesPrecededBy"),
- "keyup .mailpoet_posts_read_more_text": _.partial(this.changeField, "readMoreText"),
- "change .mailpoet_posts_sort_by": _.partial(this.changeField, "sortBy"),
- };
- },
- behaviors: {
- ColorPickerBehavior: {},
- },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- };
- },
- showButtonSettings: function(event) {
- var buttonModule = App.module('blocks.button');
- (new buttonModule.ButtonBlockSettingsView({
- model: this.model.get('readMoreButton'),
- renderOptions: {
- displayFormat: 'subpanel',
- hideLink: true,
- hideApplyToAll: true,
- },
- })).render();
- },
- showDividerSettings: function(event) {
- var dividerModule = App.module('blocks.divider');
- (new dividerModule.DividerBlockSettingsView({
- model: this.model.get('divider'),
- renderOptions: {
- displayFormat: 'subpanel',
- hideApplyToAll: true,
- },
- })).render();
- },
- changeReadMoreType: function(event) {
- var value = jQuery(event.target).val();
- if (value == 'link') {
- this.$('.mailpoet_posts_read_more_text').removeClass('mailpoet_hidden');
- this.$('.mailpoet_posts_select_button').addClass('mailpoet_hidden');
- } else if (value == 'button') {
- this.$('.mailpoet_posts_read_more_text').addClass('mailpoet_hidden');
- this.$('.mailpoet_posts_select_button').removeClass('mailpoet_hidden');
- }
- this.changeField('readMoreType', event);
- },
- changeDisplayType: function(event) {
- var value = jQuery(event.target).val();
- if (value == 'titleOnly') {
- this.$('.mailpoet_posts_title_position_container').addClass('mailpoet_hidden');
- this.$('.mailpoet_posts_title_as_list').removeClass('mailpoet_hidden');
- } else {
- this.$('.mailpoet_posts_title_position_container').removeClass('mailpoet_hidden');
- this.$('.mailpoet_posts_title_as_list').addClass('mailpoet_hidden');
-
- // Reset titleFormat if it was set to List when switching away from displayType=titleOnly
- if (this.model.get('titleFormat') === 'ul') {
- this.model.set('titleFormat', 'h1');
- this.$('.mailpoet_posts_title_format').val(['h1']);
- this.$('.mailpoet_posts_title_as_link').removeClass('mailpoet_hidden');
- }
- }
- this.changeField('displayType', event);
- },
- changeTitleFormat: function(event) {
- var value = jQuery(event.target).val();
- if (value == 'ul') {
- this.$('.mailpoet_posts_non_title_list_options').addClass('mailpoet_hidden');
-
- this.model.set('titleIsLink', true);
- this.$('.mailpoet_posts_title_as_link').addClass('mailpoet_hidden');
- this.$('.mailpoet_posts_title_as_links').val(['true']);
- } else {
- this.$('.mailpoet_posts_non_title_list_options').removeClass('mailpoet_hidden');
- this.$('.mailpoet_posts_title_as_link').removeClass('mailpoet_hidden');
- }
- this.changeField('titleFormat', event);
- },
- });
-
- Module.PostsWidgetView = base.WidgetView.extend({
- getTemplate: function() { return templates.postsInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.PostsBlockModel({}, { parse: true });
- }
- }
- },
- });
-
- App.on('before:start', function() {
- App.registerBlockType('posts', {
- blockModel: Module.PostsBlockModel,
- blockView: Module.PostsBlockView,
- });
-
- App.registerWidget({
- name: 'posts',
- widgetView: Module.PostsWidgetView,
- priority: 96,
- });
+ App.registerWidget({
+ name: 'posts',
+ widgetView: Module.PostsWidgetView,
+ priority: 96,
});
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/social.js b/assets/js/src/newsletter_editor/blocks/social.js
index a4eeb8c982..4bc8b6f546 100644
--- a/assets/js/src/newsletter_editor/blocks/social.js
+++ b/assets/js/src/newsletter_editor/blocks/social.js
@@ -9,366 +9,365 @@ define('newsletter_editor/blocks/social', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.social", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base'),
- SocialBlockSettingsIconSelectorView, SocialBlockSettingsIconView, SocialBlockSettingsStylesView;
+ var base = App.module('blocks.base'),
+ SocialBlockSettingsIconSelectorView, SocialBlockSettingsIconView, SocialBlockSettingsStylesView;
- Module.SocialIconModel = Backbone.SuperModel.extend({
- defaults: function() {
- var defaultValues = App.getConfig().get('socialIcons.custom');
- return {
+ Module.SocialIconModel = Backbone.SuperModel.extend({
+ defaults: function() {
+ var defaultValues = App.getConfig().get('socialIcons.custom');
+ return {
+ type: 'socialIcon',
+ iconType: 'custom',
+ link: defaultValues.get('defaultLink'),
+ image: App.getAvailableStyles().get('socialIconSets.default.custom'),
+ height: '32px',
+ width: '32px',
+ text: defaultValues.get('title'),
+ };
+ },
+ initialize: function(options) {
+ var that = this;
+ // Make model swap to default values for that type when iconType changes
+ this.on('change:iconType', function() {
+ var defaultValues = App.getConfig().get('socialIcons').get(that.get('iconType')),
+ iconSet = that.collection.iconBlockModel.getIconSet();
+ this.set({
+ link: defaultValues.get('defaultLink'),
+ image: iconSet.get(that.get('iconType')),
+ text: defaultValues.get('title'),
+ });
+ }, this);
+ this.on('change', function() { App.getChannel().trigger('autoSave'); });
+ },
+ });
+
+ Module.SocialIconCollectionModel = Backbone.Collection.extend({
+ model: Module.SocialIconModel
+ });
+
+ Module.SocialBlockModel = base.BlockModel.extend({
+ name: 'iconBlockModel',
+ defaults: function() {
+ return this._getDefaults({
+ type: 'social',
+ iconSet: 'default',
+ icons: new Module.SocialIconCollectionModel(),
+ }, EditorApplication.getConfig().get('blockDefaults.social'));
+ },
+ relations: {
+ icons: Module.SocialIconCollectionModel,
+ },
+ initialize: function() {
+ this.get('icons').on('add remove change', this._iconsChanged, this);
+ this.on('change:iconSet', this.changeIconSet, this);
+ },
+ getIconSet: function() {
+ return App.getAvailableStyles().get('socialIconSets').get(this.get('iconSet'));
+ },
+ changeIconSet: function() {
+ var iconSet = this.getIconSet();
+ _.each(this.get('icons').models, function(model) {
+ model.set('image', iconSet.get(model.get('iconType')));
+ });
+ },
+ _iconsChanged: function() {
+ App.getChannel().trigger('autoSave');
+ },
+ });
+
+ var SocialIconView = Marionette.ItemView.extend({
+ tagName: 'span',
+ getTemplate: function() { return templates.socialIconBlock; },
+ modelEvents: {
+ 'change': 'render',
+ },
+ templateHelpers: function() {
+ var allIconSets = App.getAvailableStyles().get('socialIconSets');
+ return {
+ model: this.model.toJSON(),
+ allIconSets: allIconSets.toJSON(),
+ };
+ },
+ });
+
+ Module.SocialBlockView = Marionette.CompositeView.extend({
+ regionClass: Marionette.Region,
+ className: 'mailpoet_block mailpoet_social_block mailpoet_droppable_block',
+ getTemplate: function() { return templates.socialBlock; },
+ childViewContainer: '.mailpoet_social',
+ modelEvents: {
+ 'change': 'render'
+ },
+ events: {
+ "mouseover": "showTools",
+ "mouseout": "hideTools",
+ },
+ regions: {
+ toolsRegion: '> .mailpoet_tools',
+ },
+ ui: {
+ tools: '> .mailpoet_tools'
+ },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ hideOriginal: true,
+ onDrop: function(options) {
+ // After a clone of model has been dropped, cleanup
+ // and destroy self
+ options.dragBehavior.view.model.destroy();
+ },
+ onDragSubstituteBy: function(behavior) {
+ var WidgetView, node;
+ // When block is being dragged, display the widget icon instead.
+ // This will create an instance of block's widget view and
+ // use it's rendered DOM element instead of the content block
+ if (_.isFunction(behavior.view.onDragSubstituteBy)) {
+ WidgetView = new (behavior.view.onDragSubstituteBy())();
+ WidgetView.render();
+ node = WidgetView.$el.get(0).cloneNode(true);
+ WidgetView.destroy();
+ return node;
+ }
+ },
+ },
+ },
+ onDragSubstituteBy: function() { return Module.SocialWidgetView; },
+ constructor: function() {
+ // Set the block collection to be handled by this view as well
+ arguments[0].collection = arguments[0].model.get('icons');
+ Marionette.CompositeView.apply(this, arguments);
+ },
+ // Determines which view type should be used for a child
+ childView: SocialIconView,
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ viewCid: this.cid,
+ };
+ },
+ onRender: function() {
+ this._rebuildRegions();
+ this.toolsView = new Module.SocialBlockToolsView({ model: this.model });
+ this.toolsRegion.show(this.toolsView);
+ },
+ onBeforeDestroy: function() {
+ this.regionManager.destroy();
+ },
+ showTools: function(_event) {
+ this.$(this.ui.tools).show();
+ _event.stopPropagation();
+ },
+ hideTools: function(_event) {
+ this.$(this.ui.tools).hide();
+ _event.stopPropagation();
+ },
+ getDropFunc: function() {
+ var that = this;
+ return function() {
+ var newModel = that.model.clone();
+ //that.model.destroy();
+ return newModel;
+ };
+ },
+ _buildRegions: function(regions) {
+ var that = this;
+
+ var defaults = {
+ regionClass: this.getOption('regionClass'),
+ parentEl: function() { return that.$el; }
+ };
+
+ return this.regionManager.addRegions(regions, defaults);
+ },
+ _rebuildRegions: function() {
+ if (this.regionManager === undefined) {
+ this.regionManager = new Backbone.Marionette.RegionManager();
+ }
+ this.regionManager.destroy();
+ _.extend(this, this._buildRegions(this.regions));
+ },
+ });
+
+ Module.SocialBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.SocialBlockSettingsView; },
+ });
+
+ // Sidebar view container
+ Module.SocialBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.socialBlockSettings; },
+ regions: {
+ iconRegion: '#mailpoet_social_icons_selection',
+ stylesRegion: '#mailpoet_social_icons_styles',
+ },
+ events: function() {
+ return {
+ "click .mailpoet_done_editing": "close",
+ };
+ },
+ initialize: function() {
+ base.BlockSettingsView.prototype.initialize.apply(this, arguments);
+
+ this._iconSelectorView = new SocialBlockSettingsIconSelectorView({ model: this.model });
+ this._stylesView = new SocialBlockSettingsStylesView({ model: this.model });
+ },
+ onRender: function() {
+ this.iconRegion.show(this._iconSelectorView);
+ this.stylesRegion.show(this._stylesView);
+ }
+ });
+
+ // Single icon settings view, used by the selector view
+ SocialBlockSettingsIconView = Marionette.ItemView.extend({
+ getTemplate: function() { return templates.socialSettingsIcon; },
+ events: function() {
+ return {
+ "click .mailpoet_delete_block": "deleteIcon",
+ "change .mailpoet_social_icon_field_type": _.partial(this.changeField, "iconType"),
+ "keyup .mailpoet_social_icon_field_image": _.partial(this.changeField, "image"),
+ "keyup .mailpoet_social_icon_field_link": this.changeLink,
+ "keyup .mailpoet_social_icon_field_text": _.partial(this.changeField, "text"),
+ };
+ },
+ modelEvents: {
+ 'change:iconType': 'render',
+ 'change:image': function() {
+ this.$('.mailpoet_social_icon_image').attr('src', this.model.get('image'));
+ },
+ 'change:text': function() {
+ this.$('.mailpoet_social_icon_image').attr('alt', this.model.get('text'));
+ },
+ },
+ templateHelpers: function() {
+ var icons = App.getConfig().get('socialIcons'),
+ // Construct icon type list of format [{iconType: 'type', title: 'Title'}, ...]
+ availableIconTypes = _.map(_.keys(icons.attributes), function(key) { return { iconType: key, title: icons.get(key).get('title') }; }),
+ allIconSets = App.getAvailableStyles().get('socialIconSets');
+ return {
+ model: this.model.toJSON(),
+ iconTypes: availableIconTypes,
+ currentType: icons.get(this.model.get('iconType')).toJSON(),
+ allIconSets: allIconSets.toJSON(),
+ };
+ },
+ deleteIcon: function() {
+ this.model.destroy();
+ },
+ changeLink: function(event) {
+ if (this.model.get('iconType') === 'email') {
+ this.model.set('link', 'mailto:' + jQuery(event.target).val());
+ } else {
+ return this.changeField('link', event);
+ }
+ },
+ changeField: function(field, event) {
+ this.model.set(field, jQuery(event.target).val());
+ },
+ });
+
+ // Select icons section container view
+ SocialBlockSettingsIconSelectorView = Marionette.CompositeView.extend({
+ getTemplate: function() { return templates.socialSettingsIconSelector; },
+ childView: SocialBlockSettingsIconView,
+ childViewContainer: '#mailpoet_social_icon_selector_contents',
+ events: {
+ 'click .mailpoet_add_social_icon': 'addSocialIcon',
+ },
+ modelEvents: {
+ 'change:iconSet': 'render',
+ },
+ behaviors: {
+ SortableBehavior: {
+ items: '#mailpoet_social_icon_selector_contents > div',
+ },
+ },
+ constructor: function() {
+ // Set the icon collection to be handled by this view as well
+ arguments[0].collection = arguments[0].model.get('icons');
+ Marionette.CompositeView.apply(this, arguments);
+ },
+ addSocialIcon: function() {
+ // Add a social icon with default values
+ this.collection.add({});
+ }
+ });
+
+ SocialBlockSettingsStylesView = Marionette.ItemView.extend({
+ getTemplate: function() { return templates.socialSettingsStyles; },
+ modelEvents: {
+ 'change': 'render',
+ },
+ events: {
+ 'click .mailpoet_social_icon_set': 'changeSocialIconSet',
+ },
+ initialize: function() {
+ this.listenTo(this.model.get('icons'), 'add remove change', this.render);
+ },
+ templateHelpers: function() {
+ var allIconSets = App.getAvailableStyles().get('socialIconSets');
+ return {
+ activeSet: this.model.get('iconSet'),
+ socialIconSets: allIconSets.toJSON(),
+ availableSets: _.keys(allIconSets.toJSON()),
+ availableSocialIcons: this.model.get('icons').pluck('iconType'),
+ };
+ },
+ changeSocialIconSet: function(event) {
+ this.model.set('iconSet', jQuery(event.currentTarget).data('setname'));
+ },
+ onBeforeDestroy: function() {
+ this.model.get('icons').off('add remove', this.render, this);
+ },
+ });
+
+ Module.SocialWidgetView = base.WidgetView.extend({
+ getTemplate: function() { return templates.socialInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.SocialBlockModel({
+ type: 'social',
+ iconSet: 'default',
+ icons: [
+ {
type: 'socialIcon',
- iconType: 'custom',
- link: defaultValues.get('defaultLink'),
- image: App.getAvailableStyles().get('socialIconSets.default.custom'),
+ iconType: 'facebook',
+ link: 'http://example.com',
+ image: App.getAvailableStyles().get('socialIconSets.default.facebook'),
height: '32px',
width: '32px',
- text: defaultValues.get('title'),
- };
- },
- initialize: function(options) {
- var that = this;
- // Make model swap to default values for that type when iconType changes
- this.on('change:iconType', function() {
- var defaultValues = App.getConfig().get('socialIcons').get(that.get('iconType')),
- iconSet = that.collection.iconBlockModel.getIconSet();
- this.set({
- link: defaultValues.get('defaultLink'),
- image: iconSet.get(that.get('iconType')),
- text: defaultValues.get('title'),
- });
- }, this);
- this.on('change', function() { App.getChannel().trigger('autoSave'); });
- },
- });
-
- Module.SocialIconCollectionModel = Backbone.Collection.extend({
- model: Module.SocialIconModel
- });
-
- Module.SocialBlockModel = base.BlockModel.extend({
- name: 'iconBlockModel',
- defaults: function() {
- return this._getDefaults({
- type: 'social',
- iconSet: 'default',
- icons: new Module.SocialIconCollectionModel(),
- }, EditorApplication.getConfig().get('blockDefaults.social'));
- },
- relations: {
- icons: Module.SocialIconCollectionModel,
- },
- initialize: function() {
- this.get('icons').on('add remove change', this._iconsChanged, this);
- this.on('change:iconSet', this.changeIconSet, this);
- },
- getIconSet: function() {
- return App.getAvailableStyles().get('socialIconSets').get(this.get('iconSet'));
- },
- changeIconSet: function() {
- var iconSet = this.getIconSet();
- _.each(this.get('icons').models, function(model) {
- model.set('image', iconSet.get(model.get('iconType')));
- });
- },
- _iconsChanged: function() {
- App.getChannel().trigger('autoSave');
- },
- });
-
- var SocialIconView = Marionette.ItemView.extend({
- tagName: 'span',
- getTemplate: function() { return templates.socialIconBlock; },
- modelEvents: {
- 'change': 'render',
- },
- templateHelpers: function() {
- var allIconSets = App.getAvailableStyles().get('socialIconSets');
- return {
- model: this.model.toJSON(),
- allIconSets: allIconSets.toJSON(),
- };
- },
- });
-
- Module.SocialBlockView = Marionette.CompositeView.extend({
- regionClass: Marionette.Region,
- className: 'mailpoet_block mailpoet_social_block mailpoet_droppable_block',
- getTemplate: function() { return templates.socialBlock; },
- childViewContainer: '.mailpoet_social',
- modelEvents: {
- 'change': 'render'
- },
- events: {
- "mouseover": "showTools",
- "mouseout": "hideTools",
- },
- regions: {
- toolsRegion: '> .mailpoet_tools',
- },
- ui: {
- tools: '> .mailpoet_tools'
- },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- hideOriginal: true,
- onDrop: function(options) {
- // After a clone of model has been dropped, cleanup
- // and destroy self
- options.dragBehavior.view.model.destroy();
- },
- onDragSubstituteBy: function(behavior) {
- var WidgetView, node;
- // When block is being dragged, display the widget icon instead.
- // This will create an instance of block's widget view and
- // use it's rendered DOM element instead of the content block
- if (_.isFunction(behavior.view.onDragSubstituteBy)) {
- WidgetView = new (behavior.view.onDragSubstituteBy())();
- WidgetView.render();
- node = WidgetView.$el.get(0).cloneNode(true);
- WidgetView.destroy();
- return node;
- }
- },
- },
- },
- onDragSubstituteBy: function() { return Module.SocialWidgetView; },
- constructor: function() {
- // Set the block collection to be handled by this view as well
- arguments[0].collection = arguments[0].model.get('icons');
- Marionette.CompositeView.apply(this, arguments);
- },
- // Determines which view type should be used for a child
- childView: SocialIconView,
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- viewCid: this.cid,
- };
- },
- onRender: function() {
- this._rebuildRegions();
- this.toolsView = new Module.SocialBlockToolsView({ model: this.model });
- this.toolsRegion.show(this.toolsView);
- },
- onBeforeDestroy: function() {
- this.regionManager.destroy();
- },
- showTools: function(_event) {
- this.$(this.ui.tools).show();
- _event.stopPropagation();
- },
- hideTools: function(_event) {
- this.$(this.ui.tools).hide();
- _event.stopPropagation();
- },
- getDropFunc: function() {
- var that = this;
- return function() {
- var newModel = that.model.clone();
- //that.model.destroy();
- return newModel;
- };
- },
- _buildRegions: function(regions) {
- var that = this;
-
- var defaults = {
- regionClass: this.getOption('regionClass'),
- parentEl: function() { return that.$el; }
- };
-
- return this.regionManager.addRegions(regions, defaults);
- },
- _rebuildRegions: function() {
- if (this.regionManager === undefined) {
- this.regionManager = new Backbone.Marionette.RegionManager();
- }
- this.regionManager.destroy();
- _.extend(this, this._buildRegions(this.regions));
- },
- });
-
- Module.SocialBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.SocialBlockSettingsView; },
- });
-
- // Sidebar view container
- Module.SocialBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.socialBlockSettings; },
- regions: {
- iconRegion: '#mailpoet_social_icons_selection',
- stylesRegion: '#mailpoet_social_icons_styles',
- },
- events: function() {
- return {
- "click .mailpoet_done_editing": "close",
- };
- },
- initialize: function() {
- base.BlockSettingsView.prototype.initialize.apply(this, arguments);
-
- this._iconSelectorView = new SocialBlockSettingsIconSelectorView({ model: this.model });
- this._stylesView = new SocialBlockSettingsStylesView({ model: this.model });
- },
- onRender: function() {
- this.iconRegion.show(this._iconSelectorView);
- this.stylesRegion.show(this._stylesView);
+ text: 'Facebook',
+ },
+ {
+ type: 'socialIcon',
+ iconType: 'twitter',
+ link: 'http://example.com',
+ image: App.getAvailableStyles().get('socialIconSets.default.twitter'),
+ height: '32px',
+ width: '32px',
+ text: 'Twitter',
+ },
+ ],
+ }, { parse: true });
}
+ }
+ },
+ });
+
+ App.on('before:start', function() {
+ App.registerBlockType('social', {
+ blockModel: Module.SocialBlockModel,
+ blockView: Module.SocialBlockView,
});
- // Single icon settings view, used by the selector view
- SocialBlockSettingsIconView = Marionette.ItemView.extend({
- getTemplate: function() { return templates.socialSettingsIcon; },
- events: function() {
- return {
- "click .mailpoet_delete_block": "deleteIcon",
- "change .mailpoet_social_icon_field_type": _.partial(this.changeField, "iconType"),
- "keyup .mailpoet_social_icon_field_image": _.partial(this.changeField, "image"),
- "keyup .mailpoet_social_icon_field_link": this.changeLink,
- "keyup .mailpoet_social_icon_field_text": _.partial(this.changeField, "text"),
- };
- },
- modelEvents: {
- 'change:iconType': 'render',
- 'change:image': function() {
- this.$('.mailpoet_social_icon_image').attr('src', this.model.get('image'));
- },
- 'change:text': function() {
- this.$('.mailpoet_social_icon_image').attr('alt', this.model.get('text'));
- },
- },
- templateHelpers: function() {
- var icons = App.getConfig().get('socialIcons'),
- // Construct icon type list of format [{iconType: 'type', title: 'Title'}, ...]
- availableIconTypes = _.map(_.keys(icons.attributes), function(key) { return { iconType: key, title: icons.get(key).get('title') }; }),
- allIconSets = App.getAvailableStyles().get('socialIconSets');
- return {
- model: this.model.toJSON(),
- iconTypes: availableIconTypes,
- currentType: icons.get(this.model.get('iconType')).toJSON(),
- allIconSets: allIconSets.toJSON(),
- };
- },
- deleteIcon: function() {
- this.model.destroy();
- },
- changeLink: function(event) {
- if (this.model.get('iconType') === 'email') {
- this.model.set('link', 'mailto:' + jQuery(event.target).val());
- } else {
- return this.changeField('link', event);
- }
- },
- changeField: function(field, event) {
- this.model.set(field, jQuery(event.target).val());
- },
- });
-
- // Select icons section container view
- SocialBlockSettingsIconSelectorView = Marionette.CompositeView.extend({
- getTemplate: function() { return templates.socialSettingsIconSelector; },
- childView: SocialBlockSettingsIconView,
- childViewContainer: '#mailpoet_social_icon_selector_contents',
- events: {
- 'click .mailpoet_add_social_icon': 'addSocialIcon',
- },
- modelEvents: {
- 'change:iconSet': 'render',
- },
- behaviors: {
- SortableBehavior: {
- items: '#mailpoet_social_icon_selector_contents > div',
- },
- },
- constructor: function() {
- // Set the icon collection to be handled by this view as well
- arguments[0].collection = arguments[0].model.get('icons');
- Marionette.CompositeView.apply(this, arguments);
- },
- addSocialIcon: function() {
- // Add a social icon with default values
- this.collection.add({});
- }
- });
-
- SocialBlockSettingsStylesView = Marionette.ItemView.extend({
- getTemplate: function() { return templates.socialSettingsStyles; },
- modelEvents: {
- 'change': 'render',
- },
- events: {
- 'click .mailpoet_social_icon_set': 'changeSocialIconSet',
- },
- initialize: function() {
- this.listenTo(this.model.get('icons'), 'add remove change', this.render);
- },
- templateHelpers: function() {
- var allIconSets = App.getAvailableStyles().get('socialIconSets');
- return {
- activeSet: this.model.get('iconSet'),
- socialIconSets: allIconSets.toJSON(),
- availableSets: _.keys(allIconSets.toJSON()),
- availableSocialIcons: this.model.get('icons').pluck('iconType'),
- };
- },
- changeSocialIconSet: function(event) {
- this.model.set('iconSet', jQuery(event.currentTarget).data('setname'));
- },
- onBeforeDestroy: function() {
- this.model.get('icons').off('add remove', this.render, this);
- },
- });
-
- Module.SocialWidgetView = base.WidgetView.extend({
- getTemplate: function() { return templates.socialInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.SocialBlockModel({
- type: 'social',
- iconSet: 'default',
- icons: [
- {
- type: 'socialIcon',
- iconType: 'facebook',
- link: 'http://example.com',
- image: App.getAvailableStyles().get('socialIconSets.default.facebook'),
- height: '32px',
- width: '32px',
- text: 'Facebook',
- },
- {
- type: 'socialIcon',
- iconType: 'twitter',
- link: 'http://example.com',
- image: App.getAvailableStyles().get('socialIconSets.default.twitter'),
- height: '32px',
- width: '32px',
- text: 'Twitter',
- },
- ],
- }, { parse: true });
- }
- }
- },
- });
-
- App.on('before:start', function() {
- App.registerBlockType('social', {
- blockModel: Module.SocialBlockModel,
- blockView: Module.SocialBlockView,
- });
-
- App.registerWidget({
- name: 'social',
- widgetView: Module.SocialWidgetView,
- priority: 95,
- });
+ App.registerWidget({
+ name: 'social',
+ widgetView: Module.SocialWidgetView,
+ priority: 95,
});
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/spacer.js b/assets/js/src/newsletter_editor/blocks/spacer.js
index 45eefd1930..582a31b61a 100644
--- a/assets/js/src/newsletter_editor/blocks/spacer.js
+++ b/assets/js/src/newsletter_editor/blocks/spacer.js
@@ -9,97 +9,96 @@ define('newsletter_editor/blocks/spacer', [
], function(EditorApplication, Backbone, Marionette, MailPoet) {
EditorApplication.module("blocks.spacer", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base');
+ var base = App.module('blocks.base');
- Module.SpacerBlockModel = base.BlockModel.extend({
- defaults: function() {
- return this._getDefaults({
- type: 'spacer',
- styles: {
- block: {
- backgroundColor: 'transparent',
- height: '40px',
- },
- },
- }, EditorApplication.getConfig().get('blockDefaults.spacer'));
+ Module.SpacerBlockModel = base.BlockModel.extend({
+ defaults: function() {
+ return this._getDefaults({
+ type: 'spacer',
+ styles: {
+ block: {
+ backgroundColor: 'transparent',
+ height: '40px',
+ },
},
+ }, EditorApplication.getConfig().get('blockDefaults.spacer'));
+ },
+ });
+
+ Module.SpacerBlockView = base.BlockView.extend({
+ className: "mailpoet_block mailpoet_spacer_block mailpoet_droppable_block",
+ getTemplate: function() { return templates.spacerBlock; },
+ behaviors: _.defaults({
+ ResizableBehavior: {
+ elementSelector: '.mailpoet_spacer',
+ resizeHandleSelector: '.mailpoet_resize_handle',
+ minLength: 20, // TODO: Move this number to editor configuration
+ modelField: 'styles.block.height',
+ },
+ }, base.BlockView.prototype.behaviors),
+ modelEvents: _.omit(base.BlockView.prototype.modelEvents, 'change'),
+ onDragSubstituteBy: function() { return Module.SpacerWidgetView; },
+ initialize: function() {
+ base.BlockView.prototype.initialize.apply(this, arguments);
+
+ this.listenTo(this.model, 'change:styles.block.backgroundColor', this.render);
+ this.listenTo(this.model, 'change:styles.block.height', this.changeHeight);
+ },
+ onRender: function() {
+ this.toolsView = new Module.SpacerBlockToolsView({ model: this.model });
+ this.toolsRegion.show(this.toolsView);
+ },
+ changeHeight: function() {
+ this.$('.mailpoet_spacer').css('height', this.model.get('styles.block.height'));
+ this.$('.mailpoet_resize_handle_text').text(this.model.get('styles.block.height'));
+ },
+ onBeforeDestroy: function() {
+ this.stopListening(this.model);
+ },
+ });
+
+ Module.SpacerBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.SpacerBlockSettingsView; },
+ });
+
+ Module.SpacerBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.spacerBlockSettings; },
+ events: function() {
+ return {
+ "change .mailpoet_field_spacer_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
+ "click .mailpoet_done_editing": "close",
+ };
+ },
+ behaviors: {
+ ColorPickerBehavior: {},
+ },
+ });
+
+ Module.SpacerWidgetView = base.WidgetView.extend({
+ getTemplate: function() { return templates.spacerInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.SpacerBlockModel();
+ },
+ }
+ },
+ });
+
+ App.on('before:start', function() {
+ App.registerBlockType('spacer', {
+ blockModel: Module.SpacerBlockModel,
+ blockView: Module.SpacerBlockView,
});
- Module.SpacerBlockView = base.BlockView.extend({
- className: "mailpoet_block mailpoet_spacer_block mailpoet_droppable_block",
- getTemplate: function() { return templates.spacerBlock; },
- behaviors: _.defaults({
- ResizableBehavior: {
- elementSelector: '.mailpoet_spacer',
- resizeHandleSelector: '.mailpoet_resize_handle',
- minLength: 20, // TODO: Move this number to editor configuration
- modelField: 'styles.block.height',
- },
- }, base.BlockView.prototype.behaviors),
- modelEvents: _.omit(base.BlockView.prototype.modelEvents, 'change'),
- onDragSubstituteBy: function() { return Module.SpacerWidgetView; },
- initialize: function() {
- base.BlockView.prototype.initialize.apply(this, arguments);
-
- this.listenTo(this.model, 'change:styles.block.backgroundColor', this.render);
- this.listenTo(this.model, 'change:styles.block.height', this.changeHeight);
- },
- onRender: function() {
- this.toolsView = new Module.SpacerBlockToolsView({ model: this.model });
- this.toolsRegion.show(this.toolsView);
- },
- changeHeight: function() {
- this.$('.mailpoet_spacer').css('height', this.model.get('styles.block.height'));
- this.$('.mailpoet_resize_handle_text').text(this.model.get('styles.block.height'));
- },
- onBeforeDestroy: function() {
- this.stopListening(this.model);
- },
- });
-
- Module.SpacerBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.SpacerBlockSettingsView; },
- });
-
- Module.SpacerBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.spacerBlockSettings; },
- events: function() {
- return {
- "change .mailpoet_field_spacer_background_color": _.partial(this.changeColorField, "styles.block.backgroundColor"),
- "click .mailpoet_done_editing": "close",
- };
- },
- behaviors: {
- ColorPickerBehavior: {},
- },
- });
-
- Module.SpacerWidgetView = base.WidgetView.extend({
- getTemplate: function() { return templates.spacerInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.SpacerBlockModel();
- },
- }
- },
- });
-
- App.on('before:start', function() {
- App.registerBlockType('spacer', {
- blockModel: Module.SpacerBlockModel,
- blockView: Module.SpacerBlockView,
- });
-
- App.registerWidget({
- name: 'spacer',
- widgetView: Module.SpacerWidgetView,
- priority: 94,
- });
+ App.registerWidget({
+ name: 'spacer',
+ widgetView: Module.SpacerWidgetView,
+ priority: 94,
});
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/blocks/text.js b/assets/js/src/newsletter_editor/blocks/text.js
index 27592bc753..b3505d3b56 100644
--- a/assets/js/src/newsletter_editor/blocks/text.js
+++ b/assets/js/src/newsletter_editor/blocks/text.js
@@ -10,117 +10,116 @@ define('newsletter_editor/blocks/text', [
], function(EditorApplication, Backbone, Marionette, MailPoet, jQuery) {
EditorApplication.module("blocks.text", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- var base = App.module('blocks.base');
+ var base = App.module('blocks.base');
- Module.TextBlockModel = base.BlockModel.extend({
- defaults: function() {
- return this._getDefaults({
- type: 'text',
- text: 'Edit this to insert text',
- }, EditorApplication.getConfig().get('blockDefaults.text'));
+ Module.TextBlockModel = base.BlockModel.extend({
+ defaults: function() {
+ return this._getDefaults({
+ type: 'text',
+ text: 'Edit this to insert text',
+ }, EditorApplication.getConfig().get('blockDefaults.text'));
+ },
+ });
+
+ Module.TextBlockView = base.BlockView.extend({
+ className: "mailpoet_block mailpoet_text_block mailpoet_droppable_block",
+ getTemplate: function() { return templates.textBlock; },
+ modelEvents: _.omit(base.BlockView.prototype.modelEvents, 'change'), // Prevent rerendering on model change due to text editor redrawing
+ initialize: function(options) {
+ this.renderOptions = _.defaults(options.renderOptions || {}, {
+ disableTextEditor: false,
+ });
+ },
+ onDragSubstituteBy: function() { return Module.TextWidgetView; },
+ onRender: function() {
+ this.toolsView = new Module.TextBlockToolsView({
+ model: this.model,
+ tools: {
+ settings: false,
},
- });
+ });
+ this.toolsRegion.show(this.toolsView);
+ },
+ onDomRefresh: function() {
+ this.attachTextEditor();
+ },
+ attachTextEditor: function() {
+ var that = this;
+ if (!this.renderOptions.disableTextEditor) {
+ this.$('.mailpoet_content').tinymce({
+ inline: true,
- Module.TextBlockView = base.BlockView.extend({
- className: "mailpoet_block mailpoet_text_block mailpoet_droppable_block",
- getTemplate: function() { return templates.textBlock; },
- modelEvents: _.omit(base.BlockView.prototype.modelEvents, 'change'), // Prevent rerendering on model change due to text editor redrawing
- initialize: function(options) {
- this.renderOptions = _.defaults(options.renderOptions || {}, {
- disableTextEditor: false,
+ menubar: false,
+ toolbar1: "styleselect bold italic forecolor | link unlink",
+ toolbar2: "alignleft aligncenter alignright alignjustify | bullist numlist blockquote | code mailpoet_custom_fields",
+
+ //forced_root_block: 'p',
+ valid_elements: "p[class|style],span[class|style],a[href|class|title|target|style],h1[class|style],h2[class|style],h3[class|style],ol[class|style],ul[class|style],li[class|style],strong[class|style],em[class|style],strike,br,blockquote[class|style],table[class|style],tr[class|style],th[class|style],td[class|style]",
+ invalid_elements: "script",
+ style_formats: [
+ {title: 'Heading 1', block: 'h1'},
+ {title: 'Heading 2', block: 'h2'},
+ {title: 'Heading 3', block: 'h3'},
+
+ {title: 'Paragraph', block: 'p'},
+ ],
+
+ plugins: "wplink code textcolor mailpoet_custom_fields",
+
+ setup: function(editor) {
+ editor.on('change', function(e) {
+ that.model.set('text', editor.getContent());
});
- },
- onDragSubstituteBy: function() { return Module.TextWidgetView; },
- onRender: function() {
- this.toolsView = new Module.TextBlockToolsView({
- model: this.model,
- tools: {
- settings: false,
- },
+
+ editor.on('focus', function(e) {
+ that.disableShowingTools();
});
- this.toolsRegion.show(this.toolsView);
- },
- onDomRefresh: function() {
- this.attachTextEditor();
- },
- attachTextEditor: function() {
- var that = this;
- if (!this.renderOptions.disableTextEditor) {
- this.$('.mailpoet_content').tinymce({
- inline: true,
- menubar: false,
- toolbar1: "styleselect bold italic forecolor | link unlink",
- toolbar2: "alignleft aligncenter alignright alignjustify | bullist numlist blockquote | code mailpoet_custom_fields",
+ editor.on('blur', function(e) {
+ that.enableShowingTools();
+ });
+ },
- //forced_root_block: 'p',
- valid_elements: "p[class|style],span[class|style],a[href|class|title|target|style],h1[class|style],h2[class|style],h3[class|style],ol[class|style],ul[class|style],li[class|style],strong[class|style],em[class|style],strike,br,blockquote[class|style],table[class|style],tr[class|style],th[class|style],td[class|style]",
- invalid_elements: "script",
- style_formats: [
- {title: 'Heading 1', block: 'h1'},
- {title: 'Heading 2', block: 'h2'},
- {title: 'Heading 3', block: 'h3'},
-
- {title: 'Paragraph', block: 'p'},
- ],
-
- plugins: "wplink code textcolor mailpoet_custom_fields",
-
- setup: function(editor) {
- editor.on('change', function(e) {
- that.model.set('text', editor.getContent());
- });
-
- editor.on('focus', function(e) {
- that.disableShowingTools();
- });
-
- editor.on('blur', function(e) {
- that.enableShowingTools();
- });
- },
-
- mailpoet_custom_fields: App.getConfig().get('customFields').toJSON(),
- mailpoet_custom_fields_window_title: App.getConfig().get('translations.customFieldsWindowTitle'),
- });
- }
- },
- });
-
- Module.TextBlockToolsView = base.BlockToolsView.extend({
- getSettingsView: function() { return Module.TextBlockSettingsView; },
- });
-
- Module.TextBlockSettingsView = base.BlockSettingsView.extend({
- getTemplate: function() { return templates.textBlockSettings; },
- });
-
- Module.TextWidgetView = base.WidgetView.extend({
- getTemplate: function() { return templates.textInsertion; },
- behaviors: {
- DraggableBehavior: {
- cloneOriginal: true,
- drop: function() {
- return new Module.TextBlockModel();
- },
- }
- },
- });
-
- App.on('before:start', function() {
- App.registerBlockType('text', {
- blockModel: Module.TextBlockModel,
- blockView: Module.TextBlockView,
+ mailpoet_custom_fields: App.getConfig().get('customFields').toJSON(),
+ mailpoet_custom_fields_window_title: App.getConfig().get('translations.customFieldsWindowTitle'),
});
+ }
+ },
+ });
- App.registerWidget({
- name: 'text',
- widgetView: Module.TextWidgetView,
- priority: 90,
- });
+ Module.TextBlockToolsView = base.BlockToolsView.extend({
+ getSettingsView: function() { return Module.TextBlockSettingsView; },
+ });
+
+ Module.TextBlockSettingsView = base.BlockSettingsView.extend({
+ getTemplate: function() { return templates.textBlockSettings; },
+ });
+
+ Module.TextWidgetView = base.WidgetView.extend({
+ getTemplate: function() { return templates.textInsertion; },
+ behaviors: {
+ DraggableBehavior: {
+ cloneOriginal: true,
+ drop: function() {
+ return new Module.TextBlockModel();
+ },
+ }
+ },
+ });
+
+ App.on('before:start', function() {
+ App.registerBlockType('text', {
+ blockModel: Module.TextBlockModel,
+ blockView: Module.TextBlockView,
});
+
+ App.registerWidget({
+ name: 'text',
+ widgetView: Module.TextWidgetView,
+ priority: 90,
+ });
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/components/config.js b/assets/js/src/newsletter_editor/components/config.js
index d59e22c004..89f2acdf8a 100644
--- a/assets/js/src/newsletter_editor/components/config.js
+++ b/assets/js/src/newsletter_editor/components/config.js
@@ -4,32 +4,34 @@ define('newsletter_editor/components/config', [
], function(EditorApplication, Backbone) {
EditorApplication.module("components.config", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- Module.ConfigModel = Backbone.SuperModel.extend({
- defaults: {
- availableStyles: {},
- socialIcons: {},
- blockDefaults: {},
- translations: {},
- sidepanelWidth: '331px',
- validation: {},
- urls: {},
- },
- });
+ Module.ConfigModel = Backbone.SuperModel.extend({
+ defaults: {
+ availableStyles: {},
+ socialIcons: {},
+ blockDefaults: {},
+ translations: {},
+ sidepanelWidth: '331px',
+ validation: {},
+ urls: {},
+ },
+ });
- // Global and available styles for access in blocks and their settings
- Module._config = {};
- Module.getConfig = function() { return Module._config; };
- Module.setConfig = function(options) { Module._config = new Module.ConfigModel(options, { parse: true }); return Module._config; };
+ // Global and available styles for access in blocks and their settings
+ Module._config = {};
+ Module.getConfig = function() { return Module._config; };
+ Module.setConfig = function(options) {
+ Module._config = new Module.ConfigModel(options, { parse: true });
+ return Module._config;
+ };
- App.on('before:start', function(options) {
- // Expose config methods globally
- App.getConfig = Module.getConfig;
- App.setConfig = Module.setConfig;
+ App.on('before:start', function(options) {
+ // Expose config methods globally
+ App.getConfig = Module.getConfig;
+ App.setConfig = Module.setConfig;
- App.setConfig(options.config);
- });
+ App.setConfig(options.config);
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/components/content.js b/assets/js/src/newsletter_editor/components/content.js
index f7caa3f66e..b72391686c 100644
--- a/assets/js/src/newsletter_editor/components/content.js
+++ b/assets/js/src/newsletter_editor/components/content.js
@@ -5,76 +5,75 @@ define('newsletter_editor/components/content', [
], function(EditorApplication, Backbone, Marionette) {
EditorApplication.module("components.content", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- // Holds newsletter entry fields, such as subject or creation datetime.
- // Does not hold newsletter content nor newsletter styles, those are
- // handled by other components.
- Module.NewsletterModel = Backbone.SuperModel.extend({
- stale: ['data', 'styles'],
- initialize: function(options) {
- this.on('change', function() {
- App.getChannel().trigger('autoSave');
- });
- },
- toJSON: function() {
- // Remove stale attributes from resulting JSON object
- return _.omit(Backbone.SuperModel.prototype.toJSON.call(this), this.stale);
- },
+ // Holds newsletter entry fields, such as subject or creation datetime.
+ // Does not hold newsletter content nor newsletter styles, those are
+ // handled by other components.
+ Module.NewsletterModel = Backbone.SuperModel.extend({
+ stale: ['data', 'styles'],
+ initialize: function(options) {
+ this.on('change', function() {
+ App.getChannel().trigger('autoSave');
+ });
+ },
+ toJSON: function() {
+ // Remove stale attributes from resulting JSON object
+ return _.omit(Backbone.SuperModel.prototype.toJSON.call(this), this.stale);
+ },
+ });
+
+ // Content block view and model handlers for different content types
+ Module._blockTypes = {};
+ Module.registerBlockType = function(type, data) {
+ Module._blockTypes[type] = data;
+ };
+ Module.getBlockTypeModel = function(type) {
+ if (type in Module._blockTypes) {
+ return Module._blockTypes[type].blockModel;
+ } else {
+ throw "Block type not supported: " + type;
+ }
+ };
+ Module.getBlockTypeView = function(type) {
+ if (type in Module._blockTypes) {
+ return Module._blockTypes[type].blockView;
+ } else {
+ throw "Block type not supported: " + type;
+ }
+ };
+
+ Module.toJSON = function() {
+ return _.extend({
+ data: App._contentContainer.toJSON(),
+ styles: App.getGlobalStyles().toJSON(),
+ }, App.getNewsletter().toJSON());
+ };
+
+ Module.getNewsletter = function() {
+ return Module.newsletter;
+ };
+
+ App.on('before:start', function(options) {
+ // Expose block methods globally
+ App.registerBlockType = Module.registerBlockType;
+ App.getBlockTypeModel = Module.getBlockTypeModel;
+ App.getBlockTypeView = Module.getBlockTypeView;
+ App.toJSON = Module.toJSON;
+ App.getNewsletter = Module.getNewsletter;
+
+ Module.newsletter = new Module.NewsletterModel(_.omit(_.clone(options.newsletter), ['data', 'styles']));
+ });
+
+ App.on('start', function(options) {
+ // TODO: Other newsletter information will be needed as well.
+ App._contentContainer = new (this.getBlockTypeModel('container'))(options.newsletter.data, {parse: true});
+ App._contentContainerView = new (this.getBlockTypeView('container'))({
+ model: App._contentContainer,
+ renderOptions: { depth: 0 },
});
- // Content block view and model handlers for different content types
- Module._blockTypes = {};
- Module.registerBlockType = function(type, data) {
- Module._blockTypes[type] = data;
- };
- Module.getBlockTypeModel = function(type) {
- if (type in Module._blockTypes) {
- return Module._blockTypes[type].blockModel;
- } else {
- throw "Block type not supported: " + type;
- }
- };
- Module.getBlockTypeView = function(type) {
- if (type in Module._blockTypes) {
- return Module._blockTypes[type].blockView;
- } else {
- throw "Block type not supported: " + type;
- }
- };
-
- Module.toJSON = function() {
- return _.extend({
- data: App._contentContainer.toJSON(),
- styles: App.getGlobalStyles().toJSON(),
- }, App.getNewsletter().toJSON());
- };
-
- Module.getNewsletter = function() {
- return Module.newsletter;
- };
-
- App.on('before:start', function(options) {
- // Expose block methods globally
- App.registerBlockType = Module.registerBlockType;
- App.getBlockTypeModel = Module.getBlockTypeModel;
- App.getBlockTypeView = Module.getBlockTypeView;
- App.toJSON = Module.toJSON;
- App.getNewsletter = Module.getNewsletter;
-
- Module.newsletter = new Module.NewsletterModel(_.omit(_.clone(options.newsletter), ['data', 'styles']));
- });
-
- App.on('start', function(options) {
- // TODO: Other newsletter information will be needed as well.
- App._contentContainer = new (this.getBlockTypeModel('container'))(options.newsletter.data, {parse: true});
- App._contentContainerView = new (this.getBlockTypeView('container'))({
- model: App._contentContainer,
- renderOptions: { depth: 0 },
- });
-
- App._appView.contentRegion.show(App._contentContainerView);
- });
+ App._appView.contentRegion.show(App._contentContainerView);
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/components/heading.js b/assets/js/src/newsletter_editor/components/heading.js
index 58e392531a..27800e80dc 100644
--- a/assets/js/src/newsletter_editor/components/heading.js
+++ b/assets/js/src/newsletter_editor/components/heading.js
@@ -5,29 +5,28 @@ define('newsletter_editor/components/heading', [
], function(EditorApplication, Backbone, Marionette) {
EditorApplication.module("components.heading", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- Module.HeadingView = Marionette.ItemView.extend({
- getTemplate: function() { return templates.heading; },
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- };
- },
- events: function() {
- return {
- 'keyup .mailpoet_input_title': _.partial(this.changeField, "newsletter_subject"),
- 'keyup .mailpoet_input_preheader': _.partial(this.changeField, "newsletter_preheader"),
- };
- },
- changeField: function(field, event) {
- this.model.set(field, jQuery(event.target).val());
- },
- });
+ Module.HeadingView = Marionette.ItemView.extend({
+ getTemplate: function() { return templates.heading; },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ };
+ },
+ events: function() {
+ return {
+ 'keyup .mailpoet_input_title': _.partial(this.changeField, "newsletter_subject"),
+ 'keyup .mailpoet_input_preheader': _.partial(this.changeField, "newsletter_preheader"),
+ };
+ },
+ changeField: function(field, event) {
+ this.model.set(field, jQuery(event.target).val());
+ },
+ });
- App.on('start', function(options) {
- App._appView.headingRegion.show(new Module.HeadingView({ model: App.getNewsletter() }));
- });
+ App.on('start', function(options) {
+ App._appView.headingRegion.show(new Module.HeadingView({ model: App.getNewsletter() }));
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/components/save.js b/assets/js/src/newsletter_editor/components/save.js
index 3f3fb337d8..78aa617c67 100644
--- a/assets/js/src/newsletter_editor/components/save.js
+++ b/assets/js/src/newsletter_editor/components/save.js
@@ -5,174 +5,173 @@ define('newsletter_editor/components/save', [
], function(EditorApplication, Backbone, Marionette) {
EditorApplication.module("components.save", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
- var saveTimeout;
+ "use strict";
+ var saveTimeout;
- // Save editor contents to server
- Module.save = function() {
- App.getChannel().trigger('beforeEditorSave');
+ // Save editor contents to server
+ Module.save = function() {
+ App.getChannel().trigger('beforeEditorSave');
- var json = App.toJSON();
+ var json = App.toJSON();
- // save newsletter
- // TODO: Migrate logic to new AJAX format
- //mailpoet_post_wpi('newsletter_save.php', json, function(response) {
- //if(response.success !== undefined && response.success === true) {
- ////MailPoet.Notice.success("");
- //} else if(response.error !== undefined) {
- //if(response.error.length === 0) {
- //// TODO: Handle translations
- //MailPoet.Notice.error("");
- //} else {
- //$(response.error).each(function(i, error) {
- //MailPoet.Notice.error(error);
- //});
- //}
- //}
- //App.getChannel().trigger('afterEditorSave', json, response);
- //}, function(error) {
- //// TODO: Handle saving errors
- //App.getChannel().trigger('afterEditorSave', {}, error);
- //});
- };
+ // save newsletter
+ // TODO: Migrate logic to new AJAX format
+ //mailpoet_post_wpi('newsletter_save.php', json, function(response) {
+ //if(response.success !== undefined && response.success === true) {
+ ////MailPoet.Notice.success("");
+ //} else if(response.error !== undefined) {
+ //if(response.error.length === 0) {
+ //// TODO: Handle translations
+ //MailPoet.Notice.error("");
+ //} else {
+ //$(response.error).each(function(i, error) {
+ //MailPoet.Notice.error(error);
+ //});
+ //}
+ //}
+ //App.getChannel().trigger('afterEditorSave', json, response);
+ //}, function(error) {
+ //// TODO: Handle saving errors
+ //App.getChannel().trigger('afterEditorSave', {}, error);
+ //});
+ };
- Module.SaveView = Marionette.LayoutView.extend({
- getTemplate: function() { return templates.save; },
- events: {
- 'click .mailpoet_save_button': 'save',
- 'click .mailpoet_save_show_options': 'toggleSaveOptions',
- 'click .mailpoet_save_next': 'next',
- /* Save as template */
- 'click .mailpoet_save_template': 'toggleSaveAsTemplate',
- 'click .mailpoet_save_as_template': 'saveAsTemplate',
- /* Export template */
- 'click .mailpoet_save_export': 'exportTemplate',
- },
- initialize: function(options) {
- App.getChannel().on('beforeEditorSave', this.beforeSave, this);
- App.getChannel().on('afterEditorSave', this.afterSave, this);
+ Module.SaveView = Marionette.LayoutView.extend({
+ getTemplate: function() { return templates.save; },
+ events: {
+ 'click .mailpoet_save_button': 'save',
+ 'click .mailpoet_save_show_options': 'toggleSaveOptions',
+ 'click .mailpoet_save_next': 'next',
+ /* Save as template */
+ 'click .mailpoet_save_template': 'toggleSaveAsTemplate',
+ 'click .mailpoet_save_as_template': 'saveAsTemplate',
+ /* Export template */
+ 'click .mailpoet_save_export': 'exportTemplate',
+ },
+ initialize: function(options) {
+ App.getChannel().on('beforeEditorSave', this.beforeSave, this);
+ App.getChannel().on('afterEditorSave', this.afterSave, this);
- this.validateNewsletter(App.toJSON());
- },
- save: function() {
- this.hideOptionContents();
- App.getChannel().trigger('save');
- },
- beforeSave: function() {
- // TODO: Add a loading animation instead
- this.$('.mailpoet_autosaved_at').text('Saving...');
- },
- afterSave: function(json, response) {
- this.validateNewsletter(json);
- // Update 'Last saved timer'
- this.$('.mailpoet_editor_last_saved').removeClass('mailpoet_hidden');
- this.$('.mailpoet_autosaved_at').text(response.time);
- },
- toggleSaveOptions: function() {
- this.$('.mailpoet_save_options').toggleClass('mailpoet_hidden');
- this.$('.mailpoet_save_show_options').toggleClass('mailpoet_save_show_options_active');
- },
- toggleSaveAsTemplate: function() {
- this.$('.mailpoet_save_as_template_container').toggleClass('mailpoet_hidden');
- this.toggleSaveOptions();
- },
- showSaveAsTemplate: function() {
- this.$('.mailpoet_save_as_template_container').removeClass('mailpoet_hidden');
- this.toggleSaveOptions();
- },
- hideSaveAsTemplate: function() {
- this.$('.mailpoet_save_as_template_container').addClass('mailpoet_hidden');
- },
- saveAsTemplate: function() {
- var templateName = this.$('.mailpoet_save_as_template_name').val(),
- templateDescription = this.$('.mailpoet_save_as_template_description').val();
+ this.validateNewsletter(App.toJSON());
+ },
+ save: function() {
+ this.hideOptionContents();
+ App.getChannel().trigger('save');
+ },
+ beforeSave: function() {
+ // TODO: Add a loading animation instead
+ this.$('.mailpoet_autosaved_at').text('Saving...');
+ },
+ afterSave: function(json, response) {
+ this.validateNewsletter(json);
+ // Update 'Last saved timer'
+ this.$('.mailpoet_editor_last_saved').removeClass('mailpoet_hidden');
+ this.$('.mailpoet_autosaved_at').text(response.time);
+ },
+ toggleSaveOptions: function() {
+ this.$('.mailpoet_save_options').toggleClass('mailpoet_hidden');
+ this.$('.mailpoet_save_show_options').toggleClass('mailpoet_save_show_options_active');
+ },
+ toggleSaveAsTemplate: function() {
+ this.$('.mailpoet_save_as_template_container').toggleClass('mailpoet_hidden');
+ this.toggleSaveOptions();
+ },
+ showSaveAsTemplate: function() {
+ this.$('.mailpoet_save_as_template_container').removeClass('mailpoet_hidden');
+ this.toggleSaveOptions();
+ },
+ hideSaveAsTemplate: function() {
+ this.$('.mailpoet_save_as_template_container').addClass('mailpoet_hidden');
+ },
+ saveAsTemplate: function() {
+ var templateName = this.$('.mailpoet_save_as_template_name').val(),
+ templateDescription = this.$('.mailpoet_save_as_template_description').val();
- console.log('Saving template with ', templateName, templateDescription);
+ console.log('Saving template with ', templateName, templateDescription);
- this.hideOptionContents();
- },
- exportTemplate: function() {
- console.log('Exporting template');
- this.hideOptionContents();
- },
- hideOptionContents: function() {
- this.hideSaveAsTemplate();
- this.$('.mailpoet_save_options').addClass('mailpoet_hidden');
- },
- next: function() {
- this.hideOptionContents();
- console.log('Next');
- window.location.href = App.getConfig().get('urls.send');
- },
- validateNewsletter: function(jsonObject) {
- if (!App._contentContainer.isValid()) {
- this.showValidationError(App._contentContainer.validationError);
- return;
- }
+ this.hideOptionContents();
+ },
+ exportTemplate: function() {
+ console.log('Exporting template');
+ this.hideOptionContents();
+ },
+ hideOptionContents: function() {
+ this.hideSaveAsTemplate();
+ this.$('.mailpoet_save_options').addClass('mailpoet_hidden');
+ },
+ next: function() {
+ this.hideOptionContents();
+ console.log('Next');
+ window.location.href = App.getConfig().get('urls.send');
+ },
+ validateNewsletter: function(jsonObject) {
+ if (!App._contentContainer.isValid()) {
+ this.showValidationError(App._contentContainer.validationError);
+ return;
+ }
- if (App.getConfig().get('validation.validateUnsubscribeLinkPresent') &&
- JSON.stringify(jsonObject).indexOf("[unsubscribeUrl]") < 0) {
- this.showValidationError(App.getConfig().get('translations.unsubscribeLinkMissing'));
- return;
- }
+ if (App.getConfig().get('validation.validateUnsubscribeLinkPresent') &&
+ JSON.stringify(jsonObject).indexOf("[unsubscribeUrl]") < 0) {
+ this.showValidationError(App.getConfig().get('translations.unsubscribeLinkMissing'));
+ return;
+ }
- this.hideValidationError();
- },
- showValidationError: function(message) {
- var $el = this.$('.mailpoet_save_error');
- $el.text(message);
- $el.removeClass('mailpoet_hidden');
+ this.hideValidationError();
+ },
+ showValidationError: function(message) {
+ var $el = this.$('.mailpoet_save_error');
+ $el.text(message);
+ $el.removeClass('mailpoet_hidden');
- this.$('.mailpoet_save_next').addClass('button-disabled');
- },
- hideValidationError: function() {
- this.$('.mailpoet_save_error').addClass('mailpoet_hidden');
- this.$('.mailpoet_save_next').removeClass('button-disabled');
- },
- });
+ this.$('.mailpoet_save_next').addClass('button-disabled');
+ },
+ hideValidationError: function() {
+ this.$('.mailpoet_save_error').addClass('mailpoet_hidden');
+ this.$('.mailpoet_save_next').removeClass('button-disabled');
+ },
+ });
- Module.autoSave = function() {
- // Delay in saving editor contents, during which a new autosave
- // may be requested
- var AUTOSAVE_DELAY_DURATION = 1000;
+ Module.autoSave = function() {
+ // Delay in saving editor contents, during which a new autosave
+ // may be requested
+ var AUTOSAVE_DELAY_DURATION = 1000;
- // Cancel save timer if another change happens before it completes
- if (saveTimeout) clearTimeout(saveTimeout);
- saveTimeout = setTimeout(function() {
- App.getChannel().trigger('save');
- clearTimeout(saveTimeout);
- saveTimeout = undefined;
- }, AUTOSAVE_DELAY_DURATION);
- };
+ // Cancel save timer if another change happens before it completes
+ if (saveTimeout) clearTimeout(saveTimeout);
+ saveTimeout = setTimeout(function() {
+ App.getChannel().trigger('save');
+ clearTimeout(saveTimeout);
+ saveTimeout = undefined;
+ }, AUTOSAVE_DELAY_DURATION);
+ };
- Module.beforeExitWithUnsavedChanges = function(e) {
- if (saveTimeout) {
- // TODO: Translate this message
- var message = "There are unsaved changes which will be lost if you leave this page.";
- e = e || window.event;
+ Module.beforeExitWithUnsavedChanges = function(e) {
+ if (saveTimeout) {
+ // TODO: Translate this message
+ var message = "There are unsaved changes which will be lost if you leave this page.";
+ e = e || window.event;
- if (e) {
- e.returnValue = message;
- }
+ if (e) {
+ e.returnValue = message;
+ }
- return message;
- }
- };
+ return message;
+ }
+ };
- App.on('before:start', function(options) {
- App.save = Module.save;
- App.getChannel().on('autoSave', Module.autoSave);
+ App.on('before:start', function(options) {
+ App.save = Module.save;
+ App.getChannel().on('autoSave', Module.autoSave);
- window.onbeforeunload = Module.beforeExitWithUnsavedChanges;
+ window.onbeforeunload = Module.beforeExitWithUnsavedChanges;
- App.getChannel().on('save', function() { App.save(); });
- });
+ App.getChannel().on('save', function() { App.save(); });
+ });
- App.on('start', function(options) {
- var saveView = new Module.SaveView();
- App._appView.bottomRegion.show(saveView);
- });
+ App.on('start', function(options) {
+ var saveView = new Module.SaveView();
+ App._appView.bottomRegion.show(saveView);
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/components/sidebar.js b/assets/js/src/newsletter_editor/components/sidebar.js
index abf527b212..8b9f16ecbb 100644
--- a/assets/js/src/newsletter_editor/components/sidebar.js
+++ b/assets/js/src/newsletter_editor/components/sidebar.js
@@ -6,254 +6,253 @@ define('newsletter_editor/components/sidebar', [
], function(EditorApplication, Backbone, Marionette) {
EditorApplication.module("components.sidebar", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- // Widget handlers for use to create new content blocks via drag&drop
- Module._contentWidgets = new (Backbone.Collection.extend({
- model: Backbone.SuperModel.extend({
- defaults: {
- name: '',
- priority: 100,
- widgetView: undefined,
- },
- }),
- comparator: 'priority',
- }))();
- Module.registerWidget = function(widget) { return Module._contentWidgets.add(widget); };
- Module.getWidgets = function() { return Module._contentWidgets; };
+ // Widget handlers for use to create new content blocks via drag&drop
+ Module._contentWidgets = new (Backbone.Collection.extend({
+ model: Backbone.SuperModel.extend({
+ defaults: {
+ name: '',
+ priority: 100,
+ widgetView: undefined,
+ },
+ }),
+ comparator: 'priority',
+ }))();
+ Module.registerWidget = function(widget) { return Module._contentWidgets.add(widget); };
+ Module.getWidgets = function() { return Module._contentWidgets; };
- // Layout widget handlers for use to create new layout blocks via drag&drop
- Module._layoutWidgets = new (Backbone.Collection.extend({
- model: Backbone.SuperModel.extend({
- defaults: {
- name: '',
- priority: 100,
- widgetView: undefined,
- },
- }),
- comparator: 'priority',
- }))();
- Module.registerLayoutWidget = function(widget) { return Module._layoutWidgets.add(widget); };
- Module.getLayoutWidgets = function() { return Module._layoutWidgets; };
+ // Layout widget handlers for use to create new layout blocks via drag&drop
+ Module._layoutWidgets = new (Backbone.Collection.extend({
+ model: Backbone.SuperModel.extend({
+ defaults: {
+ name: '',
+ priority: 100,
+ widgetView: undefined,
+ },
+ }),
+ comparator: 'priority',
+ }))();
+ Module.registerLayoutWidget = function(widget) { return Module._layoutWidgets.add(widget); };
+ Module.getLayoutWidgets = function() { return Module._layoutWidgets; };
- var SidebarView = Backbone.Marionette.LayoutView.extend({
- getTemplate: function() { return templates.sidebar; },
- regions: {
- contentRegion: '.mailpoet_content_region',
- layoutRegion: '.mailpoet_layout_region',
- stylesRegion: '.mailpoet_styles_region',
- previewRegion: '.mailpoet_preview_region',
- },
- events: {
- 'click .mailpoet_sidebar_region h3, .mailpoet_sidebar_region .handlediv': function(event) {
- this.$el.find('.mailpoet_sidebar_region').addClass('closed');
- this.$el.find(event.target).parent().parent().removeClass('closed');
- },
- },
- initialize: function(options) {
- $(window)
- .on('resize', this.updateHorizontalScroll.bind(this))
- .on('scroll', this.updateHorizontalScroll.bind(this));
- },
- onRender: function() {
- this.contentRegion.show(new Module.SidebarWidgetsView({
- collection: App.getWidgets(),
- }));
- this.layoutRegion.show(new Module.SidebarLayoutWidgetsView({
- collection: App.getLayoutWidgets(),
- }));
- this.stylesRegion.show(new Module.SidebarStylesView({
- model: App.getGlobalStyles(),
- availableStyles: App.getAvailableStyles(),
- }));
- this.previewRegion.show(new Module.SidebarPreviewView());
- },
- updateHorizontalScroll: function() {
- // Fixes the sidebar so that on narrower screens the horizontal
- // position of the sidebar would be scrollable and not fixed
- // partially out of visible screen
- this.$el.parent().each(function () {
- var calculated_left, self;
+ var SidebarView = Backbone.Marionette.LayoutView.extend({
+ getTemplate: function() { return templates.sidebar; },
+ regions: {
+ contentRegion: '.mailpoet_content_region',
+ layoutRegion: '.mailpoet_layout_region',
+ stylesRegion: '.mailpoet_styles_region',
+ previewRegion: '.mailpoet_preview_region',
+ },
+ events: {
+ 'click .mailpoet_sidebar_region h3, .mailpoet_sidebar_region .handlediv': function(event) {
+ this.$el.find('.mailpoet_sidebar_region').addClass('closed');
+ this.$el.find(event.target).parent().parent().removeClass('closed');
+ },
+ },
+ initialize: function(options) {
+ $(window)
+ .on('resize', this.updateHorizontalScroll.bind(this))
+ .on('scroll', this.updateHorizontalScroll.bind(this));
+ },
+ onRender: function() {
+ this.contentRegion.show(new Module.SidebarWidgetsView({
+ collection: App.getWidgets(),
+ }));
+ this.layoutRegion.show(new Module.SidebarLayoutWidgetsView({
+ collection: App.getLayoutWidgets(),
+ }));
+ this.stylesRegion.show(new Module.SidebarStylesView({
+ model: App.getGlobalStyles(),
+ availableStyles: App.getAvailableStyles(),
+ }));
+ this.previewRegion.show(new Module.SidebarPreviewView());
+ },
+ updateHorizontalScroll: function() {
+ // Fixes the sidebar so that on narrower screens the horizontal
+ // position of the sidebar would be scrollable and not fixed
+ // partially out of visible screen
+ this.$el.parent().each(function () {
+ var calculated_left, self;
- self = $(this);
+ self = $(this);
- if (self.css('position') === 'fixed') {
- calculated_left = self.parent().offset().left - $(window).scrollLeft();
- self.css('left', calculated_left + 'px');
- } else {
- self.css('left', '');
- }
- });
- },
- onDomRefresh: function() {
- var that = this;
- this.$el.parent().stick_in_parent({
- offset_top: 32,
- });
- this.$el.parent().on('sticky_kit:stick', this.updateHorizontalScroll.bind(this));
- this.$el.parent().on('sticky_kit:unstick', this.updateHorizontalScroll.bind(this));
- this.$el.parent().on('sticky_kit:bottom', this.updateHorizontalScroll.bind(this));
- this.$el.parent().on('sticky_kit:unbottom', this.updateHorizontalScroll.bind(this));
- },
- });
+ if (self.css('position') === 'fixed') {
+ calculated_left = self.parent().offset().left - $(window).scrollLeft();
+ self.css('left', calculated_left + 'px');
+ } else {
+ self.css('left', '');
+ }
+ });
+ },
+ onDomRefresh: function() {
+ var that = this;
+ this.$el.parent().stick_in_parent({
+ offset_top: 32,
+ });
+ this.$el.parent().on('sticky_kit:stick', this.updateHorizontalScroll.bind(this));
+ this.$el.parent().on('sticky_kit:unstick', this.updateHorizontalScroll.bind(this));
+ this.$el.parent().on('sticky_kit:bottom', this.updateHorizontalScroll.bind(this));
+ this.$el.parent().on('sticky_kit:unbottom', this.updateHorizontalScroll.bind(this));
+ },
+ });
- /**
- * Responsible for rendering draggable content widgets
- */
- Module.SidebarWidgetsView = Backbone.Marionette.CompositeView.extend({
- getTemplate: function() { return templates.sidebarContent; },
- getChildView: function(model) {
- return model.get('widgetView');
- },
- childViewContainer: '.mailpoet_region_content',
- });
+ /**
+ * Responsible for rendering draggable content widgets
+ */
+ Module.SidebarWidgetsView = Backbone.Marionette.CompositeView.extend({
+ getTemplate: function() { return templates.sidebarContent; },
+ getChildView: function(model) {
+ return model.get('widgetView');
+ },
+ childViewContainer: '.mailpoet_region_content',
+ });
- /**
- * Responsible for rendering draggable layout widgets
- */
- Module.SidebarLayoutWidgetsView = Module.SidebarWidgetsView.extend({
- getTemplate: function() { return templates.sidebarLayout; },
- });
- /**
- * Responsible for managing global styles
- */
- Module.SidebarStylesView = Backbone.Marionette.LayoutView.extend({
- getTemplate: function() { return templates.sidebarStyles; },
- events: function() {
- return {
- "change #mailpoet_text_font_color": _.partial(this.changeColorField, 'text.fontColor'),
- "change #mailpoet_text_font_family": function(event) {
- this.model.set('text.fontFamily', event.target.value);
- },
- "change #mailpoet_text_font_size": function(event) {
- this.model.set('text.fontSize', event.target.value);
- },
- "change #mailpoet_h1_font_color": _.partial(this.changeColorField, 'h1.fontColor'),
- "change #mailpoet_h1_font_family": function(event) {
- this.model.set('h1.fontFamily', event.target.value);
- },
- "change #mailpoet_h1_font_size": function(event) {
- this.model.set('h1.fontSize', event.target.value);
- },
- "change #mailpoet_h2_font_color": _.partial(this.changeColorField, 'h2.fontColor'),
- "change #mailpoet_h2_font_family": function(event) {
- this.model.set('h2.fontFamily', event.target.value);
- },
- "change #mailpoet_h2_font_size": function(event) {
- this.model.set('h2.fontSize', event.target.value);
- },
- "change #mailpoet_h3_font_color": _.partial(this.changeColorField, 'h3.fontColor'),
- "change #mailpoet_h3_font_family": function(event) {
- this.model.set('h3.fontFamily', event.target.value);
- },
- "change #mailpoet_h3_font_size": function(event) {
- this.model.set('h3.fontSize', event.target.value);
- },
- "change #mailpoet_a_font_color": _.partial(this.changeColorField, 'link.fontColor'),
- "change #mailpoet_a_font_underline": function(event) {
- this.model.set('link.textDecoration', (event.target.checked) ? event.target.value : 'none');
- },
- "change #mailpoet_newsletter_background_color": _.partial(this.changeColorField, 'newsletter.backgroundColor'),
- "change #mailpoet_background_color": _.partial(this.changeColorField, 'background.backgroundColor'),
- };
+ /**
+ * Responsible for rendering draggable layout widgets
+ */
+ Module.SidebarLayoutWidgetsView = Module.SidebarWidgetsView.extend({
+ getTemplate: function() { return templates.sidebarLayout; },
+ });
+ /**
+ * Responsible for managing global styles
+ */
+ Module.SidebarStylesView = Backbone.Marionette.LayoutView.extend({
+ getTemplate: function() { return templates.sidebarStyles; },
+ events: function() {
+ return {
+ "change #mailpoet_text_font_color": _.partial(this.changeColorField, 'text.fontColor'),
+ "change #mailpoet_text_font_family": function(event) {
+ this.model.set('text.fontFamily', event.target.value);
},
- templateHelpers: function() {
- return {
- model: this.model.toJSON(),
- availableStyles: this.availableStyles.toJSON(),
- };
+ "change #mailpoet_text_font_size": function(event) {
+ this.model.set('text.fontSize', event.target.value);
},
- initialize: function(options) {
- this.availableStyles = options.availableStyles;
- var that = this;
+ "change #mailpoet_h1_font_color": _.partial(this.changeColorField, 'h1.fontColor'),
+ "change #mailpoet_h1_font_family": function(event) {
+ this.model.set('h1.fontFamily', event.target.value);
},
- onRender: function() {
- var that = this;
- this.$('.mailpoet_color').spectrum({
- clickoutFiresChange: true,
- showInput: true,
- showInitial: true,
- preferredFormat: "hex6",
- allowEmpty: true,
- });
+ "change #mailpoet_h1_font_size": function(event) {
+ this.model.set('h1.fontSize', event.target.value);
},
- changeField: function(field, event) {
- this.model.set(field, jQuery(event.target).val());
+ "change #mailpoet_h2_font_color": _.partial(this.changeColorField, 'h2.fontColor'),
+ "change #mailpoet_h2_font_family": function(event) {
+ this.model.set('h2.fontFamily', event.target.value);
},
- changeColorField: function(field, event) {
- var value = jQuery(event.target).val();
- if (value === '') {
- value = 'transparent';
- }
- this.model.set(field, value);
+ "change #mailpoet_h2_font_size": function(event) {
+ this.model.set('h2.fontSize', event.target.value);
},
- });
+ "change #mailpoet_h3_font_color": _.partial(this.changeColorField, 'h3.fontColor'),
+ "change #mailpoet_h3_font_family": function(event) {
+ this.model.set('h3.fontFamily', event.target.value);
+ },
+ "change #mailpoet_h3_font_size": function(event) {
+ this.model.set('h3.fontSize', event.target.value);
+ },
+ "change #mailpoet_a_font_color": _.partial(this.changeColorField, 'link.fontColor'),
+ "change #mailpoet_a_font_underline": function(event) {
+ this.model.set('link.textDecoration', (event.target.checked) ? event.target.value : 'none');
+ },
+ "change #mailpoet_newsletter_background_color": _.partial(this.changeColorField, 'newsletter.backgroundColor'),
+ "change #mailpoet_background_color": _.partial(this.changeColorField, 'background.backgroundColor'),
+ };
+ },
+ templateHelpers: function() {
+ return {
+ model: this.model.toJSON(),
+ availableStyles: this.availableStyles.toJSON(),
+ };
+ },
+ initialize: function(options) {
+ this.availableStyles = options.availableStyles;
+ var that = this;
+ },
+ onRender: function() {
+ var that = this;
+ this.$('.mailpoet_color').spectrum({
+ clickoutFiresChange: true,
+ showInput: true,
+ showInitial: true,
+ preferredFormat: "hex6",
+ allowEmpty: true,
+ });
+ },
+ changeField: function(field, event) {
+ this.model.set(field, jQuery(event.target).val());
+ },
+ changeColorField: function(field, event) {
+ var value = jQuery(event.target).val();
+ if (value === '') {
+ value = 'transparent';
+ }
+ this.model.set(field, value);
+ },
+ });
- Module.SidebarPreviewView = Backbone.Marionette.LayoutView.extend({
- getTemplate: function() { return templates.sidebarPreview; },
- events: {
- 'click .mailpoet_show_preview': 'showPreview',
- 'click #mailpoet_send_preview': 'sendPreview',
- },
- showPreview: function() {
- var json = App.toJSON();
+ Module.SidebarPreviewView = Backbone.Marionette.LayoutView.extend({
+ getTemplate: function() { return templates.sidebarPreview; },
+ events: {
+ 'click .mailpoet_show_preview': 'showPreview',
+ 'click #mailpoet_send_preview': 'sendPreview',
+ },
+ showPreview: function() {
+ var json = App.toJSON();
- mailpoet_post_json('newsletter_render.php', { data: json }, function(response) {
- console.log('Should open a new window');
- window.open('data:text/html,' + encodeURIComponent(response), '_blank');
- }, function(error) {
- console.log('Preview error', json);
- alert('Something went wrong, check console');
- });
- },
- sendPreview: function() {
- // testing sending method
- console.log('trying to send a preview');
- // get form data
- var data = {
- from_name: this.$('#mailpoet_preview_from_name').val(),
- from_email: this.$('#mailpoet_preview_from_email').val(),
- to_email: this.$('#mailpoet_preview_to_email').val(),
- newsletter: App.newsletterId,
- };
+ mailpoet_post_json('newsletter_render.php', { data: json }, function(response) {
+ console.log('Should open a new window');
+ window.open('data:text/html,' + encodeURIComponent(response), '_blank');
+ }, function(error) {
+ console.log('Preview error', json);
+ alert('Something went wrong, check console');
+ });
+ },
+ sendPreview: function() {
+ // testing sending method
+ console.log('trying to send a preview');
+ // get form data
+ var data = {
+ from_name: this.$('#mailpoet_preview_from_name').val(),
+ from_email: this.$('#mailpoet_preview_from_email').val(),
+ to_email: this.$('#mailpoet_preview_to_email').val(),
+ newsletter: App.newsletterId,
+ };
- // send test email
- MailPoet.Modal.loading(true);
+ // send test email
+ MailPoet.Modal.loading(true);
- // TODO: Migrate logic to new AJAX format
- //mailpoet_post_wpi('newsletter_preview.php', data, function(response) {
- //if(response.success !== undefined && response.success === true) {
- //MailPoet.Notice.success(App.getConfig().get('translations.testEmailSent'));
- //} else if(response.error !== undefined) {
- //if(response.error.length === 0) {
- //MailPoet.Notice.error(App.getConfig().get('translations.unknownErrorOccurred'));
- //} else {
- //$(response.error).each(function(i, error) {
- //MailPoet.Notice.error(error);
- //});
- //}
- //}
- //MailPoet.Modal.loading(false);
- //}, function(error) {
- //// an error occurred
- //MailPoet.Modal.loading(false);
+ // TODO: Migrate logic to new AJAX format
+ //mailpoet_post_wpi('newsletter_preview.php', data, function(response) {
+ //if(response.success !== undefined && response.success === true) {
+ //MailPoet.Notice.success(App.getConfig().get('translations.testEmailSent'));
+ //} else if(response.error !== undefined) {
+ //if(response.error.length === 0) {
+ //MailPoet.Notice.error(App.getConfig().get('translations.unknownErrorOccurred'));
+ //} else {
+ //$(response.error).each(function(i, error) {
+ //MailPoet.Notice.error(error);
//});
- },
- });
+ //}
+ //}
+ //MailPoet.Modal.loading(false);
+ //}, function(error) {
+ //// an error occurred
+ //MailPoet.Modal.loading(false);
+ //});
+ },
+ });
- App.on('before:start', function(options) {
- App.registerWidget = Module.registerWidget;
- App.getWidgets = Module.getWidgets;
- App.registerLayoutWidget = Module.registerLayoutWidget;
- App.getLayoutWidgets = Module.getLayoutWidgets;
- });
+ App.on('before:start', function(options) {
+ App.registerWidget = Module.registerWidget;
+ App.getWidgets = Module.getWidgets;
+ App.registerLayoutWidget = Module.registerLayoutWidget;
+ App.getLayoutWidgets = Module.getLayoutWidgets;
+ });
- App.on('start', function(options) {
- var stylesModel = App.getGlobalStyles(),
- sidebarView = new SidebarView();
+ App.on('start', function(options) {
+ var stylesModel = App.getGlobalStyles(),
+ sidebarView = new SidebarView();
- App._appView.sidebarRegion.show(sidebarView);
- });
+ App._appView.sidebarRegion.show(sidebarView);
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/components/styles.js b/assets/js/src/newsletter_editor/components/styles.js
index 0501a2d52c..0c803c25db 100644
--- a/assets/js/src/newsletter_editor/components/styles.js
+++ b/assets/js/src/newsletter_editor/components/styles.js
@@ -5,79 +5,78 @@ define('newsletter_editor/components/styles', [
], function(EditorApplication, Backbone, Marionette) {
EditorApplication.module("components.styles", function(Module, App, Backbone, Marionette, $, _) {
- "use strict";
+ "use strict";
- Module.StylesModel = Backbone.SuperModel.extend({
- defaults: {
- text: {
- fontColor: '#000000',
- fontFamily: 'Arial',
- fontSize: '16px',
- },
- h1: {
- fontColor: '#111111',
- fontFamily: 'Arial Black',
- fontSize: '40px'
- },
- h2: {
- fontColor: '#222222',
- fontFamily: 'Tahoma',
- fontSize: '32px',
- },
- h3: {
- fontColor: '#333333',
- fontFamily: 'Verdana',
- fontSize: '24px',
- },
- link: {
- fontColor: '#21759B',
- textDecoration: 'underline',
- },
- newsletter: {
- backgroundColor: '#ffffff',
- },
- background: {
- backgroundColor: '#cccccc',
- },
- },
- initialize: function() {
- this.on('change', function() { App.getChannel().trigger('autoSave'); });
- },
- });
+ Module.StylesModel = Backbone.SuperModel.extend({
+ defaults: {
+ text: {
+ fontColor: '#000000',
+ fontFamily: 'Arial',
+ fontSize: '16px',
+ },
+ h1: {
+ fontColor: '#111111',
+ fontFamily: 'Arial Black',
+ fontSize: '40px'
+ },
+ h2: {
+ fontColor: '#222222',
+ fontFamily: 'Tahoma',
+ fontSize: '32px',
+ },
+ h3: {
+ fontColor: '#333333',
+ fontFamily: 'Verdana',
+ fontSize: '24px',
+ },
+ link: {
+ fontColor: '#21759B',
+ textDecoration: 'underline',
+ },
+ newsletter: {
+ backgroundColor: '#ffffff',
+ },
+ background: {
+ backgroundColor: '#cccccc',
+ },
+ },
+ initialize: function() {
+ this.on('change', function() { App.getChannel().trigger('autoSave'); });
+ },
+ });
- Module.StylesView = Marionette.ItemView.extend({
- getTemplate: function() { return templates.styles; },
- modelEvents: {
- 'change': 'render',
- },
- });
+ Module.StylesView = Marionette.ItemView.extend({
+ getTemplate: function() { return templates.styles; },
+ modelEvents: {
+ 'change': 'render',
+ },
+ });
- Module._globalStyles = new Backbone.SuperModel();
- Module.getGlobalStyles = function() {
- return Module._globalStyles;
- };
- Module.setGlobalStyles = function(options) {
- Module._globalStyles = new Module.StylesModel(options);
- return Module._globalStyles;
- };
- Module.getAvailableStyles = function() {
- return App.getConfig().get('availableStyles');
- };
+ Module._globalStyles = new Backbone.SuperModel();
+ Module.getGlobalStyles = function() {
+ return Module._globalStyles;
+ };
+ Module.setGlobalStyles = function(options) {
+ Module._globalStyles = new Module.StylesModel(options);
+ return Module._globalStyles;
+ };
+ Module.getAvailableStyles = function() {
+ return App.getConfig().get('availableStyles');
+ };
- App.on('before:start', function(options) {
- // Expose style methods to global application
- App.getGlobalStyles = Module.getGlobalStyles;
- App.setGlobalStyles = Module.setGlobalStyles;
+ App.on('before:start', function(options) {
+ // Expose style methods to global application
+ App.getGlobalStyles = Module.getGlobalStyles;
+ App.setGlobalStyles = Module.setGlobalStyles;
- App.getAvailableStyles = Module.getAvailableStyles;
+ App.getAvailableStyles = Module.getAvailableStyles;
- this.setGlobalStyles(options.newsletter.styles);
- });
+ this.setGlobalStyles(options.newsletter.styles);
+ });
- App.on('start', function(options) {
- var stylesView = new Module.StylesView({ model: App.getGlobalStyles() });
- App._appView.stylesRegion.show(stylesView);
- });
+ App.on('start', function(options) {
+ var stylesView = new Module.StylesView({ model: App.getGlobalStyles() });
+ App._appView.stylesRegion.show(stylesView);
+ });
});
-
});
diff --git a/assets/js/src/newsletter_editor/tinymce/mailpoet_custom_fields/plugin.js b/assets/js/src/newsletter_editor/tinymce/mailpoet_custom_fields/plugin.js
index 8e813bb732..ca7e5fe434 100644
--- a/assets/js/src/newsletter_editor/tinymce/mailpoet_custom_fields/plugin.js
+++ b/assets/js/src/newsletter_editor/tinymce/mailpoet_custom_fields/plugin.js
@@ -11,48 +11,48 @@
/*jshint unused:false */
/*global tinymce:true */
tinymce.PluginManager.add('mailpoet_custom_fields', function(editor, url) {
- var appendLabelAndClose = function(text) {
- editor.insertContent('[' + text + ']');
- editor.windowManager.close();
- },
- generateOnClickFunc = function(id) {
- return function() {
- appendLabelAndClose(id);
- };
- };
+ var appendLabelAndClose = function(text) {
+ editor.insertContent('[' + text + ']');
+ editor.windowManager.close();
+ },
+ generateOnClickFunc = function(id) {
+ return function() {
+ appendLabelAndClose(id);
+ };
+ };
- editor.addButton('mailpoet_custom_fields', {
- icon: 'mailpoet_custom_fields',
- onclick: function() {
- var customFields = [],
- configCustomFields = editor.settings.mailpoet_custom_fields;
+ editor.addButton('mailpoet_custom_fields', {
+ icon: 'mailpoet_custom_fields',
+ onclick: function() {
+ var customFields = [],
+ configCustomFields = editor.settings.mailpoet_custom_fields;
- for (var segment in configCustomFields) {
- if (configCustomFields.hasOwnProperty(segment)) {
- customFields.push({
- type: 'label',
- text: segment,
- });
+ for (var segment in configCustomFields) {
+ if (configCustomFields.hasOwnProperty(segment)) {
+ customFields.push({
+ type: 'label',
+ text: segment,
+ });
- for (var i = 0; i < configCustomFields[segment].length; i += 1) {
- customFields.push({
- type: 'button',
- text: configCustomFields[segment][i].text,
- onClick: generateOnClickFunc(configCustomFields[segment][i].shortcode)
- });
- }
- }
- }
-
- // Open window
- editor.windowManager.open({
- height: parseInt(editor.getParam("plugin_mailpoet_custom_fields_height", 400)),
- width: parseInt(editor.getParam("plugin_mailpoet_custom_fields_width", 450)),
- autoScroll: true,
- title: editor.settings.mailpoet_custom_fields_window_title,
- body: customFields,
- buttons: [],
+ for (var i = 0; i < configCustomFields[segment].length; i += 1) {
+ customFields.push({
+ type: 'button',
+ text: configCustomFields[segment][i].text,
+ onClick: generateOnClickFunc(configCustomFields[segment][i].shortcode)
});
- },
- });
+ }
+ }
+ }
+
+ // Open window
+ editor.windowManager.open({
+ height: parseInt(editor.getParam("plugin_mailpoet_custom_fields_height", 400)),
+ width: parseInt(editor.getParam("plugin_mailpoet_custom_fields_width", 450)),
+ autoScroll: true,
+ title: editor.settings.mailpoet_custom_fields_window_title,
+ body: customFields,
+ buttons: [],
+ });
+ },
+ });
});
diff --git a/assets/js/src/newsletter_editor/widgets/ImageAndTextWidgetView.js b/assets/js/src/newsletter_editor/widgets/ImageAndTextWidgetView.js
index 146650c741..1d09e4a5a0 100644
--- a/assets/js/src/newsletter_editor/widgets/ImageAndTextWidgetView.js
+++ b/assets/js/src/newsletter_editor/widgets/ImageAndTextWidgetView.js
@@ -3,25 +3,25 @@
* A draggable widget, on drop creates a container with (image|text) block.
*/
ImageAndTextTemplateWidgetView = EditorApplication.module('blocks.base').WidgetView.extend({
- getTemplate: function() { return templates.imageAndTextInsertion; },
- className: 'mailpoet_droppable_block mailpoet_droppable_widget',
- behaviors: {
- DraggableBehavior: {
- drop: function() {
- return new (EditorApplication.getBlockTypeModel('container'))({
- type: 'container',
- orientation: 'horizontal',
- blocks: [
- {
- type: 'image',
- },
- {
- type: 'text',
- text: 'Some random text',
- },
- ],
- }, {parse: true});
+ getTemplate: function() { return templates.imageAndTextInsertion; },
+ className: 'mailpoet_droppable_block mailpoet_droppable_widget',
+ behaviors: {
+ DraggableBehavior: {
+ drop: function() {
+ return new (EditorApplication.getBlockTypeModel('container'))({
+ type: 'container',
+ orientation: 'horizontal',
+ blocks: [
+ {
+ type: 'image',
},
- }
- },
+ {
+ type: 'text',
+ text: 'Some random text',
+ },
+ ],
+ }, {parse: true});
+ },
+ }
+ },
});
diff --git a/tests/javascript/loadHelpers.js b/tests/javascript/loadHelpers.js
index 40d17d6274..a852c3b2fb 100644
--- a/tests/javascript/loadHelpers.js
+++ b/tests/javascript/loadHelpers.js
@@ -1,28 +1,27 @@
var fs = require('fs');
module.exports = {
- loadFileToContainer: function (path, window, containerTagName, options) {
- var contents = fs.readFileSync(path),
- container = window.document.createElement(containerTagName);
- options = options || {};
- container.innerHTML = contents;
+ loadFileToContainer: function (path, window, containerTagName, options) {
+ var contents = fs.readFileSync(path),
+ container = window.document.createElement(containerTagName);
+ options = options || {};
+ container.innerHTML = contents;
- if (options.type) {
- container.type = options.type;
- }
- if (options.id) {
- container.id = options.id;
- }
- global.window.document.body.appendChild(container);
- },
- loadScript: function (scriptPath, window, options) {
- this.loadFileToContainer(scriptPath, window, 'script', options);
- },
- loadTemplate: function (path, window, options) {
- var w = window || global.window;
- options = options || {};
- options.type = "text/x-handlebars-template";
+ if (options.type) {
+ container.type = options.type;
+ }
+ if (options.id) {
+ container.id = options.id;
+ }
+ global.window.document.body.appendChild(container);
+ },
+ loadScript: function (scriptPath, window, options) {
+ this.loadFileToContainer(scriptPath, window, 'script', options);
+ },
+ loadTemplate: function (path, window, options) {
+ var w = window || global.window;
+ options = options || {};
+ options.type = "text/x-handlebars-template";
- this.loadScript("views/newsletter/templates/" + path, w, options);
- },
+ this.loadScript("views/newsletter/templates/" + path, w, options);
+ },
};
-
diff --git a/tests/javascript/mochaTestHelper.js b/tests/javascript/mochaTestHelper.js
index 6887c5289f..bc636da119 100644
--- a/tests/javascript/mochaTestHelper.js
+++ b/tests/javascript/mochaTestHelper.js
@@ -10,21 +10,21 @@ global.expect = chai.expect;
global.sinon = sinon;
if (!global.document || !global.window) {
- var jsdom = require('jsdom').jsdom;
+ var jsdom = require('jsdom').jsdom;
- global.document = jsdom('