MailPoet Newsletters (New) - Version 3.7.5

Version Description

  • 2018-06-05 =
  • Added: align images left or right of posts excerpts;
  • Fixed: post content block image alignment issues.
Download this release

Release Info

Developer wysija
Plugin Icon 128x128 MailPoet Newsletters (New)
Version 3.7.5
Comparing to
See all releases

Code changes from version 3.7.4 to 3.7.5

Files changed (53) hide show
  1. assets/css/manifest.json +1 -1
  2. assets/css/{newsletter_editor.9cb620b4.css → newsletter_editor.f491d3e7.css} +14 -3
  3. assets/js/{admin.b1f6f0a0.js → admin.a58c3783.js} +68 -125
  4. assets/js/{admin_vendor.b19a9487.js → admin_vendor.016e33b8.js} +15 -69
  5. assets/js/{form_editor.f475a2b0.js → form_editor.b2d3a84e.js} +19 -39
  6. assets/js/lib/mailpoet_shortcodes/plugin.js +20 -21
  7. assets/js/{mailpoet.7070ca4a.js → mailpoet.f26c86e7.js} +70 -127
  8. assets/js/manifest.json +6 -6
  9. assets/js/{newsletter_editor.69062a08.js → newsletter_editor.1d7b4686.js} +861 -455
  10. assets/js/{vendor.0b1694bf.js → vendor.98a3aa8c.js} +3 -3
  11. lang/mailpoet-ca.mo +0 -0
  12. lang/mailpoet-da_DK.mo +0 -0
  13. lang/mailpoet-de_DE.mo +0 -0
  14. lang/mailpoet-en_GB.mo +0 -0
  15. lang/mailpoet-es_ES.mo +0 -0
  16. lang/mailpoet-fa_IR.mo +0 -0
  17. lang/mailpoet-fr_CA.mo +0 -0
  18. lang/mailpoet-fr_FR.mo +0 -0
  19. lang/mailpoet-it_IT.mo +0 -0
  20. lang/mailpoet-ja.mo +0 -0
  21. lang/mailpoet-nl_NL.mo +0 -0
  22. lang/mailpoet-pl_PL.mo +0 -0
  23. lang/mailpoet-pt_BR.mo +0 -0
  24. lang/mailpoet-pt_PT.mo +0 -0
  25. lang/mailpoet-ru_RU.mo +0 -0
  26. lang/mailpoet-sq.mo +0 -0
  27. lang/mailpoet-sv_SE.mo +0 -0
  28. lang/mailpoet-tr_TR.mo +0 -0
  29. lang/mailpoet.pot +164 -100
  30. lib/Config/Env.php +2 -0
  31. lib/Config/Initializer.php +2 -2
  32. lib/Config/PopulatorData/Templates/PostNotificationsBlank1Column.php +66 -87
  33. lib/Newsletter/Editor/LayoutHelper.php +30 -0
  34. lib/Newsletter/Editor/PostContentManager.php +8 -4
  35. lib/Newsletter/Editor/PostListTransformer.php +1 -1
  36. lib/Newsletter/Editor/PostTransformer.php +156 -107
  37. lib/Newsletter/Renderer/Blocks/Renderer.php +7 -3
  38. lib/Newsletter/Renderer/Renderer.php +21 -0
  39. lib/Settings/Pages.php +0 -1
  40. lib/WP/Functions.php +22 -1
  41. mailpoet.php +2 -2
  42. readme.txt +13 -311
  43. vendor/autoload.php +1 -1
  44. vendor/composer/autoload_classmap.php +1 -0
  45. vendor/composer/autoload_real.php +7 -7
  46. vendor/composer/autoload_static.php +6 -5
  47. views/newsletter/editor.html +80 -1
  48. views/newsletter/templates/blocks/automatedLatestContentLayout/block.hbs +6 -0
  49. views/newsletter/templates/blocks/automatedLatestContentLayout/index.php +0 -0
  50. views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs +313 -0
  51. views/newsletter/templates/blocks/automatedLatestContentLayout/widget.hbs +4 -0
  52. views/newsletter/templates/blocks/posts/block.hbs +1 -3
  53. views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs +16 -4
assets/css/manifest.json CHANGED
@@ -2,7 +2,7 @@
2
  "admin-global.css": "admin-global.673373a1.css",
3
  "admin.css": "admin.6bec32c2.css",
4
  "importExport.css": "importExport.b3745466.css",
5
- "newsletter_editor.css": "newsletter_editor.9cb620b4.css",
6
  "public.css": "public.cae357df.css",
7
  "rtl.css": "rtl.d41d8cd9.css"
8
  }
2
  "admin-global.css": "admin-global.673373a1.css",
3
  "admin.css": "admin.6bec32c2.css",
4
  "importExport.css": "importExport.b3745466.css",
5
+ "newsletter_editor.css": "newsletter_editor.f491d3e7.css",
6
  "public.css": "public.cae357df.css",
7
  "rtl.css": "rtl.d41d8cd9.css"
8
  }
assets/css/{newsletter_editor.9cb620b4.css → newsletter_editor.f491d3e7.css} RENAMED
@@ -2087,11 +2087,19 @@ input.mailpoet_option_offset_left_small {
2087
  width: 660px;
2088
  }
2089
  #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(2),
2090
- #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(2) ~ .mailpoet_block {
 
 
 
 
2091
  width: 330px;
2092
  }
2093
  #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(3),
2094
- #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(3) ~ .mailpoet_block {
 
 
 
 
2095
  width: 220px;
2096
  }
2097
  .mailpoet_container_empty {
@@ -2124,7 +2132,7 @@ input.mailpoet_option_offset_left_small {
2124
  cursor: pointer;
2125
  }
2126
  .mailpoet_automated_latest_content_block_posts {
2127
- overflow: auto;
2128
  pointer-events: none;
2129
  }
2130
  .mailpoet_automated_latest_content_block_posts > .mailpoet_block {
@@ -2213,6 +2221,9 @@ input.mailpoet_option_offset_left_small {
2213
  .mailpoet_post_selection_loading {
2214
  color: #999;
2215
  }
 
 
 
2216
  .mailpoet_button_block {
2217
  overflow: hidden;
2218
  }
2087
  width: 660px;
2088
  }
2089
  #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(2),
2090
+ #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_posts_block > .mailpoet_posts_container > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(2),
2091
+ #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container .mailpoet_automated_latest_content_block_posts .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(2),
2092
+ #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(2) ~ .mailpoet_block,
2093
+ #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_posts_block > .mailpoet_posts_container > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(2) ~ .mailpoet_block,
2094
+ #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container .mailpoet_automated_latest_content_block_posts .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(2) ~ .mailpoet_block {
2095
  width: 330px;
2096
  }
2097
  #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(3),
2098
+ #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_posts_block > .mailpoet_posts_container > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(3),
2099
+ #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container .mailpoet_automated_latest_content_block_posts .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(3),
2100
+ #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(3) ~ .mailpoet_block,
2101
+ #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container > .mailpoet_posts_block > .mailpoet_posts_container > .mailpoet_container_block > .mailpoet_container > .mailpoet_container_block > .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(3) ~ .mailpoet_block,
2102
+ #mailpoet_editor_content > .mailpoet_container_block > .mailpoet_container .mailpoet_automated_latest_content_block_posts .mailpoet_container_horizontal > .mailpoet_block:first-child:nth-last-child(3) ~ .mailpoet_block {
2103
  width: 220px;
2104
  }
2105
  .mailpoet_container_empty {
2132
  cursor: pointer;
2133
  }
2134
  .mailpoet_automated_latest_content_block_posts {
2135
+ overflow: hidden;
2136
  pointer-events: none;
2137
  }
2138
  .mailpoet_automated_latest_content_block_posts > .mailpoet_block {
2221
  .mailpoet_post_selection_loading {
2222
  color: #999;
2223
  }
2224
+ .mailpoet_posts_container > .mailpoet_droppable_block {
2225
+ width: 100%;
2226
+ }
2227
  .mailpoet_button_block {
2228
  overflow: hidden;
2229
  }
assets/js/{admin.b1f6f0a0.js → admin.a58c3783.js} RENAMED
@@ -4072,7 +4072,7 @@ webpackJsonp([0],{
4072
 
4073
  var elem = this._tagStack.pop();
4074
 
4075
- if(this._options.withEndIndices && elem){
4076
  elem.endIndex = this._parser.endIndex;
4077
  }
4078
 
@@ -7442,102 +7442,68 @@ webpackJsonp([0],{
7442
  revLookup[code.charCodeAt(i)] = i
7443
  }
7444
 
7445
- // Support decoding URL-safe base64 strings, as Node.js does.
7446
- // See: https://en.wikipedia.org/wiki/Base64#URL_applications
7447
  revLookup['-'.charCodeAt(0)] = 62
7448
  revLookup['_'.charCodeAt(0)] = 63
7449
 
7450
- function getLens (b64) {
7451
  var len = b64.length
7452
-
7453
  if (len % 4 > 0) {
7454
  throw new Error('Invalid string. Length must be a multiple of 4')
7455
  }
7456
 
7457
- // Trim off extra bytes after placeholder bytes are found
7458
- // See: https://github.com/beatgammit/base64-js/issues/42
7459
- var validLen = b64.indexOf('=')
7460
- if (validLen === -1) validLen = len
7461
-
7462
- var placeHoldersLen = validLen === len
7463
- ? 0
7464
- : 4 - (validLen % 4)
7465
-
7466
- return [validLen, placeHoldersLen]
7467
  }
7468
 
7469
- // base64 is 4/3 + up to two characters of the original data
7470
  function byteLength (b64) {
7471
- var lens = getLens(b64)
7472
- var validLen = lens[0]
7473
- var placeHoldersLen = lens[1]
7474
- return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
7475
- }
7476
-
7477
- function _byteLength (b64, validLen, placeHoldersLen) {
7478
- return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
7479
  }
7480
 
7481
  function toByteArray (b64) {
7482
- var tmp
7483
- var lens = getLens(b64)
7484
- var validLen = lens[0]
7485
- var placeHoldersLen = lens[1]
7486
-
7487
- var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
7488
 
7489
- var curByte = 0
7490
 
7491
  // if there are placeholders, only get up to the last complete 4 chars
7492
- var len = placeHoldersLen > 0
7493
- ? validLen - 4
7494
- : validLen
7495
 
7496
- for (var i = 0; i < len; i += 4) {
7497
- tmp =
7498
- (revLookup[b64.charCodeAt(i)] << 18) |
7499
- (revLookup[b64.charCodeAt(i + 1)] << 12) |
7500
- (revLookup[b64.charCodeAt(i + 2)] << 6) |
7501
- revLookup[b64.charCodeAt(i + 3)]
7502
- arr[curByte++] = (tmp >> 16) & 0xFF
7503
- arr[curByte++] = (tmp >> 8) & 0xFF
7504
- arr[curByte++] = tmp & 0xFF
7505
- }
7506
 
7507
- if (placeHoldersLen === 2) {
7508
- tmp =
7509
- (revLookup[b64.charCodeAt(i)] << 2) |
7510
- (revLookup[b64.charCodeAt(i + 1)] >> 4)
7511
- arr[curByte++] = tmp & 0xFF
7512
  }
7513
 
7514
- if (placeHoldersLen === 1) {
7515
- tmp =
7516
- (revLookup[b64.charCodeAt(i)] << 10) |
7517
- (revLookup[b64.charCodeAt(i + 1)] << 4) |
7518
- (revLookup[b64.charCodeAt(i + 2)] >> 2)
7519
- arr[curByte++] = (tmp >> 8) & 0xFF
7520
- arr[curByte++] = tmp & 0xFF
7521
  }
7522
 
7523
  return arr
7524
  }
7525
 
7526
  function tripletToBase64 (num) {
7527
- return lookup[num >> 18 & 0x3F] +
7528
- lookup[num >> 12 & 0x3F] +
7529
- lookup[num >> 6 & 0x3F] +
7530
- lookup[num & 0x3F]
7531
  }
7532
 
7533
  function encodeChunk (uint8, start, end) {
7534
  var tmp
7535
  var output = []
7536
  for (var i = start; i < end; i += 3) {
7537
- tmp =
7538
- ((uint8[i] << 16) & 0xFF0000) +
7539
- ((uint8[i + 1] << 8) & 0xFF00) +
7540
- (uint8[i + 2] & 0xFF)
7541
  output.push(tripletToBase64(tmp))
7542
  }
7543
  return output.join('')
@@ -7547,34 +7513,31 @@ webpackJsonp([0],{
7547
  var tmp
7548
  var len = uint8.length
7549
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
 
7550
  var parts = []
7551
  var maxChunkLength = 16383 // must be multiple of 3
7552
 
7553
  // go through the array every three bytes, we'll deal with trailing stuff later
7554
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
7555
- parts.push(encodeChunk(
7556
- uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
7557
- ))
7558
  }
7559
 
7560
  // pad the end with zeros, but make sure to not forget the extra bytes
7561
  if (extraBytes === 1) {
7562
  tmp = uint8[len - 1]
7563
- parts.push(
7564
- lookup[tmp >> 2] +
7565
- lookup[(tmp << 4) & 0x3F] +
7566
- '=='
7567
- )
7568
  } else if (extraBytes === 2) {
7569
- tmp = (uint8[len - 2] << 8) + uint8[len - 1]
7570
- parts.push(
7571
- lookup[tmp >> 10] +
7572
- lookup[(tmp >> 4) & 0x3F] +
7573
- lookup[(tmp << 2) & 0x3F] +
7574
- '='
7575
- )
7576
  }
7577
 
 
 
7578
  return parts.join('')
7579
  }
7580
 
@@ -7586,7 +7549,7 @@ webpackJsonp([0],{
7586
 
7587
  exports.read = function (buffer, offset, isLE, mLen, nBytes) {
7588
  var e, m
7589
- var eLen = (nBytes * 8) - mLen - 1
7590
  var eMax = (1 << eLen) - 1
7591
  var eBias = eMax >> 1
7592
  var nBits = -7
@@ -7599,12 +7562,12 @@ webpackJsonp([0],{
7599
  e = s & ((1 << (-nBits)) - 1)
7600
  s >>= (-nBits)
7601
  nBits += eLen
7602
- for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
7603
 
7604
  m = e & ((1 << (-nBits)) - 1)
7605
  e >>= (-nBits)
7606
  nBits += mLen
7607
- for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
7608
 
7609
  if (e === 0) {
7610
  e = 1 - eBias
@@ -7619,7 +7582,7 @@ webpackJsonp([0],{
7619
 
7620
  exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
7621
  var e, m, c
7622
- var eLen = (nBytes * 8) - mLen - 1
7623
  var eMax = (1 << eLen) - 1
7624
  var eBias = eMax >> 1
7625
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
@@ -7652,7 +7615,7 @@ webpackJsonp([0],{
7652
  m = 0
7653
  e = eMax
7654
  } else if (e + eBias >= 1) {
7655
- m = ((value * c) - 1) * Math.pow(2, mLen)
7656
  e = e + eBias
7657
  } else {
7658
  m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
@@ -8927,33 +8890,9 @@ webpackJsonp([0],{
8927
  /***/ 502:
8928
  /***/ function(module, exports, __webpack_require__) {
8929
 
8930
- // Copyright Joyent, Inc. and other Node contributors.
8931
- //
8932
- // Permission is hereby granted, free of charge, to any person obtaining a
8933
- // copy of this software and associated documentation files (the
8934
- // "Software"), to deal in the Software without restriction, including
8935
- // without limitation the rights to use, copy, modify, merge, publish,
8936
- // distribute, sublicense, and/or sell copies of the Software, and to permit
8937
- // persons to whom the Software is furnished to do so, subject to the
8938
- // following conditions:
8939
- //
8940
- // The above copyright notice and this permission notice shall be included
8941
- // in all copies or substantial portions of the Software.
8942
- //
8943
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
8944
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
8945
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
8946
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
8947
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
8948
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8949
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
8950
-
8951
  'use strict';
8952
 
8953
- /*<replacement>*/
8954
-
8955
  var Buffer = __webpack_require__(503).Buffer;
8956
- /*</replacement>*/
8957
 
8958
  var isEncoding = Buffer.isEncoding || function (encoding) {
8959
  encoding = '' + encoding;
@@ -9065,10 +9004,10 @@ webpackJsonp([0],{
9065
  };
9066
 
9067
  // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
9068
- // continuation byte. If an invalid byte is detected, -2 is returned.
9069
  function utf8CheckByte(byte) {
9070
  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
9071
- return byte >> 6 === 0x02 ? -1 : -2;
9072
  }
9073
 
9074
  // Checks at most 3 bytes at the end of a Buffer in order to detect an
@@ -9082,13 +9021,13 @@ webpackJsonp([0],{
9082
  if (nb > 0) self.lastNeed = nb - 1;
9083
  return nb;
9084
  }
9085
- if (--j < i || nb === -2) return 0;
9086
  nb = utf8CheckByte(buf[j]);
9087
  if (nb >= 0) {
9088
  if (nb > 0) self.lastNeed = nb - 2;
9089
  return nb;
9090
  }
9091
- if (--j < i || nb === -2) return 0;
9092
  nb = utf8CheckByte(buf[j]);
9093
  if (nb >= 0) {
9094
  if (nb > 0) {
@@ -9102,7 +9041,7 @@ webpackJsonp([0],{
9102
  // Validates as many continuation bytes for a multi-byte UTF-8 character as
9103
  // needed or are available. If we see a non-continuation byte where we expect
9104
  // one, we "replace" the validated continuation bytes we've seen so far with
9105
- // a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
9106
  // behavior. The continuation byte check is included three times in the case
9107
  // where all of the continuation bytes for a character exist in the same buffer.
9108
  // It is also done this way as a slight performance increase instead of using a
@@ -9110,17 +9049,17 @@ webpackJsonp([0],{
9110
  function utf8CheckExtraBytes(self, buf, p) {
9111
  if ((buf[0] & 0xC0) !== 0x80) {
9112
  self.lastNeed = 0;
9113
- return '\ufffd';
9114
  }
9115
  if (self.lastNeed > 1 && buf.length > 1) {
9116
  if ((buf[1] & 0xC0) !== 0x80) {
9117
  self.lastNeed = 1;
9118
- return '\ufffd';
9119
  }
9120
  if (self.lastNeed > 2 && buf.length > 2) {
9121
  if ((buf[2] & 0xC0) !== 0x80) {
9122
  self.lastNeed = 2;
9123
- return '\ufffd';
9124
  }
9125
  }
9126
  }
@@ -9151,11 +9090,11 @@ webpackJsonp([0],{
9151
  return buf.toString('utf8', i, end);
9152
  }
9153
 
9154
- // For UTF-8, a replacement character is added when ending on a partial
9155
- // character.
9156
  function utf8End(buf) {
9157
  var r = buf && buf.length ? this.write(buf) : '';
9158
- if (this.lastNeed) return r + '\ufffd';
9159
  return r;
9160
  }
9161
 
@@ -10010,14 +9949,18 @@ webpackJsonp([0],{
10010
 
10011
  function findAll(test, rootElems){
10012
  var result = [];
10013
- var stack = rootElems.slice();
10014
  while(stack.length){
10015
- var elem = stack.shift();
10016
- if(!isTag(elem)) continue;
10017
- if (elem.children && elem.children.length > 0) {
10018
- stack.unshift.apply(stack, elem.children);
 
 
 
 
 
10019
  }
10020
- if(test(elem)) result.push(elem);
10021
  }
10022
  return result;
10023
  }
4072
 
4073
  var elem = this._tagStack.pop();
4074
 
4075
+ if(this._options.withEndIndices){
4076
  elem.endIndex = this._parser.endIndex;
4077
  }
4078
 
7442
  revLookup[code.charCodeAt(i)] = i
7443
  }
7444
 
 
 
7445
  revLookup['-'.charCodeAt(0)] = 62
7446
  revLookup['_'.charCodeAt(0)] = 63
7447
 
7448
+ function placeHoldersCount (b64) {
7449
  var len = b64.length
 
7450
  if (len % 4 > 0) {
7451
  throw new Error('Invalid string. Length must be a multiple of 4')
7452
  }
7453
 
7454
+ // the number of equal signs (place holders)
7455
+ // if there are two placeholders, than the two characters before it
7456
+ // represent one byte
7457
+ // if there is only one, then the three characters before it represent 2 bytes
7458
+ // this is just a cheap hack to not do indexOf twice
7459
+ return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
 
 
 
 
7460
  }
7461
 
 
7462
  function byteLength (b64) {
7463
+ // base64 is 4/3 + up to two characters of the original data
7464
+ return (b64.length * 3 / 4) - placeHoldersCount(b64)
 
 
 
 
 
 
7465
  }
7466
 
7467
  function toByteArray (b64) {
7468
+ var i, l, tmp, placeHolders, arr
7469
+ var len = b64.length
7470
+ placeHolders = placeHoldersCount(b64)
 
 
 
7471
 
7472
+ arr = new Arr((len * 3 / 4) - placeHolders)
7473
 
7474
  // if there are placeholders, only get up to the last complete 4 chars
7475
+ l = placeHolders > 0 ? len - 4 : len
 
 
7476
 
7477
+ var L = 0
 
 
 
 
 
 
 
 
 
7478
 
7479
+ for (i = 0; i < l; i += 4) {
7480
+ tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
7481
+ arr[L++] = (tmp >> 16) & 0xFF
7482
+ arr[L++] = (tmp >> 8) & 0xFF
7483
+ arr[L++] = tmp & 0xFF
7484
  }
7485
 
7486
+ if (placeHolders === 2) {
7487
+ tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
7488
+ arr[L++] = tmp & 0xFF
7489
+ } else if (placeHolders === 1) {
7490
+ tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
7491
+ arr[L++] = (tmp >> 8) & 0xFF
7492
+ arr[L++] = tmp & 0xFF
7493
  }
7494
 
7495
  return arr
7496
  }
7497
 
7498
  function tripletToBase64 (num) {
7499
+ return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
 
 
 
7500
  }
7501
 
7502
  function encodeChunk (uint8, start, end) {
7503
  var tmp
7504
  var output = []
7505
  for (var i = start; i < end; i += 3) {
7506
+ tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
 
 
 
7507
  output.push(tripletToBase64(tmp))
7508
  }
7509
  return output.join('')
7513
  var tmp
7514
  var len = uint8.length
7515
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
7516
+ var output = ''
7517
  var parts = []
7518
  var maxChunkLength = 16383 // must be multiple of 3
7519
 
7520
  // go through the array every three bytes, we'll deal with trailing stuff later
7521
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
7522
+ parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
 
 
7523
  }
7524
 
7525
  // pad the end with zeros, but make sure to not forget the extra bytes
7526
  if (extraBytes === 1) {
7527
  tmp = uint8[len - 1]
7528
+ output += lookup[tmp >> 2]
7529
+ output += lookup[(tmp << 4) & 0x3F]
7530
+ output += '=='
 
 
7531
  } else if (extraBytes === 2) {
7532
+ tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
7533
+ output += lookup[tmp >> 10]
7534
+ output += lookup[(tmp >> 4) & 0x3F]
7535
+ output += lookup[(tmp << 2) & 0x3F]
7536
+ output += '='
 
 
7537
  }
7538
 
7539
+ parts.push(output)
7540
+
7541
  return parts.join('')
7542
  }
7543
 
7549
 
7550
  exports.read = function (buffer, offset, isLE, mLen, nBytes) {
7551
  var e, m
7552
+ var eLen = nBytes * 8 - mLen - 1
7553
  var eMax = (1 << eLen) - 1
7554
  var eBias = eMax >> 1
7555
  var nBits = -7
7562
  e = s & ((1 << (-nBits)) - 1)
7563
  s >>= (-nBits)
7564
  nBits += eLen
7565
+ for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
7566
 
7567
  m = e & ((1 << (-nBits)) - 1)
7568
  e >>= (-nBits)
7569
  nBits += mLen
7570
+ for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
7571
 
7572
  if (e === 0) {
7573
  e = 1 - eBias
7582
 
7583
  exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
7584
  var e, m, c
7585
+ var eLen = nBytes * 8 - mLen - 1
7586
  var eMax = (1 << eLen) - 1
7587
  var eBias = eMax >> 1
7588
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
7615
  m = 0
7616
  e = eMax
7617
  } else if (e + eBias >= 1) {
7618
+ m = (value * c - 1) * Math.pow(2, mLen)
7619
  e = e + eBias
7620
  } else {
7621
  m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
8890
  /***/ 502:
8891
  /***/ function(module, exports, __webpack_require__) {
8892
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8893
  'use strict';
8894
 
 
 
8895
  var Buffer = __webpack_require__(503).Buffer;
 
8896
 
8897
  var isEncoding = Buffer.isEncoding || function (encoding) {
8898
  encoding = '' + encoding;
9004
  };
9005
 
9006
  // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
9007
+ // continuation byte.
9008
  function utf8CheckByte(byte) {
9009
  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
9010
+ return -1;
9011
  }
9012
 
9013
  // Checks at most 3 bytes at the end of a Buffer in order to detect an
9021
  if (nb > 0) self.lastNeed = nb - 1;
9022
  return nb;
9023
  }
9024
+ if (--j < i) return 0;
9025
  nb = utf8CheckByte(buf[j]);
9026
  if (nb >= 0) {
9027
  if (nb > 0) self.lastNeed = nb - 2;
9028
  return nb;
9029
  }
9030
+ if (--j < i) return 0;
9031
  nb = utf8CheckByte(buf[j]);
9032
  if (nb >= 0) {
9033
  if (nb > 0) {
9041
  // Validates as many continuation bytes for a multi-byte UTF-8 character as
9042
  // needed or are available. If we see a non-continuation byte where we expect
9043
  // one, we "replace" the validated continuation bytes we've seen so far with
9044
+ // UTF-8 replacement characters ('\ufffd'), to match v8's UTF-8 decoding
9045
  // behavior. The continuation byte check is included three times in the case
9046
  // where all of the continuation bytes for a character exist in the same buffer.
9047
  // It is also done this way as a slight performance increase instead of using a
9049
  function utf8CheckExtraBytes(self, buf, p) {
9050
  if ((buf[0] & 0xC0) !== 0x80) {
9051
  self.lastNeed = 0;
9052
+ return '\ufffd'.repeat(p);
9053
  }
9054
  if (self.lastNeed > 1 && buf.length > 1) {
9055
  if ((buf[1] & 0xC0) !== 0x80) {
9056
  self.lastNeed = 1;
9057
+ return '\ufffd'.repeat(p + 1);
9058
  }
9059
  if (self.lastNeed > 2 && buf.length > 2) {
9060
  if ((buf[2] & 0xC0) !== 0x80) {
9061
  self.lastNeed = 2;
9062
+ return '\ufffd'.repeat(p + 2);
9063
  }
9064
  }
9065
  }
9090
  return buf.toString('utf8', i, end);
9091
  }
9092
 
9093
+ // For UTF-8, a replacement character for each buffered byte of a (partial)
9094
+ // character needs to be added to the output.
9095
  function utf8End(buf) {
9096
  var r = buf && buf.length ? this.write(buf) : '';
9097
+ if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed);
9098
  return r;
9099
  }
9100
 
9949
 
9950
  function findAll(test, rootElems){
9951
  var result = [];
9952
+ var stack = [rootElems];
9953
  while(stack.length){
9954
+ var elems = stack.pop();
9955
+ for(var i = 0, j = elems.length; i < j; i++){
9956
+ if(!isTag(elems[i])) continue;
9957
+ if(test(elems[i])) result.push(elems[i]);
9958
+ }
9959
+ while(j-- > 0){
9960
+ if(elems[j].children && elems[j].children.length > 0){
9961
+ stack.push(elems[j].children);
9962
+ }
9963
  }
 
9964
  }
9965
  return result;
9966
  }
assets/js/{admin_vendor.b19a9487.js → admin_vendor.016e33b8.js} RENAMED
@@ -22678,10 +22678,12 @@ webpackJsonp([1],[
22678
  /***/ function(module, exports, __webpack_require__) {
22679
 
22680
  /* WEBPACK VAR INJECTION */(function(process) {/**
22681
- * Copyright (c) 2013-present, Facebook, Inc.
 
22682
  *
22683
- * This source code is licensed under the MIT license found in the
22684
- * LICENSE file in the root directory of this source tree.
 
22685
  */
22686
 
22687
  'use strict';
@@ -23222,27 +23224,6 @@ webpackJsonp([1],[
23222
  */
23223
  componentWillUnmount: 'DEFINE_MANY',
23224
 
23225
- /**
23226
- * Replacement for (deprecated) `componentWillMount`.
23227
- *
23228
- * @optional
23229
- */
23230
- UNSAFE_componentWillMount: 'DEFINE_MANY',
23231
-
23232
- /**
23233
- * Replacement for (deprecated) `componentWillReceiveProps`.
23234
- *
23235
- * @optional
23236
- */
23237
- UNSAFE_componentWillReceiveProps: 'DEFINE_MANY',
23238
-
23239
- /**
23240
- * Replacement for (deprecated) `componentWillUpdate`.
23241
- *
23242
- * @optional
23243
- */
23244
- UNSAFE_componentWillUpdate: 'DEFINE_MANY',
23245
-
23246
  // ==== Advanced methods ====
23247
 
23248
  /**
@@ -23258,23 +23239,6 @@ webpackJsonp([1],[
23258
  updateComponent: 'OVERRIDE_BASE'
23259
  };
23260
 
23261
- /**
23262
- * Similar to ReactClassInterface but for static methods.
23263
- */
23264
- var ReactClassStaticInterface = {
23265
- /**
23266
- * This method is invoked after a component is instantiated and when it
23267
- * receives new props. Return an object to update state in response to
23268
- * prop changes. Return null to indicate no change to state.
23269
- *
23270
- * If an object is returned, its keys will be merged into the existing state.
23271
- *
23272
- * @return {object || null}
23273
- * @optional
23274
- */
23275
- getDerivedStateFromProps: 'DEFINE_MANY_MERGED'
23276
- };
23277
-
23278
  /**
23279
  * Mapping from class specification keys to special processing functions.
23280
  *
@@ -23509,7 +23473,6 @@ webpackJsonp([1],[
23509
  if (!statics) {
23510
  return;
23511
  }
23512
-
23513
  for (var name in statics) {
23514
  var property = statics[name];
23515
  if (!statics.hasOwnProperty(name)) {
@@ -23526,25 +23489,14 @@ webpackJsonp([1],[
23526
  name
23527
  );
23528
 
23529
- var isAlreadyDefined = name in Constructor;
23530
- if (isAlreadyDefined) {
23531
- var specPolicy = ReactClassStaticInterface.hasOwnProperty(name)
23532
- ? ReactClassStaticInterface[name]
23533
- : null;
23534
-
23535
- _invariant(
23536
- specPolicy === 'DEFINE_MANY_MERGED',
23537
- 'ReactClass: You are attempting to define ' +
23538
- '`%s` on your component more than once. This conflict may be ' +
23539
- 'due to a mixin.',
23540
- name
23541
- );
23542
-
23543
- Constructor[name] = createMergedResultFunction(Constructor[name], property);
23544
-
23545
- return;
23546
- }
23547
-
23548
  Constructor[name] = property;
23549
  }
23550
  }
@@ -23854,12 +23806,6 @@ webpackJsonp([1],[
23854
  'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?',
23855
  spec.displayName || 'A component'
23856
  );
23857
- warning(
23858
- !Constructor.prototype.UNSAFE_componentWillRecieveProps,
23859
- '%s has a method called UNSAFE_componentWillRecieveProps(). ' +
23860
- 'Did you mean UNSAFE_componentWillReceiveProps()?',
23861
- spec.displayName || 'A component'
23862
- );
23863
  }
23864
 
23865
  // Reduce time spent doing lookups by setting these on the prototype.
@@ -59326,9 +59272,9 @@ webpackJsonp([1],[
59326
  var content = void 0;
59327
  if (getContent) {
59328
  if (Array.isArray(getContent)) {
59329
- content = getContent[0] && getContent[0](this.state.originTooltip);
59330
  } else {
59331
- content = getContent(this.state.originTooltip);
59332
  }
59333
  }
59334
 
22678
  /***/ function(module, exports, __webpack_require__) {
22679
 
22680
  /* WEBPACK VAR INJECTION */(function(process) {/**
22681
+ * Copyright 2013-2015, Facebook, Inc.
22682
+ * All rights reserved.
22683
  *
22684
+ * This source code is licensed under the BSD-style license found in the
22685
+ * LICENSE file in the root directory of this source tree. An additional grant
22686
+ * of patent rights can be found in the PATENTS file in the same directory.
22687
  */
22688
 
22689
  'use strict';
23224
  */
23225
  componentWillUnmount: 'DEFINE_MANY',
23226
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23227
  // ==== Advanced methods ====
23228
 
23229
  /**
23239
  updateComponent: 'OVERRIDE_BASE'
23240
  };
23241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23242
  /**
23243
  * Mapping from class specification keys to special processing functions.
23244
  *
23473
  if (!statics) {
23474
  return;
23475
  }
 
23476
  for (var name in statics) {
23477
  var property = statics[name];
23478
  if (!statics.hasOwnProperty(name)) {
23489
  name
23490
  );
23491
 
23492
+ var isInherited = name in Constructor;
23493
+ _invariant(
23494
+ !isInherited,
23495
+ 'ReactClass: You are attempting to define ' +
23496
+ '`%s` on your component more than once. This conflict may be ' +
23497
+ 'due to a mixin.',
23498
+ name
23499
+ );
 
 
 
 
 
 
 
 
 
 
 
23500
  Constructor[name] = property;
23501
  }
23502
  }
23806
  'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?',
23807
  spec.displayName || 'A component'
23808
  );
 
 
 
 
 
 
23809
  }
23810
 
23811
  // Reduce time spent doing lookups by setting these on the prototype.
59272
  var content = void 0;
59273
  if (getContent) {
59274
  if (Array.isArray(getContent)) {
59275
+ content = getContent[0] && getContent[0]();
59276
  } else {
59277
+ content = getContent();
59278
  }
59279
  }
59280
 
assets/js/{form_editor.f475a2b0.js → form_editor.b2d3a84e.js} RENAMED
@@ -1938,16 +1938,6 @@ webpackJsonp([2],{
1938
  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }
1939
  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }
1940
 
1941
- function collapsedSpanAround(line, ch) {
1942
- var sps = sawCollapsedSpans && line.markedSpans, found;
1943
- if (sps) { for (var i = 0; i < sps.length; ++i) {
1944
- var sp = sps[i];
1945
- if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&
1946
- (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }
1947
- } }
1948
- return found
1949
- }
1950
-
1951
  // Test whether there exists a collapsed span that partially
1952
  // overlaps (covers the start or end, but not both) of a new span.
1953
  // Such overlap is not allowed.
@@ -3982,11 +3972,12 @@ webpackJsonp([2],{
3982
  var lineObj = getLine(doc, lineN);
3983
  for (;;) {
3984
  var found = coordsCharInner(cm, lineObj, lineN, x, y);
3985
- var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 ? 1 : 0));
3986
- if (!collapsed) { return found }
3987
- var rangeEnd = collapsed.find(1);
3988
- if (rangeEnd.line == lineN) { return rangeEnd }
3989
- lineObj = getLine(doc, lineN = rangeEnd.line);
 
3990
  }
3991
  }
3992
 
@@ -4746,7 +4737,6 @@ webpackJsonp([2],{
4746
  this.cm = cm;
4747
  var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
4748
  var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
4749
- vert.tabIndex = horiz.tabIndex = -1;
4750
  place(vert); place(horiz);
4751
 
4752
  on(vert, "scroll", function () {
@@ -8690,7 +8680,7 @@ webpackJsonp([2],{
8690
  }
8691
 
8692
  var move = operation(cm, function (e) {
8693
- if (e.buttons === 0 || !e_button(e)) { done(e); }
8694
  else { extend(e); }
8695
  });
8696
  var up = operation(cm, done);
@@ -9969,12 +9959,8 @@ webpackJsonp([2],{
9969
  this.showMultipleSelections(info);
9970
  };
9971
 
9972
- ContentEditableInput.prototype.getSelection = function () {
9973
- return this.cm.display.wrapper.ownerDocument.getSelection()
9974
- };
9975
-
9976
  ContentEditableInput.prototype.showPrimarySelection = function () {
9977
- var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();
9978
  var from = prim.from(), to = prim.to();
9979
 
9980
  if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {
@@ -10041,13 +10027,13 @@ webpackJsonp([2],{
10041
  };
10042
 
10043
  ContentEditableInput.prototype.rememberSelection = function () {
10044
- var sel = this.getSelection();
10045
  this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;
10046
  this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;
10047
  };
10048
 
10049
  ContentEditableInput.prototype.selectionInEditor = function () {
10050
- var sel = this.getSelection();
10051
  if (!sel.rangeCount) { return false }
10052
  var node = sel.getRangeAt(0).commonAncestorContainer;
10053
  return contains(this.div, node)
@@ -10082,14 +10068,14 @@ webpackJsonp([2],{
10082
  };
10083
 
10084
  ContentEditableInput.prototype.selectionChanged = function () {
10085
- var sel = this.getSelection();
10086
  return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
10087
  sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset
10088
  };
10089
 
10090
  ContentEditableInput.prototype.pollSelection = function () {
10091
  if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }
10092
- var sel = this.getSelection(), cm = this.cm;
10093
  // On Android Chrome (version 56, at least), backspacing into an
10094
  // uneditable block element will put the cursor in that element,
10095
  // and then, because it's not editable, hide the virtual keyboard.
@@ -10263,13 +10249,12 @@ webpackJsonp([2],{
10263
  function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }
10264
 
10265
  function domTextBetween(cm, from, to, fromLine, toLine) {
10266
- var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;
10267
  function recognizeMarker(id) { return function (marker) { return marker.id == id; } }
10268
  function close() {
10269
  if (closing) {
10270
  text += lineSep;
10271
- if (extraLinebreak) { text += lineSep; }
10272
- closing = extraLinebreak = false;
10273
  }
10274
  }
10275
  function addText(str) {
@@ -10281,8 +10266,8 @@ webpackJsonp([2],{
10281
  function walk(node) {
10282
  if (node.nodeType == 1) {
10283
  var cmText = node.getAttribute("cm-text");
10284
- if (cmText) {
10285
- addText(cmText);
10286
  return
10287
  }
10288
  var markerID = node.getAttribute("cm-marker"), range$$1;
@@ -10293,24 +10278,19 @@ webpackJsonp([2],{
10293
  return
10294
  }
10295
  if (node.getAttribute("contenteditable") == "false") { return }
10296
- var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);
10297
- if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }
10298
-
10299
  if (isBlock) { close(); }
10300
  for (var i = 0; i < node.childNodes.length; i++)
10301
  { walk(node.childNodes[i]); }
10302
-
10303
- if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }
10304
  if (isBlock) { closing = true; }
10305
  } else if (node.nodeType == 3) {
10306
- addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " "));
10307
  }
10308
  }
10309
  for (;;) {
10310
  walk(from);
10311
  if (from == to) { break }
10312
  from = from.nextSibling;
10313
- extraLinebreak = false;
10314
  }
10315
  return text
10316
  }
@@ -10882,7 +10862,7 @@ webpackJsonp([2],{
10882
 
10883
  addLegacyProps(CodeMirror$1);
10884
 
10885
- CodeMirror$1.version = "5.38.0";
10886
 
10887
  return CodeMirror$1;
10888
 
1938
  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }
1939
  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }
1940
 
 
 
 
 
 
 
 
 
 
 
1941
  // Test whether there exists a collapsed span that partially
1942
  // overlaps (covers the start or end, but not both) of a new span.
1943
  // Such overlap is not allowed.
3972
  var lineObj = getLine(doc, lineN);
3973
  for (;;) {
3974
  var found = coordsCharInner(cm, lineObj, lineN, x, y);
3975
+ var merged = collapsedSpanAtEnd(lineObj);
3976
+ var mergedPos = merged && merged.find(0, true);
3977
+ if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
3978
+ { lineN = lineNo(lineObj = mergedPos.to.line); }
3979
+ else
3980
+ { return found }
3981
  }
3982
  }
3983
 
4737
  this.cm = cm;
4738
  var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
4739
  var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
 
4740
  place(vert); place(horiz);
4741
 
4742
  on(vert, "scroll", function () {
8680
  }
8681
 
8682
  var move = operation(cm, function (e) {
8683
+ if (!e_button(e)) { done(e); }
8684
  else { extend(e); }
8685
  });
8686
  var up = operation(cm, done);
9959
  this.showMultipleSelections(info);
9960
  };
9961
 
 
 
 
 
9962
  ContentEditableInput.prototype.showPrimarySelection = function () {
9963
+ var sel = window.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();
9964
  var from = prim.from(), to = prim.to();
9965
 
9966
  if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {
10027
  };
10028
 
10029
  ContentEditableInput.prototype.rememberSelection = function () {
10030
+ var sel = window.getSelection();
10031
  this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;
10032
  this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;
10033
  };
10034
 
10035
  ContentEditableInput.prototype.selectionInEditor = function () {
10036
+ var sel = window.getSelection();
10037
  if (!sel.rangeCount) { return false }
10038
  var node = sel.getRangeAt(0).commonAncestorContainer;
10039
  return contains(this.div, node)
10068
  };
10069
 
10070
  ContentEditableInput.prototype.selectionChanged = function () {
10071
+ var sel = window.getSelection();
10072
  return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
10073
  sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset
10074
  };
10075
 
10076
  ContentEditableInput.prototype.pollSelection = function () {
10077
  if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }
10078
+ var sel = window.getSelection(), cm = this.cm;
10079
  // On Android Chrome (version 56, at least), backspacing into an
10080
  // uneditable block element will put the cursor in that element,
10081
  // and then, because it's not editable, hide the virtual keyboard.
10249
  function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }
10250
 
10251
  function domTextBetween(cm, from, to, fromLine, toLine) {
10252
+ var text = "", closing = false, lineSep = cm.doc.lineSeparator();
10253
  function recognizeMarker(id) { return function (marker) { return marker.id == id; } }
10254
  function close() {
10255
  if (closing) {
10256
  text += lineSep;
10257
+ closing = false;
 
10258
  }
10259
  }
10260
  function addText(str) {
10266
  function walk(node) {
10267
  if (node.nodeType == 1) {
10268
  var cmText = node.getAttribute("cm-text");
10269
+ if (cmText != null) {
10270
+ addText(cmText || node.textContent.replace(/\u200b/g, ""));
10271
  return
10272
  }
10273
  var markerID = node.getAttribute("cm-marker"), range$$1;
10278
  return
10279
  }
10280
  if (node.getAttribute("contenteditable") == "false") { return }
10281
+ var isBlock = /^(pre|div|p)$/i.test(node.nodeName);
 
 
10282
  if (isBlock) { close(); }
10283
  for (var i = 0; i < node.childNodes.length; i++)
10284
  { walk(node.childNodes[i]); }
 
 
10285
  if (isBlock) { closing = true; }
10286
  } else if (node.nodeType == 3) {
10287
+ addText(node.nodeValue);
10288
  }
10289
  }
10290
  for (;;) {
10291
  walk(from);
10292
  if (from == to) { break }
10293
  from = from.nextSibling;
 
10294
  }
10295
  return text
10296
  }
10862
 
10863
  addLegacyProps(CodeMirror$1);
10864
 
10865
+ CodeMirror$1.version = "5.37.0";
10866
 
10867
  return CodeMirror$1;
10868
 
assets/js/lib/mailpoet_shortcodes/plugin.js CHANGED
@@ -8,34 +8,33 @@
8
  * its placeholder into editor text.
9
  */
10
 
11
- /* jshint unused:false */
12
- /* global tinymce:true */
13
- tinymce.PluginManager.add('mailpoet_shortcodes', function tinyMceAdd(editor) {
14
- var appendLabelAndClose = function appendLabelAndCLose(shortcode) {
15
- editor.insertContent(shortcode);
16
- editor.windowManager.close();
17
- };
18
- var generateOnClickFunc = function generateOnClickFunc(shortcode) {
19
- return function appendAndClose() {
20
- appendLabelAndClose(shortcode);
 
21
  };
22
- };
23
 
24
  editor.addButton('mailpoet_shortcodes', {
25
  icon: 'mailpoet_shortcodes',
26
- onclick: function onClick() {
27
- var shortcodes = [];
28
- var configShortcodes = editor.settings.mailpoet_shortcodes;
29
- var i;
30
 
31
- Object.keys(configShortcodes).forEach(function configShortcodesLoop(segment) {
32
- if (Object.prototype.hasOwnProperty.call(configShortcodes, segment)) {
33
  shortcodes.push({
34
  type: 'label',
35
  text: segment
36
  });
37
 
38
- for (i = 0; i < configShortcodes[segment].length; i += 1) {
39
  shortcodes.push({
40
  type: 'button',
41
  text: configShortcodes[segment][i].text,
@@ -43,12 +42,12 @@ tinymce.PluginManager.add('mailpoet_shortcodes', function tinyMceAdd(editor) {
43
  });
44
  }
45
  }
46
- });
47
 
48
  // Open window
49
  editor.windowManager.open({
50
- height: parseInt(editor.getParam('plugin_mailpoet_shortcodes_height', 400), 10),
51
- width: parseInt(editor.getParam('plugin_mailpoet_shortcodes_width', 450), 10),
52
  autoScroll: true,
53
  title: editor.settings.mailpoet_shortcodes_window_title,
54
  body: shortcodes,
8
  * its placeholder into editor text.
9
  */
10
 
11
+ /*jshint unused:false */
12
+ /*global tinymce:true */
13
+ tinymce.PluginManager.add('mailpoet_shortcodes', function(editor, url) {
14
+ var appendLabelAndClose = function(shortcode) {
15
+ editor.insertContent(shortcode);
16
+ editor.windowManager.close();
17
+ },
18
+ generateOnClickFunc = function(shortcode) {
19
+ return function() {
20
+ appendLabelAndClose(shortcode);
21
+ };
22
  };
 
23
 
24
  editor.addButton('mailpoet_shortcodes', {
25
  icon: 'mailpoet_shortcodes',
26
+ onclick: function() {
27
+ var shortcodes = [],
28
+ configShortcodes = editor.settings.mailpoet_shortcodes;
 
29
 
30
+ for (var segment in configShortcodes) {
31
+ if (configShortcodes.hasOwnProperty(segment)) {
32
  shortcodes.push({
33
  type: 'label',
34
  text: segment
35
  });
36
 
37
+ for (var i = 0; i < configShortcodes[segment].length; i += 1) {
38
  shortcodes.push({
39
  type: 'button',
40
  text: configShortcodes[segment][i].text,
42
  });
43
  }
44
  }
45
+ }
46
 
47
  // Open window
48
  editor.windowManager.open({
49
+ height: parseInt(editor.getParam('plugin_mailpoet_shortcodes_height', 400)),
50
+ width: parseInt(editor.getParam('plugin_mailpoet_shortcodes_width', 450)),
51
  autoScroll: true,
52
  title: editor.settings.mailpoet_shortcodes_window_title,
53
  body: shortcodes,
assets/js/{mailpoet.7070ca4a.js → mailpoet.f26c86e7.js} RENAMED
@@ -40946,9 +40946,9 @@ webpackJsonp([3],[
40946
  var content = void 0;
40947
  if (getContent) {
40948
  if (Array.isArray(getContent)) {
40949
- content = getContent[0] && getContent[0](this.state.originTooltip);
40950
  } else {
40951
- content = getContent(this.state.originTooltip);
40952
  }
40953
  }
40954
 
@@ -43916,7 +43916,7 @@ webpackJsonp([3],[
43916
 
43917
  var elem = this._tagStack.pop();
43918
 
43919
- if(this._options.withEndIndices && elem){
43920
  elem.endIndex = this._parser.endIndex;
43921
  }
43922
 
@@ -47274,102 +47274,68 @@ webpackJsonp([3],[
47274
  revLookup[code.charCodeAt(i)] = i
47275
  }
47276
 
47277
- // Support decoding URL-safe base64 strings, as Node.js does.
47278
- // See: https://en.wikipedia.org/wiki/Base64#URL_applications
47279
  revLookup['-'.charCodeAt(0)] = 62
47280
  revLookup['_'.charCodeAt(0)] = 63
47281
 
47282
- function getLens (b64) {
47283
  var len = b64.length
47284
-
47285
  if (len % 4 > 0) {
47286
  throw new Error('Invalid string. Length must be a multiple of 4')
47287
  }
47288
 
47289
- // Trim off extra bytes after placeholder bytes are found
47290
- // See: https://github.com/beatgammit/base64-js/issues/42
47291
- var validLen = b64.indexOf('=')
47292
- if (validLen === -1) validLen = len
47293
-
47294
- var placeHoldersLen = validLen === len
47295
- ? 0
47296
- : 4 - (validLen % 4)
47297
-
47298
- return [validLen, placeHoldersLen]
47299
  }
47300
 
47301
- // base64 is 4/3 + up to two characters of the original data
47302
  function byteLength (b64) {
47303
- var lens = getLens(b64)
47304
- var validLen = lens[0]
47305
- var placeHoldersLen = lens[1]
47306
- return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
47307
- }
47308
-
47309
- function _byteLength (b64, validLen, placeHoldersLen) {
47310
- return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
47311
  }
47312
 
47313
  function toByteArray (b64) {
47314
- var tmp
47315
- var lens = getLens(b64)
47316
- var validLen = lens[0]
47317
- var placeHoldersLen = lens[1]
47318
-
47319
- var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
47320
 
47321
- var curByte = 0
47322
 
47323
  // if there are placeholders, only get up to the last complete 4 chars
47324
- var len = placeHoldersLen > 0
47325
- ? validLen - 4
47326
- : validLen
47327
 
47328
- for (var i = 0; i < len; i += 4) {
47329
- tmp =
47330
- (revLookup[b64.charCodeAt(i)] << 18) |
47331
- (revLookup[b64.charCodeAt(i + 1)] << 12) |
47332
- (revLookup[b64.charCodeAt(i + 2)] << 6) |
47333
- revLookup[b64.charCodeAt(i + 3)]
47334
- arr[curByte++] = (tmp >> 16) & 0xFF
47335
- arr[curByte++] = (tmp >> 8) & 0xFF
47336
- arr[curByte++] = tmp & 0xFF
47337
- }
47338
 
47339
- if (placeHoldersLen === 2) {
47340
- tmp =
47341
- (revLookup[b64.charCodeAt(i)] << 2) |
47342
- (revLookup[b64.charCodeAt(i + 1)] >> 4)
47343
- arr[curByte++] = tmp & 0xFF
47344
  }
47345
 
47346
- if (placeHoldersLen === 1) {
47347
- tmp =
47348
- (revLookup[b64.charCodeAt(i)] << 10) |
47349
- (revLookup[b64.charCodeAt(i + 1)] << 4) |
47350
- (revLookup[b64.charCodeAt(i + 2)] >> 2)
47351
- arr[curByte++] = (tmp >> 8) & 0xFF
47352
- arr[curByte++] = tmp & 0xFF
47353
  }
47354
 
47355
  return arr
47356
  }
47357
 
47358
  function tripletToBase64 (num) {
47359
- return lookup[num >> 18 & 0x3F] +
47360
- lookup[num >> 12 & 0x3F] +
47361
- lookup[num >> 6 & 0x3F] +
47362
- lookup[num & 0x3F]
47363
  }
47364
 
47365
  function encodeChunk (uint8, start, end) {
47366
  var tmp
47367
  var output = []
47368
  for (var i = start; i < end; i += 3) {
47369
- tmp =
47370
- ((uint8[i] << 16) & 0xFF0000) +
47371
- ((uint8[i + 1] << 8) & 0xFF00) +
47372
- (uint8[i + 2] & 0xFF)
47373
  output.push(tripletToBase64(tmp))
47374
  }
47375
  return output.join('')
@@ -47379,34 +47345,31 @@ webpackJsonp([3],[
47379
  var tmp
47380
  var len = uint8.length
47381
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
 
47382
  var parts = []
47383
  var maxChunkLength = 16383 // must be multiple of 3
47384
 
47385
  // go through the array every three bytes, we'll deal with trailing stuff later
47386
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
47387
- parts.push(encodeChunk(
47388
- uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
47389
- ))
47390
  }
47391
 
47392
  // pad the end with zeros, but make sure to not forget the extra bytes
47393
  if (extraBytes === 1) {
47394
  tmp = uint8[len - 1]
47395
- parts.push(
47396
- lookup[tmp >> 2] +
47397
- lookup[(tmp << 4) & 0x3F] +
47398
- '=='
47399
- )
47400
  } else if (extraBytes === 2) {
47401
- tmp = (uint8[len - 2] << 8) + uint8[len - 1]
47402
- parts.push(
47403
- lookup[tmp >> 10] +
47404
- lookup[(tmp >> 4) & 0x3F] +
47405
- lookup[(tmp << 2) & 0x3F] +
47406
- '='
47407
- )
47408
  }
47409
 
 
 
47410
  return parts.join('')
47411
  }
47412
 
@@ -47417,7 +47380,7 @@ webpackJsonp([3],[
47417
 
47418
  exports.read = function (buffer, offset, isLE, mLen, nBytes) {
47419
  var e, m
47420
- var eLen = (nBytes * 8) - mLen - 1
47421
  var eMax = (1 << eLen) - 1
47422
  var eBias = eMax >> 1
47423
  var nBits = -7
@@ -47430,12 +47393,12 @@ webpackJsonp([3],[
47430
  e = s & ((1 << (-nBits)) - 1)
47431
  s >>= (-nBits)
47432
  nBits += eLen
47433
- for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
47434
 
47435
  m = e & ((1 << (-nBits)) - 1)
47436
  e >>= (-nBits)
47437
  nBits += mLen
47438
- for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
47439
 
47440
  if (e === 0) {
47441
  e = 1 - eBias
@@ -47450,7 +47413,7 @@ webpackJsonp([3],[
47450
 
47451
  exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
47452
  var e, m, c
47453
- var eLen = (nBytes * 8) - mLen - 1
47454
  var eMax = (1 << eLen) - 1
47455
  var eBias = eMax >> 1
47456
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
@@ -47483,7 +47446,7 @@ webpackJsonp([3],[
47483
  m = 0
47484
  e = eMax
47485
  } else if (e + eBias >= 1) {
47486
- m = ((value * c) - 1) * Math.pow(2, mLen)
47487
  e = e + eBias
47488
  } else {
47489
  m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
@@ -48744,33 +48707,9 @@ webpackJsonp([3],[
48744
  /* 502 */
48745
  /***/ function(module, exports, __webpack_require__) {
48746
 
48747
- // Copyright Joyent, Inc. and other Node contributors.
48748
- //
48749
- // Permission is hereby granted, free of charge, to any person obtaining a
48750
- // copy of this software and associated documentation files (the
48751
- // "Software"), to deal in the Software without restriction, including
48752
- // without limitation the rights to use, copy, modify, merge, publish,
48753
- // distribute, sublicense, and/or sell copies of the Software, and to permit
48754
- // persons to whom the Software is furnished to do so, subject to the
48755
- // following conditions:
48756
- //
48757
- // The above copyright notice and this permission notice shall be included
48758
- // in all copies or substantial portions of the Software.
48759
- //
48760
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
48761
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
48762
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
48763
- // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
48764
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
48765
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
48766
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
48767
-
48768
  'use strict';
48769
 
48770
- /*<replacement>*/
48771
-
48772
  var Buffer = __webpack_require__(503).Buffer;
48773
- /*</replacement>*/
48774
 
48775
  var isEncoding = Buffer.isEncoding || function (encoding) {
48776
  encoding = '' + encoding;
@@ -48882,10 +48821,10 @@ webpackJsonp([3],[
48882
  };
48883
 
48884
  // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
48885
- // continuation byte. If an invalid byte is detected, -2 is returned.
48886
  function utf8CheckByte(byte) {
48887
  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
48888
- return byte >> 6 === 0x02 ? -1 : -2;
48889
  }
48890
 
48891
  // Checks at most 3 bytes at the end of a Buffer in order to detect an
@@ -48899,13 +48838,13 @@ webpackJsonp([3],[
48899
  if (nb > 0) self.lastNeed = nb - 1;
48900
  return nb;
48901
  }
48902
- if (--j < i || nb === -2) return 0;
48903
  nb = utf8CheckByte(buf[j]);
48904
  if (nb >= 0) {
48905
  if (nb > 0) self.lastNeed = nb - 2;
48906
  return nb;
48907
  }
48908
- if (--j < i || nb === -2) return 0;
48909
  nb = utf8CheckByte(buf[j]);
48910
  if (nb >= 0) {
48911
  if (nb > 0) {
@@ -48919,7 +48858,7 @@ webpackJsonp([3],[
48919
  // Validates as many continuation bytes for a multi-byte UTF-8 character as
48920
  // needed or are available. If we see a non-continuation byte where we expect
48921
  // one, we "replace" the validated continuation bytes we've seen so far with
48922
- // a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
48923
  // behavior. The continuation byte check is included three times in the case
48924
  // where all of the continuation bytes for a character exist in the same buffer.
48925
  // It is also done this way as a slight performance increase instead of using a
@@ -48927,17 +48866,17 @@ webpackJsonp([3],[
48927
  function utf8CheckExtraBytes(self, buf, p) {
48928
  if ((buf[0] & 0xC0) !== 0x80) {
48929
  self.lastNeed = 0;
48930
- return '\ufffd';
48931
  }
48932
  if (self.lastNeed > 1 && buf.length > 1) {
48933
  if ((buf[1] & 0xC0) !== 0x80) {
48934
  self.lastNeed = 1;
48935
- return '\ufffd';
48936
  }
48937
  if (self.lastNeed > 2 && buf.length > 2) {
48938
  if ((buf[2] & 0xC0) !== 0x80) {
48939
  self.lastNeed = 2;
48940
- return '\ufffd';
48941
  }
48942
  }
48943
  }
@@ -48968,11 +48907,11 @@ webpackJsonp([3],[
48968
  return buf.toString('utf8', i, end);
48969
  }
48970
 
48971
- // For UTF-8, a replacement character is added when ending on a partial
48972
- // character.
48973
  function utf8End(buf) {
48974
  var r = buf && buf.length ? this.write(buf) : '';
48975
- if (this.lastNeed) return r + '\ufffd';
48976
  return r;
48977
  }
48978
 
@@ -49789,14 +49728,18 @@ webpackJsonp([3],[
49789
 
49790
  function findAll(test, rootElems){
49791
  var result = [];
49792
- var stack = rootElems.slice();
49793
  while(stack.length){
49794
- var elem = stack.shift();
49795
- if(!isTag(elem)) continue;
49796
- if (elem.children && elem.children.length > 0) {
49797
- stack.unshift.apply(stack, elem.children);
 
 
 
 
 
49798
  }
49799
- if(test(elem)) result.push(elem);
49800
  }
49801
  return result;
49802
  }
40946
  var content = void 0;
40947
  if (getContent) {
40948
  if (Array.isArray(getContent)) {
40949
+ content = getContent[0] && getContent[0]();
40950
  } else {
40951
+ content = getContent();
40952
  }
40953
  }
40954
 
43916
 
43917
  var elem = this._tagStack.pop();
43918
 
43919
+ if(this._options.withEndIndices){
43920
  elem.endIndex = this._parser.endIndex;
43921
  }
43922
 
47274
  revLookup[code.charCodeAt(i)] = i
47275
  }
47276
 
 
 
47277
  revLookup['-'.charCodeAt(0)] = 62
47278
  revLookup['_'.charCodeAt(0)] = 63
47279
 
47280
+ function placeHoldersCount (b64) {
47281
  var len = b64.length
 
47282
  if (len % 4 > 0) {
47283
  throw new Error('Invalid string. Length must be a multiple of 4')
47284
  }
47285
 
47286
+ // the number of equal signs (place holders)
47287
+ // if there are two placeholders, than the two characters before it
47288
+ // represent one byte
47289
+ // if there is only one, then the three characters before it represent 2 bytes
47290
+ // this is just a cheap hack to not do indexOf twice
47291
+ return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
 
 
 
 
47292
  }
47293
 
 
47294
  function byteLength (b64) {
47295
+ // base64 is 4/3 + up to two characters of the original data
47296
+ return (b64.length * 3 / 4) - placeHoldersCount(b64)
 
 
 
 
 
 
47297
  }
47298
 
47299
  function toByteArray (b64) {
47300
+ var i, l, tmp, placeHolders, arr
47301
+ var len = b64.length
47302
+ placeHolders = placeHoldersCount(b64)
 
 
 
47303
 
47304
+ arr = new Arr((len * 3 / 4) - placeHolders)
47305
 
47306
  // if there are placeholders, only get up to the last complete 4 chars
47307
+ l = placeHolders > 0 ? len - 4 : len
 
 
47308
 
47309
+ var L = 0
 
 
 
 
 
 
 
 
 
47310
 
47311
+ for (i = 0; i < l; i += 4) {
47312
+ tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
47313
+ arr[L++] = (tmp >> 16) & 0xFF
47314
+ arr[L++] = (tmp >> 8) & 0xFF
47315
+ arr[L++] = tmp & 0xFF
47316
  }
47317
 
47318
+ if (placeHolders === 2) {
47319
+ tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
47320
+ arr[L++] = tmp & 0xFF
47321
+ } else if (placeHolders === 1) {
47322
+ tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
47323
+ arr[L++] = (tmp >> 8) & 0xFF
47324
+ arr[L++] = tmp & 0xFF
47325
  }
47326
 
47327
  return arr
47328
  }
47329
 
47330
  function tripletToBase64 (num) {
47331
+ return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
 
 
 
47332
  }
47333
 
47334
  function encodeChunk (uint8, start, end) {
47335
  var tmp
47336
  var output = []
47337
  for (var i = start; i < end; i += 3) {
47338
+ tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
 
 
 
47339
  output.push(tripletToBase64(tmp))
47340
  }
47341
  return output.join('')
47345
  var tmp
47346
  var len = uint8.length
47347
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
47348
+ var output = ''
47349
  var parts = []
47350
  var maxChunkLength = 16383 // must be multiple of 3
47351
 
47352
  // go through the array every three bytes, we'll deal with trailing stuff later
47353
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
47354
+ parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
 
 
47355
  }
47356
 
47357
  // pad the end with zeros, but make sure to not forget the extra bytes
47358
  if (extraBytes === 1) {
47359
  tmp = uint8[len - 1]
47360
+ output += lookup[tmp >> 2]
47361
+ output += lookup[(tmp << 4) & 0x3F]
47362
+ output += '=='
 
 
47363
  } else if (extraBytes === 2) {
47364
+ tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
47365
+ output += lookup[tmp >> 10]
47366
+ output += lookup[(tmp >> 4) & 0x3F]
47367
+ output += lookup[(tmp << 2) & 0x3F]
47368
+ output += '='
 
 
47369
  }
47370
 
47371
+ parts.push(output)
47372
+
47373
  return parts.join('')
47374
  }
47375
 
47380
 
47381
  exports.read = function (buffer, offset, isLE, mLen, nBytes) {
47382
  var e, m
47383
+ var eLen = nBytes * 8 - mLen - 1
47384
  var eMax = (1 << eLen) - 1
47385
  var eBias = eMax >> 1
47386
  var nBits = -7
47393
  e = s & ((1 << (-nBits)) - 1)
47394
  s >>= (-nBits)
47395
  nBits += eLen
47396
+ for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
47397
 
47398
  m = e & ((1 << (-nBits)) - 1)
47399
  e >>= (-nBits)
47400
  nBits += mLen
47401
+ for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
47402
 
47403
  if (e === 0) {
47404
  e = 1 - eBias
47413
 
47414
  exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
47415
  var e, m, c
47416
+ var eLen = nBytes * 8 - mLen - 1
47417
  var eMax = (1 << eLen) - 1
47418
  var eBias = eMax >> 1
47419
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
47446
  m = 0
47447
  e = eMax
47448
  } else if (e + eBias >= 1) {
47449
+ m = (value * c - 1) * Math.pow(2, mLen)
47450
  e = e + eBias
47451
  } else {
47452
  m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
48707
  /* 502 */
48708
  /***/ function(module, exports, __webpack_require__) {
48709
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48710
  'use strict';
48711
 
 
 
48712
  var Buffer = __webpack_require__(503).Buffer;
 
48713
 
48714
  var isEncoding = Buffer.isEncoding || function (encoding) {
48715
  encoding = '' + encoding;
48821
  };
48822
 
48823
  // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
48824
+ // continuation byte.
48825
  function utf8CheckByte(byte) {
48826
  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
48827
+ return -1;
48828
  }
48829
 
48830
  // Checks at most 3 bytes at the end of a Buffer in order to detect an
48838
  if (nb > 0) self.lastNeed = nb - 1;
48839
  return nb;
48840
  }
48841
+ if (--j < i) return 0;
48842
  nb = utf8CheckByte(buf[j]);
48843
  if (nb >= 0) {
48844
  if (nb > 0) self.lastNeed = nb - 2;
48845
  return nb;
48846
  }
48847
+ if (--j < i) return 0;
48848
  nb = utf8CheckByte(buf[j]);
48849
  if (nb >= 0) {
48850
  if (nb > 0) {
48858
  // Validates as many continuation bytes for a multi-byte UTF-8 character as
48859
  // needed or are available. If we see a non-continuation byte where we expect
48860
  // one, we "replace" the validated continuation bytes we've seen so far with
48861
+ // UTF-8 replacement characters ('\ufffd'), to match v8's UTF-8 decoding
48862
  // behavior. The continuation byte check is included three times in the case
48863
  // where all of the continuation bytes for a character exist in the same buffer.
48864
  // It is also done this way as a slight performance increase instead of using a
48866
  function utf8CheckExtraBytes(self, buf, p) {
48867
  if ((buf[0] & 0xC0) !== 0x80) {
48868
  self.lastNeed = 0;
48869
+ return '\ufffd'.repeat(p);
48870
  }
48871
  if (self.lastNeed > 1 && buf.length > 1) {
48872
  if ((buf[1] & 0xC0) !== 0x80) {
48873
  self.lastNeed = 1;
48874
+ return '\ufffd'.repeat(p + 1);
48875
  }
48876
  if (self.lastNeed > 2 && buf.length > 2) {
48877
  if ((buf[2] & 0xC0) !== 0x80) {
48878
  self.lastNeed = 2;
48879
+ return '\ufffd'.repeat(p + 2);
48880
  }
48881
  }
48882
  }
48907
  return buf.toString('utf8', i, end);
48908
  }
48909
 
48910
+ // For UTF-8, a replacement character for each buffered byte of a (partial)
48911
+ // character needs to be added to the output.
48912
  function utf8End(buf) {
48913
  var r = buf && buf.length ? this.write(buf) : '';
48914
+ if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed);
48915
  return r;
48916
  }
48917
 
49728
 
49729
  function findAll(test, rootElems){
49730
  var result = [];
49731
+ var stack = [rootElems];
49732
  while(stack.length){
49733
+ var elems = stack.pop();
49734
+ for(var i = 0, j = elems.length; i < j; i++){
49735
+ if(!isTag(elems[i])) continue;
49736
+ if(test(elems[i])) result.push(elems[i]);
49737
+ }
49738
+ while(j-- > 0){
49739
+ if(elems[j].children && elems[j].children.length > 0){
49740
+ stack.push(elems[j].children);
49741
+ }
49742
  }
 
49743
  }
49744
  return result;
49745
  }
assets/js/manifest.json CHANGED
@@ -1,10 +1,10 @@
1
  {
2
  "mp2migrator.js": "mp2migrator.b51cde67.js",
3
  "public.js": "public.5a989b2c.js",
4
- "admin.js": "admin.b1f6f0a0.js",
5
- "admin_vendor.js": "admin_vendor.b19a9487.js",
6
- "form_editor.js": "form_editor.f475a2b0.js",
7
- "mailpoet.js": "mailpoet.7070ca4a.js",
8
- "newsletter_editor.js": "newsletter_editor.69062a08.js",
9
- "vendor.js": "vendor.0b1694bf.js"
10
  }
1
  {
2
  "mp2migrator.js": "mp2migrator.b51cde67.js",
3
  "public.js": "public.5a989b2c.js",
4
+ "admin.js": "admin.a58c3783.js",
5
+ "admin_vendor.js": "admin_vendor.016e33b8.js",
6
+ "form_editor.js": "form_editor.b2d3a84e.js",
7
+ "mailpoet.js": "mailpoet.f26c86e7.js",
8
+ "newsletter_editor.js": "newsletter_editor.1d7b4686.js",
9
+ "vendor.js": "vendor.98a3aa8c.js"
10
  }
assets/js/{newsletter_editor.69062a08.js → newsletter_editor.1d7b4686.js} RENAMED
@@ -1,96 +1,393 @@
1
  webpackJsonp([4],{
2
 
3
- /***/ 611:
4
  /***/ function(module, exports, __webpack_require__) {
5
 
6
- var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
7
- 'use strict';
8
-
9
  !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
10
  __webpack_require__(609),
 
 
 
11
  __webpack_require__(598),
12
  __webpack_require__(600),
13
- __webpack_require__(281)
14
- ], __WEBPACK_AMD_DEFINE_RESULT__ = function (App, Marionette, SuperModel, _) { // eslint-disable-line func-names
 
 
 
 
 
 
 
 
 
 
 
 
15
  var Module = {};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
- Module.StylesModel = SuperModel.extend({
18
- defaults: {
19
- text: {
20
- fontColor: '#000000',
21
- fontFamily: 'Arial',
22
- fontSize: '16px'
23
- },
24
- h1: {
25
- fontColor: '#111111',
26
- fontFamily: 'Arial',
27
- fontSize: '40px'
28
- },
29
- h2: {
30
- fontColor: '#222222',
31
- fontFamily: 'Tahoma',
32
- fontSize: '32px'
33
- },
34
- h3: {
35
- fontColor: '#333333',
36
- fontFamily: 'Verdana',
37
- fontSize: '24px'
38
- },
39
- link: {
40
- fontColor: '#21759B',
41
- textDecoration: 'underline'
42
- },
43
- wrapper: {
44
- backgroundColor: '#ffffff'
45
- },
46
- body: {
47
- backgroundColor: '#cccccc'
48
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  },
50
- initialize: function () { // eslint-disable-line func-names
51
- this.on('change', function () { App.getChannel().trigger('autoSave'); }); // eslint-disable-line func-names
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  }
53
  });
54
 
55
- Module.StylesView = Marionette.View.extend({
56
- getTemplate: function () { return window.templates.styles; }, // eslint-disable-line func-names
57
- modelEvents: {
58
- change: 'render'
 
 
 
 
 
 
 
 
 
 
59
  },
60
- serializeData: function () { // eslint-disable-line func-names
61
- return this.model.toJSON();
 
 
 
 
 
 
 
62
  }
63
  });
64
 
65
- Module._globalStyles = new SuperModel();
66
- Module.getGlobalStyles = function () { // eslint-disable-line func-names
67
- return Module._globalStyles;
68
- };
69
- Module.setGlobalStyles = function (options) { // eslint-disable-line func-names
70
- Module._globalStyles = new Module.StylesModel(options);
71
- return Module._globalStyles;
72
- };
73
- Module.getAvailableStyles = function () { // eslint-disable-line func-names
74
- return App.getConfig().get('availableStyles');
75
- };
76
 
77
- App.on('before:start', function (BeforeStartApp, options) { // eslint-disable-line func-names
78
- var Application = BeforeStartApp;
79
- var body;
80
- var globalStyles;
81
- // Expose style methods to global application
82
- Application.getGlobalStyles = Module.getGlobalStyles;
83
- Application.setGlobalStyles = Module.setGlobalStyles;
84
- Application.getAvailableStyles = Module.getAvailableStyles;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
- body = options.newsletter.body;
87
- globalStyles = (_.has(body, 'globalStyles')) ? body.globalStyles : {};
88
- this.setGlobalStyles(globalStyles);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  });
90
 
91
- App.on('start', function (StartApp) { // eslint-disable-line func-names
92
- var stylesView = new Module.StylesView({ model: StartApp.getGlobalStyles() });
93
- StartApp._appView.showChildView('stylesRegion', stylesView);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  });
95
 
96
  return Module;
@@ -143,7 +440,8 @@ webpackJsonp([4],{
143
  __webpack_require__(635);
144
  __webpack_require__(636);
145
  __webpack_require__(637);
146
- module.exports = __webpack_require__(638);
 
147
 
148
 
149
  /***/ },
@@ -35060,406 +35358,109 @@ webpackJsonp([4],{
35060
 
35061
  /***/ },
35062
 
35063
- /***/ 275:
35064
- /***/ function(module, exports) {
35065
-
35066
- module.exports = jQuery;
35067
-
35068
- /***/ },
35069
-
35070
- /***/ 612:
35071
  /***/ function(module, exports, __webpack_require__) {
35072
 
35073
- var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
 
 
35074
  !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
35075
  __webpack_require__(609),
35076
- __webpack_require__(613),
35077
- __webpack_require__(276),
35078
- __webpack_require__(568),
35079
  __webpack_require__(598),
35080
  __webpack_require__(600),
35081
- __webpack_require__(281),
35082
- __webpack_require__(275)
35083
- ], __WEBPACK_AMD_DEFINE_RESULT__ = function (
35084
- App,
35085
- CommunicationComponent,
35086
- MailPoet,
35087
- Backbone,
35088
- Marionette,
35089
- SuperModel,
35090
- _,
35091
- jQuery
35092
- ) {
35093
- 'use strict';
35094
-
35095
  var Module = {};
35096
- var SidebarView;
35097
- // Widget handlers for use to create new content blocks via drag&drop
35098
- Module._contentWidgets = new (Backbone.Collection.extend({
35099
- model: SuperModel.extend({
35100
- defaults: {
35101
- name: '',
35102
- priority: 100,
35103
- widgetView: undefined
35104
- }
35105
- }),
35106
- comparator: 'priority'
35107
- }))();
35108
- Module.registerWidget = function (widget) { return Module._contentWidgets.add(widget); };
35109
- Module.getWidgets = function () { return Module._contentWidgets; };
35110
 
35111
- // Layout widget handlers for use to create new layout blocks via drag&drop
35112
- Module._layoutWidgets = new (Backbone.Collection.extend({
35113
- model: SuperModel.extend({
35114
- defaults: {
35115
- name: '',
35116
- priority: 100,
35117
- widgetView: undefined
35118
- }
35119
- }),
35120
- comparator: 'priority'
35121
- }))();
35122
- Module.registerLayoutWidget = function (widget) { return Module._layoutWidgets.add(widget); };
35123
- Module.getLayoutWidgets = function () { return Module._layoutWidgets; };
35124
-
35125
- SidebarView = Marionette.View.extend({
35126
- getTemplate: function () { return window.templates.sidebar; },
35127
- regions: {
35128
- contentRegion: '.mailpoet_content_region',
35129
- layoutRegion: '.mailpoet_layout_region',
35130
- stylesRegion: '.mailpoet_styles_region',
35131
- previewRegion: '.mailpoet_preview_region'
35132
- },
35133
- events: {
35134
- 'click .mailpoet_sidebar_region h3, .mailpoet_sidebar_region .handlediv': function (event) {
35135
- var $openRegion = this.$el.find('.mailpoet_sidebar_region:not(.closed)');
35136
- var $targetRegion = this.$el.find(event.target).closest('.mailpoet_sidebar_region');
35137
-
35138
- $openRegion.find('.mailpoet_region_content').velocity(
35139
- 'slideUp',
35140
- {
35141
- duration: 250,
35142
- easing: 'easeOut',
35143
- complete: function () {
35144
- $openRegion.addClass('closed');
35145
- }
35146
- }
35147
- );
35148
-
35149
- if ($openRegion.get(0) !== $targetRegion.get(0)) {
35150
- $targetRegion.find('.mailpoet_region_content').velocity(
35151
- 'slideDown',
35152
- {
35153
- duration: 250,
35154
- easing: 'easeIn',
35155
- complete: function () {
35156
- $targetRegion.removeClass('closed');
35157
- }
35158
- }
35159
- );
35160
- }
35161
  }
35162
  },
35163
- initialize: function () {
35164
- jQuery(window)
35165
- .on('resize', this.updateHorizontalScroll.bind(this))
35166
- .on('scroll', this.updateHorizontalScroll.bind(this));
35167
- },
35168
- onRender: function () {
35169
- this.showChildView('contentRegion', new Module.SidebarWidgetsView(
35170
- App.getWidgets()
35171
- ));
35172
- this.showChildView('layoutRegion', new Module.SidebarLayoutWidgetsView(
35173
- App.getLayoutWidgets()
35174
- ));
35175
- this.showChildView('stylesRegion', new Module.SidebarStylesView({
35176
- model: App.getGlobalStyles(),
35177
- availableStyles: App.getAvailableStyles()
35178
- }));
35179
- this.showChildView('previewRegion', new Module.SidebarPreviewView());
35180
- },
35181
- updateHorizontalScroll: function () {
35182
- // Fixes the sidebar so that on narrower screens the horizontal
35183
- // position of the sidebar would be scrollable and not fixed
35184
- // partially out of visible screen
35185
- this.$el.parent().each(function () {
35186
- var calculatedLeft;
35187
- var self = jQuery(this);
35188
-
35189
- if (self.css('position') === 'fixed') {
35190
- calculatedLeft = self.parent().offset().left - jQuery(window).scrollLeft();
35191
- self.css('left', calculatedLeft + 'px');
35192
- } else {
35193
- self.css('left', '');
35194
- }
35195
- });
35196
- },
35197
- onDomRefresh: function () {
35198
- this.$el.parent().stick_in_parent({
35199
- offset_top: 32
35200
- });
35201
- this.$el.parent().on('sticky_kit:stick', this.updateHorizontalScroll.bind(this));
35202
- this.$el.parent().on('sticky_kit:unstick', this.updateHorizontalScroll.bind(this));
35203
- this.$el.parent().on('sticky_kit:bottom', this.updateHorizontalScroll.bind(this));
35204
- this.$el.parent().on('sticky_kit:unbottom', this.updateHorizontalScroll.bind(this));
35205
- }
35206
- });
35207
-
35208
- /**
35209
- * Draggable widget collection view
35210
- */
35211
- Module.SidebarWidgetsCollectionView = Marionette.CollectionView.extend({
35212
- childView: function (item) { return item.get('widgetView'); }
35213
- });
35214
-
35215
- /**
35216
- * Responsible for rendering draggable content widgets
35217
- */
35218
- Module.SidebarWidgetsView = Marionette.View.extend({
35219
- getTemplate: function () { return window.templates.sidebarContent; },
35220
- regions: {
35221
- widgets: '.mailpoet_region_content'
35222
- },
35223
-
35224
- initialize: function (widgets) {
35225
- this.widgets = widgets;
35226
- },
35227
-
35228
- onRender: function () {
35229
- this.showChildView('widgets', new Module.SidebarWidgetsCollectionView({
35230
- collection: this.widgets
35231
- }));
35232
  }
35233
  });
35234
 
35235
- /**
35236
- * Responsible for rendering draggable layout widgets
35237
- */
35238
- Module.SidebarLayoutWidgetsView = Module.SidebarWidgetsView.extend({
35239
- getTemplate: function () { return window.templates.sidebarLayout; }
35240
- });
35241
-
35242
- /**
35243
- * Responsible for managing global styles
35244
- */
35245
- Module.SidebarStylesView = Marionette.View.extend({
35246
- getTemplate: function () { return window.templates.sidebarStyles; },
35247
- behaviors: {
35248
- ColorPickerBehavior: {}
35249
- },
35250
- events: function () {
35251
- return {
35252
- 'change #mailpoet_text_font_color': _.partial(this.changeColorField, 'text.fontColor'),
35253
- 'change #mailpoet_text_font_family': function (event) {
35254
- this.model.set('text.fontFamily', event.target.value);
35255
- },
35256
- 'change #mailpoet_text_font_size': function (event) {
35257
- this.model.set('text.fontSize', event.target.value);
35258
- },
35259
- 'change #mailpoet_h1_font_color': _.partial(this.changeColorField, 'h1.fontColor'),
35260
- 'change #mailpoet_h1_font_family': function (event) {
35261
- this.model.set('h1.fontFamily', event.target.value);
35262
- },
35263
- 'change #mailpoet_h1_font_size': function (event) {
35264
- this.model.set('h1.fontSize', event.target.value);
35265
- },
35266
- 'change #mailpoet_h2_font_color': _.partial(this.changeColorField, 'h2.fontColor'),
35267
- 'change #mailpoet_h2_font_family': function (event) {
35268
- this.model.set('h2.fontFamily', event.target.value);
35269
- },
35270
- 'change #mailpoet_h2_font_size': function (event) {
35271
- this.model.set('h2.fontSize', event.target.value);
35272
- },
35273
- 'change #mailpoet_h3_font_color': _.partial(this.changeColorField, 'h3.fontColor'),
35274
- 'change #mailpoet_h3_font_family': function (event) {
35275
- this.model.set('h3.fontFamily', event.target.value);
35276
- },
35277
- 'change #mailpoet_h3_font_size': function (event) {
35278
- this.model.set('h3.fontSize', event.target.value);
35279
- },
35280
- 'change #mailpoet_a_font_color': _.partial(this.changeColorField, 'link.fontColor'),
35281
- 'change #mailpoet_a_font_underline': function (event) {
35282
- this.model.set('link.textDecoration', (event.target.checked) ? event.target.value : 'none');
35283
- },
35284
- 'change #mailpoet_newsletter_background_color': _.partial(this.changeColorField, 'wrapper.backgroundColor'),
35285
- 'change #mailpoet_background_color': _.partial(this.changeColorField, 'body.backgroundColor')
35286
- };
35287
- },
35288
- templateContext: function () {
35289
- return {
35290
- model: this.model.toJSON(),
35291
- availableStyles: this.availableStyles.toJSON()
35292
- };
35293
- },
35294
- initialize: function (options) {
35295
- this.availableStyles = options.availableStyles;
35296
- },
35297
- changeField: function (field, event) {
35298
- this.model.set(field, jQuery(event.target).val());
35299
  },
35300
- changeColorField: function (field, event) {
35301
- var value = jQuery(event.target).val();
35302
- if (value === '') {
35303
- value = 'transparent';
35304
- }
35305
- this.model.set(field, value);
35306
  }
35307
  });
35308
 
35309
- Module.SidebarPreviewView = Marionette.View.extend({
35310
- getTemplate: function () { return window.templates.sidebarPreview; },
35311
- events: {
35312
- 'click .mailpoet_show_preview': 'showPreview',
35313
- 'click #mailpoet_send_preview': 'sendPreview'
35314
- },
35315
- onBeforeDestroy: function () {
35316
- if (this.previewView) {
35317
- this.previewView.destroy();
35318
- this.previewView = null;
35319
- }
35320
- },
35321
- showPreview: function () {
35322
- var json = App.toJSON();
35323
-
35324
- // Stringify to enable transmission of primitive non-string value types
35325
- if (!_.isUndefined(json.body)) {
35326
- json.body = JSON.stringify(json.body);
35327
- }
35328
-
35329
- MailPoet.Modal.loading(true);
35330
-
35331
- MailPoet.Ajax.post({
35332
- api_version: window.mailpoet_api_version,
35333
- endpoint: 'newsletters',
35334
- action: 'showPreview',
35335
- data: json
35336
- }).always(function () {
35337
- MailPoet.Modal.loading(false);
35338
- }).done(function (response) {
35339
- this.previewView = new Module.NewsletterPreviewView({
35340
- previewUrl: response.meta.preview_url
35341
- });
35342
-
35343
- this.previewView.render();
35344
- this.previewView.$el.css('height', '100%');
35345
-
35346
- MailPoet.Modal.popup({
35347
- template: '',
35348
- element: this.previewView.$el,
35349
- width: '95%',
35350
- height: '94%',
35351
- title: MailPoet.I18n.t('newsletterPreview'),
35352
- onCancel: function () {
35353
- this.previewView.destroy();
35354
- this.previewView = null;
35355
- }.bind(this)
35356
- });
35357
-
35358
- MailPoet.trackEvent('Editor > Browser Preview', {
35359
- 'MailPoet Free version': window.mailpoet_version
35360
- });
35361
- }.bind(this)).fail(function (response) {
35362
- if (response.errors.length > 0) {
35363
- MailPoet.Notice.error(
35364
- response.errors.map(function (error) { return error.message; }),
35365
- { scroll: true }
35366
- );
35367
- }
35368
- });
35369
- },
35370
- sendPreview: function () {
35371
- // get form data
35372
- var $emailField = this.$('#mailpoet_preview_to_email');
35373
- var data = {
35374
- subscriber: $emailField.val(),
35375
- id: App.getNewsletter().get('id')
35376
- };
35377
-
35378
- if (data.subscriber.length <= 0) {
35379
- MailPoet.Notice.error(
35380
- MailPoet.I18n.t('newsletterPreviewEmailMissing'),
35381
- {
35382
- positionAfter: $emailField,
35383
- scroll: true
35384
- }
35385
- );
35386
- return false;
35387
- }
35388
-
35389
- // send test email
35390
- MailPoet.Modal.loading(true);
35391
 
35392
- // save before sending
35393
- App.getChannel().request('save').always(function () {
35394
- CommunicationComponent.previewNewsletter(data).always(function () {
35395
- MailPoet.Modal.loading(false);
35396
- }).done(function () {
35397
- MailPoet.Notice.success(
35398
- MailPoet.I18n.t('newsletterPreviewSent'),
35399
- { scroll: true }
35400
- );
35401
- MailPoet.trackEvent('Editor > Preview sent', {
35402
- 'MailPoet Free version': window.mailpoet_version,
35403
- 'Domain name': data.subscriber.substring(data.subscriber.indexOf('@') + 1)
35404
- });
35405
- }).fail(function (response) {
35406
- if (response.errors.length > 0) {
35407
- MailPoet.Notice.error(
35408
- response.errors.map(function (error) { return error.message; }),
35409
- { scroll: true, static: true }
35410
- );
35411
- }
35412
- });
35413
- });
35414
- return undefined;
35415
- }
35416
- });
35417
 
35418
- Module.NewsletterPreviewView = Marionette.View.extend({
35419
- getTemplate: function () { return window.templates.newsletterPreview; },
35420
- initialize: function (options) {
35421
- this.previewUrl = options.previewUrl;
35422
- this.width = '100%';
35423
- this.height = '100%';
35424
- // this.width = App.getConfig().get('newsletterPreview.width');
35425
- // this.height = App.getConfig().get('newsletterPreview.height')
35426
- },
35427
- templateContext: function () {
35428
- return {
35429
- previewUrl: this.previewUrl,
35430
- width: this.width,
35431
- height: this.height
35432
- };
35433
- }
35434
  });
35435
 
35436
- App.on('before:start', function (BeforeStartApp) {
35437
- var Application = BeforeStartApp;
35438
- Application.registerWidget = Module.registerWidget;
35439
- Application.getWidgets = Module.getWidgets;
35440
- Application.registerLayoutWidget = Module.registerLayoutWidget;
35441
- Application.getLayoutWidgets = Module.getLayoutWidgets;
35442
  });
35443
 
35444
- App.on('start', function (StartApp) {
35445
- var sidebarView = new SidebarView();
35446
-
35447
- StartApp._appView.showChildView('sidebarRegion', sidebarView);
35448
 
35449
- MailPoet.helpTooltip.show(document.getElementById('tooltip-send-preview'), {
35450
- tooltipId: 'tooltip-editor-send-preview',
35451
- tooltip: MailPoet.I18n.t('helpTooltipSendPreview')
35452
- });
35453
 
35454
- MailPoet.helpTooltip.show(document.getElementById('tooltip-designer-styles'), {
35455
- tooltipId: 'tooltip-editor-designer-styles',
35456
- tooltip: MailPoet.I18n.t('helpTooltipDesignerStyles')
35457
- });
35458
- });
35459
 
35460
- return Module;
35461
- }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
35462
 
 
35463
 
35464
  /***/ },
35465
 
@@ -36002,7 +36003,8 @@ webpackJsonp([4],{
36002
  }
36003
 
36004
  if ((App.getNewsletter().get('type') === 'notification') &&
36005
- contents.indexOf('"type":"automatedLatestContent"') < 0
 
36006
  ) {
36007
  this.showValidationError(MailPoet.I18n.t('automatedLatestContentMissing'));
36008
  return;
@@ -37548,7 +37550,7 @@ webpackJsonp([4],{
37548
  },
37549
  parse: function (response) {
37550
  // If container has any blocks - add them to a collection
37551
- if (response.type === 'container' && _.has(response, 'blocks')) {
37552
  response.blocks = new BlockCollection(response.blocks, {
37553
  parse: true
37554
  });
@@ -39200,6 +39202,7 @@ webpackJsonp([4],{
39200
  defaults: function () {
39201
  return this._getDefaults({
39202
  type: 'automatedLatestContent',
 
39203
  amount: '5',
39204
  contentType: 'post', // 'post'|'page'|'mailpoet_page'
39205
  terms: [], // List of category and tag objects
@@ -39511,18 +39514,419 @@ webpackJsonp([4],{
39511
  blockModel: Module.AutomatedLatestContentBlockModel,
39512
  blockView: Module.AutomatedLatestContentBlockView
39513
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39514
 
39515
  BeforeStartApp.registerWidget({
39516
- name: 'automatedLatestContent',
39517
- widgetView: Module.AutomatedLatestContentWidgetView,
39518
  priority: 97
39519
  });
39520
  });
39521
 
39522
  App.on('start', function (StartApp) {
39523
  var Application = StartApp;
39524
- Application._ALCSupervisor = new Module.ALCSupervisor();
39525
- Application._ALCSupervisor.refresh();
39526
  });
39527
 
39528
  return Module;
@@ -39531,7 +39935,7 @@ webpackJsonp([4],{
39531
 
39532
  /***/ },
39533
 
39534
- /***/ 637:
39535
  /***/ function(module, exports, __webpack_require__) {
39536
 
39537
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
@@ -39588,6 +39992,7 @@ webpackJsonp([4],{
39588
  defaults: function () {
39589
  return this._getDefaults({
39590
  type: 'posts',
 
39591
  amount: '10',
39592
  offset: 0,
39593
  contentType: 'post', // 'post'|'page'|'mailpoet_page'
@@ -39600,7 +40005,7 @@ webpackJsonp([4],{
39600
  titleAlignment: 'left', // 'left'|'center'|'right'
39601
  titleIsLink: false, // false|true
39602
  imageFullWidth: false, // true|false
39603
- featuredImagePosition: 'belowTitle', // 'aboveTitle'|'belowTitle'|'none'
39604
  showAuthor: 'no', // 'no'|'aboveText'|'belowText'
39605
  authorPrecededBy: 'Author:',
39606
  showCategories: 'no', // 'no'|'aboveText'|'belowText'
@@ -39714,7 +40119,7 @@ webpackJsonp([4],{
39714
  if (data.posts.length === 0) return;
39715
 
39716
  CommunicationComponent.getTransformedPosts(data).done(function (posts) {
39717
- collection.add(posts, { at: index });
39718
  }).fail(function () {
39719
  MailPoet.Notice.error(MailPoet.I18n.t('failedToFetchRenderedPosts'));
39720
  });
@@ -39726,7 +40131,7 @@ webpackJsonp([4],{
39726
  getTemplate: function () { return window.templates.postsBlock; },
39727
  modelEvents: {}, // Forcefully disable all events
39728
  regions: _.extend({
39729
- postsRegion: '.mailpoet_posts_block_posts'
39730
  }, base.BlockView.prototype.regions),
39731
  onDragSubstituteBy: function () { return Module.PostsWidgetView; },
39732
  initialize: function () {
@@ -40119,6 +40524,7 @@ webpackJsonp([4],{
40119
  });
40120
 
40121
  Module.PostsWidgetView = base.WidgetView.extend({
 
40122
  getTemplate: function () { return window.templates.postsInsertion; },
40123
  behaviors: {
40124
  DraggableBehavior: {
@@ -40149,7 +40555,7 @@ webpackJsonp([4],{
40149
 
40150
  /***/ },
40151
 
40152
- /***/ 638:
40153
  /***/ function(module, exports, __webpack_require__) {
40154
 
40155
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
1
  webpackJsonp([4],{
2
 
3
+ /***/ 612:
4
  /***/ function(module, exports, __webpack_require__) {
5
 
6
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
 
 
7
  !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
8
  __webpack_require__(609),
9
+ __webpack_require__(613),
10
+ __webpack_require__(276),
11
+ __webpack_require__(568),
12
  __webpack_require__(598),
13
  __webpack_require__(600),
14
+ __webpack_require__(281),
15
+ __webpack_require__(275)
16
+ ], __WEBPACK_AMD_DEFINE_RESULT__ = function (
17
+ App,
18
+ CommunicationComponent,
19
+ MailPoet,
20
+ Backbone,
21
+ Marionette,
22
+ SuperModel,
23
+ _,
24
+ jQuery
25
+ ) {
26
+ 'use strict';
27
+
28
  var Module = {};
29
+ var SidebarView;
30
+ // Widget handlers for use to create new content blocks via drag&drop
31
+ Module._contentWidgets = new (Backbone.Collection.extend({
32
+ model: SuperModel.extend({
33
+ defaults: {
34
+ name: '',
35
+ priority: 100,
36
+ widgetView: undefined
37
+ }
38
+ }),
39
+ comparator: 'priority'
40
+ }))();
41
+ Module.registerWidget = function (widget) { return Module._contentWidgets.add(widget); };
42
+ Module.getWidgets = function () { return Module._contentWidgets; };
43
 
44
+ // Layout widget handlers for use to create new layout blocks via drag&drop
45
+ Module._layoutWidgets = new (Backbone.Collection.extend({
46
+ model: SuperModel.extend({
47
+ defaults: {
48
+ name: '',
49
+ priority: 100,
50
+ widgetView: undefined
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  }
52
+ }),
53
+ comparator: 'priority'
54
+ }))();
55
+ Module.registerLayoutWidget = function (widget) { return Module._layoutWidgets.add(widget); };
56
+ Module.getLayoutWidgets = function () { return Module._layoutWidgets; };
57
+
58
+ SidebarView = Marionette.View.extend({
59
+ getTemplate: function () { return window.templates.sidebar; },
60
+ regions: {
61
+ contentRegion: '.mailpoet_content_region',
62
+ layoutRegion: '.mailpoet_layout_region',
63
+ stylesRegion: '.mailpoet_styles_region',
64
+ previewRegion: '.mailpoet_preview_region'
65
  },
66
+ events: {
67
+ 'click .mailpoet_sidebar_region h3, .mailpoet_sidebar_region .handlediv': function (event) {
68
+ var $openRegion = this.$el.find('.mailpoet_sidebar_region:not(.closed)');
69
+ var $targetRegion = this.$el.find(event.target).closest('.mailpoet_sidebar_region');
70
+
71
+ $openRegion.find('.mailpoet_region_content').velocity(
72
+ 'slideUp',
73
+ {
74
+ duration: 250,
75
+ easing: 'easeOut',
76
+ complete: function () {
77
+ $openRegion.addClass('closed');
78
+ }
79
+ }
80
+ );
81
+
82
+ if ($openRegion.get(0) !== $targetRegion.get(0)) {
83
+ $targetRegion.find('.mailpoet_region_content').velocity(
84
+ 'slideDown',
85
+ {
86
+ duration: 250,
87
+ easing: 'easeIn',
88
+ complete: function () {
89
+ $targetRegion.removeClass('closed');
90
+ }
91
+ }
92
+ );
93
+ }
94
+ }
95
+ },
96
+ initialize: function () {
97
+ jQuery(window)
98
+ .on('resize', this.updateHorizontalScroll.bind(this))
99
+ .on('scroll', this.updateHorizontalScroll.bind(this));
100
+ },
101
+ onRender: function () {
102
+ this.showChildView('contentRegion', new Module.SidebarWidgetsView(
103
+ App.getWidgets()
104
+ ));
105
+ this.showChildView('layoutRegion', new Module.SidebarLayoutWidgetsView(
106
+ App.getLayoutWidgets()
107
+ ));
108
+ this.showChildView('stylesRegion', new Module.SidebarStylesView({
109
+ model: App.getGlobalStyles(),
110
+ availableStyles: App.getAvailableStyles()
111
+ }));
112
+ this.showChildView('previewRegion', new Module.SidebarPreviewView());
113
+ },
114
+ updateHorizontalScroll: function () {
115
+ // Fixes the sidebar so that on narrower screens the horizontal
116
+ // position of the sidebar would be scrollable and not fixed
117
+ // partially out of visible screen
118
+ this.$el.parent().each(function () {
119
+ var calculatedLeft;
120
+ var self = jQuery(this);
121
+
122
+ if (self.css('position') === 'fixed') {
123
+ calculatedLeft = self.parent().offset().left - jQuery(window).scrollLeft();
124
+ self.css('left', calculatedLeft + 'px');
125
+ } else {
126
+ self.css('left', '');
127
+ }
128
+ });
129
+ },
130
+ onDomRefresh: function () {
131
+ this.$el.parent().stick_in_parent({
132
+ offset_top: 32
133
+ });
134
+ this.$el.parent().on('sticky_kit:stick', this.updateHorizontalScroll.bind(this));
135
+ this.$el.parent().on('sticky_kit:unstick', this.updateHorizontalScroll.bind(this));
136
+ this.$el.parent().on('sticky_kit:bottom', this.updateHorizontalScroll.bind(this));
137
+ this.$el.parent().on('sticky_kit:unbottom', this.updateHorizontalScroll.bind(this));
138
  }
139
  });
140
 
141
+ /**
142
+ * Draggable widget collection view
143
+ */
144
+ Module.SidebarWidgetsCollectionView = Marionette.CollectionView.extend({
145
+ childView: function (item) { return item.get('widgetView'); }
146
+ });
147
+
148
+ /**
149
+ * Responsible for rendering draggable content widgets
150
+ */
151
+ Module.SidebarWidgetsView = Marionette.View.extend({
152
+ getTemplate: function () { return window.templates.sidebarContent; },
153
+ regions: {
154
+ widgets: '.mailpoet_region_content'
155
  },
156
+
157
+ initialize: function (widgets) {
158
+ this.widgets = widgets;
159
+ },
160
+
161
+ onRender: function () {
162
+ this.showChildView('widgets', new Module.SidebarWidgetsCollectionView({
163
+ collection: this.widgets
164
+ }));
165
  }
166
  });
167
 
168
+ /**
169
+ * Responsible for rendering draggable layout widgets
170
+ */
171
+ Module.SidebarLayoutWidgetsView = Module.SidebarWidgetsView.extend({
172
+ getTemplate: function () { return window.templates.sidebarLayout; }
173
+ });
 
 
 
 
 
174
 
175
+ /**
176
+ * Responsible for managing global styles
177
+ */
178
+ Module.SidebarStylesView = Marionette.View.extend({
179
+ getTemplate: function () { return window.templates.sidebarStyles; },
180
+ behaviors: {
181
+ ColorPickerBehavior: {}
182
+ },
183
+ events: function () {
184
+ return {
185
+ 'change #mailpoet_text_font_color': _.partial(this.changeColorField, 'text.fontColor'),
186
+ 'change #mailpoet_text_font_family': function (event) {
187
+ this.model.set('text.fontFamily', event.target.value);
188
+ },
189
+ 'change #mailpoet_text_font_size': function (event) {
190
+ this.model.set('text.fontSize', event.target.value);
191
+ },
192
+ 'change #mailpoet_h1_font_color': _.partial(this.changeColorField, 'h1.fontColor'),
193
+ 'change #mailpoet_h1_font_family': function (event) {
194
+ this.model.set('h1.fontFamily', event.target.value);
195
+ },
196
+ 'change #mailpoet_h1_font_size': function (event) {
197
+ this.model.set('h1.fontSize', event.target.value);
198
+ },
199
+ 'change #mailpoet_h2_font_color': _.partial(this.changeColorField, 'h2.fontColor'),
200
+ 'change #mailpoet_h2_font_family': function (event) {
201
+ this.model.set('h2.fontFamily', event.target.value);
202
+ },
203
+ 'change #mailpoet_h2_font_size': function (event) {
204
+ this.model.set('h2.fontSize', event.target.value);
205
+ },
206
+ 'change #mailpoet_h3_font_color': _.partial(this.changeColorField, 'h3.fontColor'),
207
+ 'change #mailpoet_h3_font_family': function (event) {
208
+ this.model.set('h3.fontFamily', event.target.value);
209
+ },
210
+ 'change #mailpoet_h3_font_size': function (event) {
211
+ this.model.set('h3.fontSize', event.target.value);
212
+ },
213
+ 'change #mailpoet_a_font_color': _.partial(this.changeColorField, 'link.fontColor'),
214
+ 'change #mailpoet_a_font_underline': function (event) {
215
+ this.model.set('link.textDecoration', (event.target.checked) ? event.target.value : 'none');
216
+ },
217
+ 'change #mailpoet_newsletter_background_color': _.partial(this.changeColorField, 'wrapper.backgroundColor'),
218
+ 'change #mailpoet_background_color': _.partial(this.changeColorField, 'body.backgroundColor')
219
+ };
220
+ },
221
+ templateContext: function () {
222
+ return {
223
+ model: this.model.toJSON(),
224
+ availableStyles: this.availableStyles.toJSON()
225
+ };
226
+ },
227
+ initialize: function (options) {
228
+ this.availableStyles = options.availableStyles;
229
+ },
230
+ changeField: function (field, event) {
231
+ this.model.set(field, jQuery(event.target).val());
232
+ },
233
+ changeColorField: function (field, event) {
234
+ var value = jQuery(event.target).val();
235
+ if (value === '') {
236
+ value = 'transparent';
237
+ }
238
+ this.model.set(field, value);
239
+ }
240
+ });
241
 
242
+ Module.SidebarPreviewView = Marionette.View.extend({
243
+ getTemplate: function () { return window.templates.sidebarPreview; },
244
+ events: {
245
+ 'click .mailpoet_show_preview': 'showPreview',
246
+ 'click #mailpoet_send_preview': 'sendPreview'
247
+ },
248
+ onBeforeDestroy: function () {
249
+ if (this.previewView) {
250
+ this.previewView.destroy();
251
+ this.previewView = null;
252
+ }
253
+ },
254
+ showPreview: function () {
255
+ var json = App.toJSON();
256
+
257
+ // Stringify to enable transmission of primitive non-string value types
258
+ if (!_.isUndefined(json.body)) {
259
+ json.body = JSON.stringify(json.body);
260
+ }
261
+
262
+ MailPoet.Modal.loading(true);
263
+
264
+ MailPoet.Ajax.post({
265
+ api_version: window.mailpoet_api_version,
266
+ endpoint: 'newsletters',
267
+ action: 'showPreview',
268
+ data: json
269
+ }).always(function () {
270
+ MailPoet.Modal.loading(false);
271
+ }).done(function (response) {
272
+ this.previewView = new Module.NewsletterPreviewView({
273
+ previewUrl: response.meta.preview_url
274
+ });
275
+
276
+ this.previewView.render();
277
+ this.previewView.$el.css('height', '100%');
278
+
279
+ MailPoet.Modal.popup({
280
+ template: '',
281
+ element: this.previewView.$el,
282
+ width: '95%',
283
+ height: '94%',
284
+ title: MailPoet.I18n.t('newsletterPreview'),
285
+ onCancel: function () {
286
+ this.previewView.destroy();
287
+ this.previewView = null;
288
+ }.bind(this)
289
+ });
290
+
291
+ MailPoet.trackEvent('Editor > Browser Preview', {
292
+ 'MailPoet Free version': window.mailpoet_version
293
+ });
294
+ }.bind(this)).fail(function (response) {
295
+ if (response.errors.length > 0) {
296
+ MailPoet.Notice.error(
297
+ response.errors.map(function (error) { return error.message; }),
298
+ { scroll: true }
299
+ );
300
+ }
301
+ });
302
+ },
303
+ sendPreview: function () {
304
+ // get form data
305
+ var $emailField = this.$('#mailpoet_preview_to_email');
306
+ var data = {
307
+ subscriber: $emailField.val(),
308
+ id: App.getNewsletter().get('id')
309
+ };
310
+
311
+ if (data.subscriber.length <= 0) {
312
+ MailPoet.Notice.error(
313
+ MailPoet.I18n.t('newsletterPreviewEmailMissing'),
314
+ {
315
+ positionAfter: $emailField,
316
+ scroll: true
317
+ }
318
+ );
319
+ return false;
320
+ }
321
+
322
+ // send test email
323
+ MailPoet.Modal.loading(true);
324
+
325
+ // save before sending
326
+ App.getChannel().request('save').always(function () {
327
+ CommunicationComponent.previewNewsletter(data).always(function () {
328
+ MailPoet.Modal.loading(false);
329
+ }).done(function () {
330
+ MailPoet.Notice.success(
331
+ MailPoet.I18n.t('newsletterPreviewSent'),
332
+ { scroll: true }
333
+ );
334
+ MailPoet.trackEvent('Editor > Preview sent', {
335
+ 'MailPoet Free version': window.mailpoet_version,
336
+ 'Domain name': data.subscriber.substring(data.subscriber.indexOf('@') + 1)
337
+ });
338
+ }).fail(function (response) {
339
+ if (response.errors.length > 0) {
340
+ MailPoet.Notice.error(
341
+ response.errors.map(function (error) { return error.message; }),
342
+ { scroll: true, static: true }
343
+ );
344
+ }
345
+ });
346
+ });
347
+ return undefined;
348
+ }
349
  });
350
 
351
+ Module.NewsletterPreviewView = Marionette.View.extend({
352
+ getTemplate: function () { return window.templates.newsletterPreview; },
353
+ initialize: function (options) {
354
+ this.previewUrl = options.previewUrl;
355
+ this.width = '100%';
356
+ this.height = '100%';
357
+ // this.width = App.getConfig().get('newsletterPreview.width');
358
+ // this.height = App.getConfig().get('newsletterPreview.height')
359
+ },
360
+ templateContext: function () {
361
+ return {
362
+ previewUrl: this.previewUrl,
363
+ width: this.width,
364
+ height: this.height
365
+ };
366
+ }
367
+ });
368
+
369
+ App.on('before:start', function (BeforeStartApp) {
370
+ var Application = BeforeStartApp;
371
+ Application.registerWidget = Module.registerWidget;
372
+ Application.getWidgets = Module.getWidgets;
373
+ Application.registerLayoutWidget = Module.registerLayoutWidget;
374
+ Application.getLayoutWidgets = Module.getLayoutWidgets;
375
+ });
376
+
377
+ App.on('start', function (StartApp) {
378
+ var sidebarView = new SidebarView();
379
+
380
+ StartApp._appView.showChildView('sidebarRegion', sidebarView);
381
+
382
+ MailPoet.helpTooltip.show(document.getElementById('tooltip-send-preview'), {
383
+ tooltipId: 'tooltip-editor-send-preview',
384
+ tooltip: MailPoet.I18n.t('helpTooltipSendPreview')
385
+ });
386
+
387
+ MailPoet.helpTooltip.show(document.getElementById('tooltip-designer-styles'), {
388
+ tooltipId: 'tooltip-editor-designer-styles',
389
+ tooltip: MailPoet.I18n.t('helpTooltipDesignerStyles')
390
+ });
391
  });
392
 
393
  return Module;
440
  __webpack_require__(635);
441
  __webpack_require__(636);
442
  __webpack_require__(637);
443
+ __webpack_require__(638);
444
+ module.exports = __webpack_require__(639);
445
 
446
 
447
  /***/ },
35358
 
35359
  /***/ },
35360
 
35361
+ /***/ 611:
 
 
 
 
 
 
 
35362
  /***/ function(module, exports, __webpack_require__) {
35363
 
35364
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;
35365
+ 'use strict';
35366
+
35367
  !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
35368
  __webpack_require__(609),
 
 
 
35369
  __webpack_require__(598),
35370
  __webpack_require__(600),
35371
+ __webpack_require__(281)
35372
+ ], __WEBPACK_AMD_DEFINE_RESULT__ = function (App, Marionette, SuperModel, _) { // eslint-disable-line func-names
 
 
 
 
 
 
 
 
 
 
 
 
35373
  var Module = {};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35374
 
35375
+ Module.StylesModel = SuperModel.extend({
35376
+ defaults: {
35377
+ text: {
35378
+ fontColor: '#000000',
35379
+ fontFamily: 'Arial',
35380
+ fontSize: '16px'
35381
+ },
35382
+ h1: {
35383
+ fontColor: '#111111',
35384
+ fontFamily: 'Arial',
35385
+ fontSize: '40px'
35386
+ },
35387
+ h2: {
35388
+ fontColor: '#222222',
35389
+ fontFamily: 'Tahoma',
35390
+ fontSize: '32px'
35391
+ },
35392
+ h3: {
35393
+ fontColor: '#333333',
35394
+ fontFamily: 'Verdana',
35395
+ fontSize: '24px'
35396
+ },
35397
+ link: {
35398
+ fontColor: '#21759B',
35399
+ textDecoration: 'underline'
35400
+ },
35401
+ wrapper: {
35402
+ backgroundColor: '#ffffff'
35403
+ },
35404
+ body: {
35405
+ backgroundColor: '#cccccc'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35406
  }
35407
  },
35408
+ initialize: function () { // eslint-disable-line func-names
35409
+ this.on('change', function () { App.getChannel().trigger('autoSave'); }); // eslint-disable-line func-names
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35410
  }
35411
  });
35412
 
35413
+ Module.StylesView = Marionette.View.extend({
35414
+ getTemplate: function () { return window.templates.styles; }, // eslint-disable-line func-names
35415
+ modelEvents: {
35416
+ change: 'render'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35417
  },
35418
+ serializeData: function () { // eslint-disable-line func-names
35419
+ return this.model.toJSON();
 
 
 
 
35420
  }
35421
  });
35422
 
35423
+ Module._globalStyles = new SuperModel();
35424
+ Module.getGlobalStyles = function () { // eslint-disable-line func-names
35425
+ return Module._globalStyles;
35426
+ };
35427
+ Module.setGlobalStyles = function (options) { // eslint-disable-line func-names
35428
+ Module._globalStyles = new Module.StylesModel(options);
35429
+ return Module._globalStyles;
35430
+ };
35431
+ Module.getAvailableStyles = function () { // eslint-disable-line func-names
35432
+ return App.getConfig().get('availableStyles');
35433
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35434
 
35435
+ App.on('before:start', function (BeforeStartApp, options) { // eslint-disable-line func-names
35436
+ var Application = BeforeStartApp;
35437
+ var body;
35438
+ var globalStyles;
35439
+ // Expose style methods to global application
35440
+ Application.getGlobalStyles = Module.getGlobalStyles;
35441
+ Application.setGlobalStyles = Module.setGlobalStyles;
35442
+ Application.getAvailableStyles = Module.getAvailableStyles;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35443
 
35444
+ body = options.newsletter.body;
35445
+ globalStyles = (_.has(body, 'globalStyles')) ? body.globalStyles : {};
35446
+ this.setGlobalStyles(globalStyles);
 
 
 
 
 
 
 
 
 
 
 
 
 
35447
  });
35448
 
35449
+ App.on('start', function (StartApp) { // eslint-disable-line func-names
35450
+ var stylesView = new Module.StylesView({ model: StartApp.getGlobalStyles() });
35451
+ StartApp._appView.showChildView('stylesRegion', stylesView);
 
 
 
35452
  });
35453
 
35454
+ return Module;
35455
+ }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
 
 
35456
 
 
 
 
 
35457
 
35458
+ /***/ },
 
 
 
 
35459
 
35460
+ /***/ 275:
35461
+ /***/ function(module, exports) {
35462
 
35463
+ module.exports = jQuery;
35464
 
35465
  /***/ },
35466
 
36003
  }
36004
 
36005
  if ((App.getNewsletter().get('type') === 'notification') &&
36006
+ contents.indexOf('"type":"automatedLatestContent"') < 0 &&
36007
+ contents.indexOf('"type":"automatedLatestContentLayout"') < 0
36008
  ) {
36009
  this.showValidationError(MailPoet.I18n.t('automatedLatestContentMissing'));
36010
  return;
37550
  },
37551
  parse: function (response) {
37552
  // If container has any blocks - add them to a collection
37553
+ if (response.type === 'container' && _.has(response, 'blocks') && response.blocks.constructor === Array) {
37554
  response.blocks = new BlockCollection(response.blocks, {
37555
  parse: true
37556
  });
39202
  defaults: function () {
39203
  return this._getDefaults({
39204
  type: 'automatedLatestContent',
39205
+ withLayout: false,
39206
  amount: '5',
39207
  contentType: 'post', // 'post'|'page'|'mailpoet_page'
39208
  terms: [], // List of category and tag objects
39514
  blockModel: Module.AutomatedLatestContentBlockModel,
39515
  blockView: Module.AutomatedLatestContentBlockView
39516
  });
39517
+ });
39518
+
39519
+ App.on('start', function (StartApp) {
39520
+ var Application = StartApp;
39521
+ Application._ALCSupervisor = new Module.ALCSupervisor();
39522
+ Application._ALCSupervisor.refresh();
39523
+ });
39524
+
39525
+ return Module;
39526
+ }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
39527
+
39528
+
39529
+ /***/ },
39530
+
39531
+ /***/ 637:
39532
+ /***/ function(module, exports, __webpack_require__) {
39533
+
39534
+ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
39535
+ /**
39536
+ * Automated latest content block with image alignment.
39537
+ */
39538
+ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
39539
+ __webpack_require__(609),
39540
+ __webpack_require__(627),
39541
+ __webpack_require__(629),
39542
+ __webpack_require__(631),
39543
+ __webpack_require__(613),
39544
+ __webpack_require__(276),
39545
+ __webpack_require__(600),
39546
+ __webpack_require__(281),
39547
+ __webpack_require__(275)
39548
+ ], __WEBPACK_AMD_DEFINE_RESULT__ = function (
39549
+ App,
39550
+ BaseBlock,
39551
+ ButtonBlock,
39552
+ DividerBlock,
39553
+ CommunicationComponent,
39554
+ MailPoet,
39555
+ SuperModel,
39556
+ _,
39557
+ jQuery
39558
+ ) {
39559
+ 'use strict';
39560
+
39561
+ var Module = {};
39562
+ var base = BaseBlock;
39563
+
39564
+ Module.ALCLayoutSupervisor = SuperModel.extend({
39565
+ initialize: function () {
39566
+ var DELAY_REFRESH_FOR_MS = 500;
39567
+ this.listenTo(
39568
+ App.getChannel(),
39569
+ 'automatedLatestContentLayoutRefresh',
39570
+ _.debounce(this.refresh, DELAY_REFRESH_FOR_MS)
39571
+ );
39572
+ },
39573
+ refresh: function () {
39574
+ var blocks;
39575
+ var models = App.findModels(function (model) {
39576
+ return model.get('type') === 'automatedLatestContentLayout';
39577
+ }) || [];
39578
+
39579
+ if (models.length === 0) return;
39580
+ blocks = _.map(models, function (model) {
39581
+ return model.toJSON();
39582
+ });
39583
+
39584
+ CommunicationComponent.getBulkTransformedPosts({
39585
+ blocks: blocks
39586
+ }).then(_.partial(this.refreshBlocks, models));
39587
+ },
39588
+ refreshBlocks: function (models, renderedBlocks) {
39589
+ _.each(
39590
+ _.zip(models, renderedBlocks),
39591
+ function (args) {
39592
+ var model = args[0];
39593
+ var contents = args[1];
39594
+ model.trigger('refreshPosts', contents);
39595
+ }
39596
+ );
39597
+ }
39598
+ });
39599
+
39600
+ Module.AutomatedLatestContentLayoutBlockModel = base.BlockModel.extend({
39601
+ stale: ['_container'],
39602
+ defaults: function () {
39603
+ return this._getDefaults({
39604
+ type: 'automatedLatestContentLayout',
39605
+ withLayout: true,
39606
+ amount: '5',
39607
+ contentType: 'post', // 'post'|'page'|'mailpoet_page'
39608
+ terms: [], // List of category and tag objects
39609
+ inclusionType: 'include', // 'include'|'exclude'
39610
+ displayType: 'excerpt', // 'excerpt'|'full'|'titleOnly'
39611
+ titleFormat: 'h1', // 'h1'|'h2'|'h3'|'ul'
39612
+ titleAlignment: 'left', // 'left'|'center'|'right'
39613
+ titleIsLink: false, // false|true
39614
+ imageFullWidth: false, // true|false
39615
+ featuredImagePosition: 'centered', // 'centered'|'left'|'right'|'alternate'|'none'
39616
+ showAuthor: 'no', // 'no'|'aboveText'|'belowText'
39617
+ authorPrecededBy: 'Author:',
39618
+ showCategories: 'no', // 'no'|'aboveText'|'belowText'
39619
+ categoriesPrecededBy: 'Categories:',
39620
+ readMoreType: 'button', // 'link'|'button'
39621
+ readMoreText: 'Read more', // 'link'|'button'
39622
+ readMoreButton: {
39623
+ text: 'Read more',
39624
+ url: '[postLink]'
39625
+ },
39626
+ sortBy: 'newest', // 'newest'|'oldest',
39627
+ showDivider: true, // true|false
39628
+ divider: {},
39629
+ _container: new (App.getBlockTypeModel('container'))()
39630
+ }, App.getConfig().get('blockDefaults.automatedLatestContentLayout'));
39631
+ },
39632
+ relations: function () {
39633
+ return {
39634
+ readMoreButton: App.getBlockTypeModel('button'),
39635
+ divider: App.getBlockTypeModel('divider'),
39636
+ _container: App.getBlockTypeModel('container')
39637
+ };
39638
+ },
39639
+ initialize: function () {
39640
+ base.BlockView.prototype.initialize.apply(this, arguments);
39641
+ this.on('change:amount change:contentType change:terms change:inclusionType change:displayType change:titleFormat change:featuredImagePosition change:titleAlignment change:titleIsLink change:imageFullWidth change:showAuthor change:authorPrecededBy change:showCategories change:categoriesPrecededBy change:readMoreType change:readMoreText change:sortBy change:showDivider', this._handleChanges, this);
39642
+ this.listenTo(this.get('readMoreButton'), 'change', this._handleChanges);
39643
+ this.listenTo(this.get('divider'), 'change', this._handleChanges);
39644
+ this.on('add remove update reset', this._handleChanges);
39645
+ this.on('refreshPosts', this.updatePosts, this);
39646
+ },
39647
+ updatePosts: function (posts) {
39648
+ this.get('_container.blocks').reset(posts, { parse: true });
39649
+ },
39650
+ /**
39651
+ * Batch more changes during a specific time, instead of fetching
39652
+ * ALC posts on each model change
39653
+ */
39654
+ _handleChanges: function () {
39655
+ this._updateDefaults();
39656
+ App.getChannel().trigger('automatedLatestContentLayoutRefresh');
39657
+ }
39658
+ });
39659
+
39660
+ Module.AutomatedLatestContentLayoutBlockView = base.BlockView.extend({
39661
+ className: 'mailpoet_block mailpoet_automated_latest_content_block mailpoet_droppable_block',
39662
+ initialize: function () {
39663
+ function replaceButtonStylesHandler(data) {
39664
+ this.model.set({ readMoreButton: data });
39665
+ }
39666
+ App.getChannel().on('replaceAllButtonStyles', replaceButtonStylesHandler.bind(this));
39667
+ },
39668
+ getTemplate: function () { return window.templates.automatedLatestContentLayoutBlock; },
39669
+ regions: {
39670
+ toolsRegion: '.mailpoet_tools',
39671
+ postsRegion: '.mailpoet_automated_latest_content_block_posts'
39672
+ },
39673
+ modelEvents: _.extend(
39674
+ _.omit(base.BlockView.prototype.modelEvents, 'change'),
39675
+ {
39676
+ postsChanged: 'render'
39677
+ }),
39678
+ events: _.extend(base.BlockView.prototype.events, {
39679
+ 'click .mailpoet_automated_latest_content_block_overlay': 'showSettings'
39680
+ }),
39681
+ onDragSubstituteBy: function () { return Module.AutomatedLatestContentLayoutWidgetView; },
39682
+ onRender: function () {
39683
+ var ContainerView = App.getBlockTypeView('container');
39684
+ var renderOptions = {
39685
+ disableTextEditor: true,
39686
+ disableDragAndDrop: true,
39687
+ emptyContainerMessage: MailPoet.I18n.t('noPostsToDisplay')
39688
+ };
39689
+ this.toolsView = new Module.AutomatedLatestContentLayoutBlockToolsView({ model: this.model });
39690
+ this.showChildView('toolsRegion', this.toolsView);
39691
+ this.showChildView('postsRegion', new ContainerView({ model: this.model.get('_container'), renderOptions: renderOptions }));
39692
+ }
39693
+ });
39694
+
39695
+ Module.AutomatedLatestContentLayoutBlockToolsView = base.BlockToolsView.extend({
39696
+ getSettingsView: function () { return Module.AutomatedLatestContentLayoutBlockSettingsView; }
39697
+ });
39698
+
39699
+ // Sidebar view container
39700
+ Module.AutomatedLatestContentLayoutBlockSettingsView = base.BlockSettingsView.extend({
39701
+ getTemplate: function () { return window.templates.automatedLatestContentLayoutBlockSettings; },
39702
+ events: function () {
39703
+ return {
39704
+ 'click .mailpoet_automated_latest_content_hide_display_options': 'toggleDisplayOptions',
39705
+ 'click .mailpoet_automated_latest_content_show_display_options': 'toggleDisplayOptions',
39706
+ 'click .mailpoet_automated_latest_content_select_button': 'showButtonSettings',
39707
+ 'click .mailpoet_automated_latest_content_select_divider': 'showDividerSettings',
39708
+ 'change .mailpoet_automated_latest_content_read_more_type': 'changeReadMoreType',
39709
+ 'change .mailpoet_automated_latest_content_display_type': 'changeDisplayType',
39710
+ 'change .mailpoet_automated_latest_content_title_format': 'changeTitleFormat',
39711
+ 'change .mailpoet_automated_latest_content_title_as_links': _.partial(this.changeBoolField, 'titleIsLink'),
39712
+ 'change .mailpoet_automated_latest_content_show_divider': _.partial(this.changeBoolField, 'showDivider'),
39713
+ 'input .mailpoet_automated_latest_content_show_amount': _.partial(this.changeField, 'amount'),
39714
+ 'change .mailpoet_automated_latest_content_content_type': _.partial(this.changeField, 'contentType'),
39715
+ 'change .mailpoet_automated_latest_content_include_or_exclude': _.partial(this.changeField, 'inclusionType'),
39716
+ 'change .mailpoet_automated_latest_content_title_alignment': _.partial(this.changeField, 'titleAlignment'),
39717
+ 'change .mailpoet_automated_latest_content_image_full_width': _.partial(this.changeBoolField, 'imageFullWidth'),
39718
+ 'change .mailpoet_automated_latest_content_featured_image_position': _.partial(this.changeField, 'featuredImagePosition'),
39719
+ 'change .mailpoet_automated_latest_content_show_author': _.partial(this.changeField, 'showAuthor'),
39720
+ 'input .mailpoet_automated_latest_content_author_preceded_by': _.partial(this.changeField, 'authorPrecededBy'),
39721
+ 'change .mailpoet_automated_latest_content_show_categories': _.partial(this.changeField, 'showCategories'),
39722
+ 'input .mailpoet_automated_latest_content_categories': _.partial(this.changeField, 'categoriesPrecededBy'),
39723
+ 'input .mailpoet_automated_latest_content_read_more_text': _.partial(this.changeField, 'readMoreText'),
39724
+ 'change .mailpoet_automated_latest_content_sort_by': _.partial(this.changeField, 'sortBy'),
39725
+ 'click .mailpoet_done_editing': 'close'
39726
+ };
39727
+ },
39728
+ onRender: function () {
39729
+ var that = this;
39730
+
39731
+ // Dynamically update available post types
39732
+ CommunicationComponent.getPostTypes().done(_.bind(this._updateContentTypes, this));
39733
+
39734
+ this.$('.mailpoet_automated_latest_content_categories_and_tags').select2({
39735
+ multiple: true,
39736
+ allowClear: true,
39737
+ placeholder: MailPoet.I18n.t('categoriesAndTags'),
39738
+ ajax: {
39739
+ data: function (params) {
39740
+ return {
39741
+ term: params.term
39742
+ };
39743
+ },
39744
+ transport: function (options, success, failure) {
39745
+ var taxonomies;
39746
+ var termsPromise;
39747
+ var promise = CommunicationComponent.getTaxonomies(
39748
+ that.model.get('contentType')
39749
+ ).then(function (tax) {
39750
+ taxonomies = tax;
39751
+ // Fetch available terms based on the list of taxonomies already fetched
39752
+ termsPromise = CommunicationComponent.getTerms({
39753
+ search: options.data.term,
39754
+ taxonomies: _.keys(taxonomies)
39755
+ }).then(function (terms) {
39756
+ return {
39757
+ taxonomies: taxonomies,
39758
+ terms: terms
39759
+ };
39760
+ });
39761
+ return termsPromise;
39762
+ });
39763
+
39764
+ promise.then(success);
39765
+ promise.fail(failure);
39766
+ return promise;
39767
+ },
39768
+ processResults: function (data) {
39769
+ // Transform taxonomies and terms into select2 compatible format
39770
+ return {
39771
+ results: _.map(
39772
+ data.terms,
39773
+ function (item) {
39774
+ return _.defaults({
39775
+ text: data.taxonomies[item.taxonomy].labels.singular_name + ': ' + item.name,
39776
+ id: item.term_id
39777
+ }, item);
39778
+ }
39779
+ )
39780
+ };
39781
+ }
39782
+ }
39783
+ }).on({
39784
+ 'select2:select': function (event) {
39785
+ var terms = that.model.get('terms');
39786
+ terms.add(event.params.data);
39787
+ // Reset whole model in order for change events to propagate properly
39788
+ that.model.set('terms', terms.toJSON());
39789
+ },
39790
+ 'select2:unselect': function (event) {
39791
+ var terms = that.model.get('terms');
39792
+ terms.remove(event.params.data);
39793
+ // Reset whole model in order for change events to propagate properly
39794
+ that.model.set('terms', terms.toJSON());
39795
+ }
39796
+ }).trigger('change');
39797
+ },
39798
+ toggleDisplayOptions: function () {
39799
+ var el = this.$('.mailpoet_automated_latest_content_display_options');
39800
+ var showControl = this.$('.mailpoet_automated_latest_content_show_display_options');
39801
+ if (el.hasClass('mailpoet_closed')) {
39802
+ el.removeClass('mailpoet_closed');
39803
+ showControl.addClass('mailpoet_hidden');
39804
+ } else {
39805
+ el.addClass('mailpoet_closed');
39806
+ showControl.removeClass('mailpoet_hidden');
39807
+ }
39808
+ },
39809
+ showButtonSettings: function () {
39810
+ var buttonModule = ButtonBlock;
39811
+ (new buttonModule.ButtonBlockSettingsView({
39812
+ model: this.model.get('readMoreButton'),
39813
+ renderOptions: {
39814
+ displayFormat: 'subpanel',
39815
+ hideLink: true,
39816
+ hideApplyToAll: true
39817
+ }
39818
+ })).render();
39819
+ },
39820
+ showDividerSettings: function () {
39821
+ var dividerModule = DividerBlock;
39822
+ (new dividerModule.DividerBlockSettingsView({
39823
+ model: this.model.get('divider'),
39824
+ renderOptions: {
39825
+ displayFormat: 'subpanel',
39826
+ hideApplyToAll: true
39827
+ }
39828
+ })).render();
39829
+ },
39830
+ changeReadMoreType: function (event) {
39831
+ var value = jQuery(event.target).val();
39832
+ if (value === 'link') {
39833
+ this.$('.mailpoet_automated_latest_content_read_more_text').removeClass('mailpoet_hidden');
39834
+ this.$('.mailpoet_automated_latest_content_select_button').addClass('mailpoet_hidden');
39835
+ } else if (value === 'button') {
39836
+ this.$('.mailpoet_automated_latest_content_read_more_text').addClass('mailpoet_hidden');
39837
+ this.$('.mailpoet_automated_latest_content_select_button').removeClass('mailpoet_hidden');
39838
+ }
39839
+ this.changeField('readMoreType', event);
39840
+ },
39841
+ changeDisplayType: function (event) {
39842
+ var value = jQuery(event.target).val();
39843
+
39844
+ if (value === 'titleOnly') {
39845
+ this.$('.mailpoet_automated_latest_content_title_as_list').removeClass('mailpoet_hidden');
39846
+ this.$('.mailpoet_automated_latest_content_image_full_width_option').addClass('mailpoet_hidden');
39847
+ this.$('.mailpoet_automated_latest_content_image_separator').addClass('mailpoet_hidden');
39848
+ } else {
39849
+ this.$('.mailpoet_automated_latest_content_title_as_list').addClass('mailpoet_hidden');
39850
+ this.$('.mailpoet_automated_latest_content_image_full_width_option').removeClass('mailpoet_hidden');
39851
+ this.$('.mailpoet_automated_latest_content_image_separator').removeClass('mailpoet_hidden');
39852
+
39853
+ // Reset titleFormat if it was set to List when switching away from displayType=titleOnly
39854
+ if (this.model.get('titleFormat') === 'ul') {
39855
+ this.model.set('titleFormat', 'h1');
39856
+ this.$('.mailpoet_automated_latest_content_title_format').val(['h1']);
39857
+ this.$('.mailpoet_automated_latest_content_title_as_link').removeClass('mailpoet_hidden');
39858
+ }
39859
+ }
39860
+
39861
+ if (value === 'excerpt') {
39862
+ this.$('.mailpoet_automated_latest_content_featured_image_position_container').removeClass('mailpoet_hidden');
39863
+ } else {
39864
+ this.$('.mailpoet_automated_latest_content_featured_image_position_container').addClass('mailpoet_hidden');
39865
+ }
39866
+ this.changeField('displayType', event);
39867
+ },
39868
+ changeTitleFormat: function (event) {
39869
+ var value = jQuery(event.target).val();
39870
+ if (value === 'ul') {
39871
+ this.$('.mailpoet_automated_latest_content_non_title_list_options').addClass('mailpoet_hidden');
39872
+
39873
+ this.model.set('titleIsLink', true);
39874
+ this.$('.mailpoet_automated_latest_content_title_as_link').addClass('mailpoet_hidden');
39875
+ this.$('.mailpoet_automated_latest_content_title_as_links').val(['true']);
39876
+ } else {
39877
+ this.$('.mailpoet_automated_latest_content_non_title_list_options').removeClass('mailpoet_hidden');
39878
+ this.$('.mailpoet_automated_latest_content_title_as_link').removeClass('mailpoet_hidden');
39879
+ }
39880
+ this.changeField('titleFormat', event);
39881
+ },
39882
+ _updateContentTypes: function (postTypes) {
39883
+ var select = this.$('.mailpoet_automated_latest_content_content_type');
39884
+ var selectedValue = this.model.get('contentType');
39885
+
39886
+ select.find('option').remove();
39887
+ _.each(postTypes, function (type) {
39888
+ select.append(jQuery('<option>', {
39889
+ value: type.name,
39890
+ text: type.label
39891
+ }));
39892
+ });
39893
+ select.val(selectedValue);
39894
+ }
39895
+ });
39896
+
39897
+ Module.AutomatedLatestContentLayoutWidgetView = base.WidgetView.extend({
39898
+ className: base.WidgetView.prototype.className + ' mailpoet_droppable_layout_block',
39899
+ getTemplate: function () { return window.templates.automatedLatestContentLayoutInsertion; },
39900
+ behaviors: {
39901
+ DraggableBehavior: {
39902
+ cloneOriginal: true,
39903
+ drop: function () {
39904
+ return new Module.AutomatedLatestContentLayoutBlockModel({}, { parse: true });
39905
+ },
39906
+ onDrop: function (options) {
39907
+ options.droppedView.triggerMethod('showSettings');
39908
+ }
39909
+ }
39910
+ }
39911
+ });
39912
+
39913
+ App.on('before:start', function (BeforeStartApp) {
39914
+ BeforeStartApp.registerBlockType('automatedLatestContentLayout', {
39915
+ blockModel: Module.AutomatedLatestContentLayoutBlockModel,
39916
+ blockView: Module.AutomatedLatestContentLayoutBlockView
39917
+ });
39918
 
39919
  BeforeStartApp.registerWidget({
39920
+ name: 'automatedLatestContentLayout',
39921
+ widgetView: Module.AutomatedLatestContentLayoutWidgetView,
39922
  priority: 97
39923
  });
39924
  });
39925
 
39926
  App.on('start', function (StartApp) {
39927
  var Application = StartApp;
39928
+ Application._ALCLayoutSupervisor = new Module.ALCLayoutSupervisor();
39929
+ Application._ALCLayoutSupervisor.refresh();
39930
  });
39931
 
39932
  return Module;
39935
 
39936
  /***/ },
39937
 
39938
+ /***/ 638:
39939
  /***/ function(module, exports, __webpack_require__) {
39940
 
39941
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
39992
  defaults: function () {
39993
  return this._getDefaults({
39994
  type: 'posts',
39995
+ withLayout: true,
39996
  amount: '10',
39997
  offset: 0,
39998
  contentType: 'post', // 'post'|'page'|'mailpoet_page'
40005
  titleAlignment: 'left', // 'left'|'center'|'right'
40006
  titleIsLink: false, // false|true
40007
  imageFullWidth: false, // true|false
40008
+ featuredImagePosition: 'centered', // 'centered'|'right'|'left'|'alternate'|'none'
40009
  showAuthor: 'no', // 'no'|'aboveText'|'belowText'
40010
  authorPrecededBy: 'Author:',
40011
  showCategories: 'no', // 'no'|'aboveText'|'belowText'
40119
  if (data.posts.length === 0) return;
40120
 
40121
  CommunicationComponent.getTransformedPosts(data).done(function (posts) {
40122
+ collection.add(JSON.parse(JSON.stringify(posts)), { at: index });
40123
  }).fail(function () {
40124
  MailPoet.Notice.error(MailPoet.I18n.t('failedToFetchRenderedPosts'));
40125
  });
40131
  getTemplate: function () { return window.templates.postsBlock; },
40132
  modelEvents: {}, // Forcefully disable all events
40133
  regions: _.extend({
40134
+ postsRegion: '.mailpoet_posts_container'
40135
  }, base.BlockView.prototype.regions),
40136
  onDragSubstituteBy: function () { return Module.PostsWidgetView; },
40137
  initialize: function () {
40524
  });
40525
 
40526
  Module.PostsWidgetView = base.WidgetView.extend({
40527
+ className: base.WidgetView.prototype.className + ' mailpoet_droppable_layout_block',
40528
  getTemplate: function () { return window.templates.postsInsertion; },
40529
  behaviors: {
40530
  DraggableBehavior: {
40555
 
40556
  /***/ },
40557
 
40558
+ /***/ 639:
40559
  /***/ function(module, exports, __webpack_require__) {
40560
 
40561
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
assets/js/{vendor.0b1694bf.js → vendor.98a3aa8c.js} RENAMED
@@ -76,7 +76,7 @@
76
  /******/ script.charset = 'utf-8';
77
  /******/ script.async = true;
78
 
79
- /******/ script.src = __webpack_require__.p + "" + ({"0":"admin","1":"admin_vendor","2":"form_editor","3":"mailpoet","4":"newsletter_editor"}[chunkId]||chunkId) + "." + {"0":"b1f6f0a0","1":"b19a9487","2":"f475a2b0","3":"7070ca4a","4":"69062a08"}[chunkId] + ".chunk.js";
80
  /******/ head.appendChild(script);
81
  /******/ }
82
  /******/ };
@@ -100,13 +100,13 @@
100
  /***/ function(module, exports, __webpack_require__) {
101
 
102
  __webpack_require__(577);
103
- __webpack_require__(639);
104
  module.exports = __webpack_require__(438);
105
 
106
 
107
  /***/ },
108
 
109
- /***/ 639:
110
  /***/ function(module, exports, __webpack_require__) {
111
 
112
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
76
  /******/ script.charset = 'utf-8';
77
  /******/ script.async = true;
78
 
79
+ /******/ script.src = __webpack_require__.p + "" + ({"0":"admin","1":"admin_vendor","2":"form_editor","3":"mailpoet","4":"newsletter_editor"}[chunkId]||chunkId) + "." + {"0":"a58c3783","1":"016e33b8","2":"b2d3a84e","3":"f26c86e7","4":"1d7b4686"}[chunkId] + ".chunk.js";
80
  /******/ head.appendChild(script);
81
  /******/ }
82
  /******/ };
100
  /***/ function(module, exports, __webpack_require__) {
101
 
102
  __webpack_require__(577);
103
+ __webpack_require__(640);
104
  module.exports = __webpack_require__(438);
105
 
106
 
107
  /***/ },
108
 
109
+ /***/ 640:
110
  /***/ function(module, exports, __webpack_require__) {
111
 
112
  var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* eslint-disable func-names */
lang/mailpoet-ca.mo CHANGED
Binary file
lang/mailpoet-da_DK.mo CHANGED
Binary file
lang/mailpoet-de_DE.mo CHANGED
Binary file
lang/mailpoet-en_GB.mo CHANGED
Binary file
lang/mailpoet-es_ES.mo CHANGED
Binary file
lang/mailpoet-fa_IR.mo CHANGED
Binary file
lang/mailpoet-fr_CA.mo CHANGED
Binary file
lang/mailpoet-fr_FR.mo CHANGED
Binary file
lang/mailpoet-it_IT.mo CHANGED
Binary file
lang/mailpoet-ja.mo CHANGED
Binary file
lang/mailpoet-nl_NL.mo CHANGED
Binary file
lang/mailpoet-pl_PL.mo CHANGED
Binary file
lang/mailpoet-pt_BR.mo CHANGED
Binary file
lang/mailpoet-pt_PT.mo CHANGED
Binary file
lang/mailpoet-ru_RU.mo CHANGED
Binary file
lang/mailpoet-sq.mo CHANGED
Binary file
lang/mailpoet-sv_SE.mo CHANGED
Binary file
lang/mailpoet-tr_TR.mo CHANGED
Binary file
lang/mailpoet.pot CHANGED
@@ -4,7 +4,7 @@ msgid ""
4
  msgstr ""
5
  "Project-Id-Version: \n"
6
  "Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
7
- "POT-Creation-Date: 2018-05-30 05:30:29+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -78,7 +78,7 @@ msgstr ""
78
  #: lib/API/MP/v1/API.php:18
79
  #: lib/Subscribers/ImportExport/ImportExportFactory.php:44
80
  #: lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php:40
81
- #: views/newsletter/editor.html:937 views/newsletter/editor.html:938
82
  msgid "Email"
83
  msgstr ""
84
 
@@ -412,7 +412,7 @@ msgstr ""
412
  msgid "Newsletter"
413
  msgstr ""
414
 
415
- #: lib/Config/Menu.php:113 views/newsletter/editor.html:228
416
  msgid "Newsletter Editor"
417
  msgstr ""
418
 
@@ -651,7 +651,7 @@ msgstr ""
651
  #: lib/Config/PopulatorData/Templates/NewsletterBlank12Column.php:255
652
  #: lib/Config/PopulatorData/Templates/NewsletterBlank13Column.php:278
653
  #: lib/Config/PopulatorData/Templates/NewsletterBlank1Column.php:194
654
- #: lib/Config/PopulatorData/Templates/PostNotificationsBlank1Column.php:302
655
  #: lib/Config/PopulatorData/Templates/SimpleText.php:139
656
  #: lib/Config/PopulatorData/Templates/WelcomeBlank12Column.php:285
657
  #: lib/Config/PopulatorData/Templates/WelcomeBlank1Column.php:194
@@ -797,17 +797,19 @@ msgid ""
797
  "below.</span></p>"
798
  msgstr ""
799
 
800
- #: lib/Config/PopulatorData/Templates/PostNotificationsBlank1Column.php:178
801
- #: views/newsletter/editor.html:974 views/newsletter/editor.html:1098
 
802
  msgid "Author:"
803
  msgstr ""
804
 
805
- #: lib/Config/PopulatorData/Templates/PostNotificationsBlank1Column.php:180
806
- #: views/newsletter/editor.html:976 views/newsletter/editor.html:1100
 
807
  msgid "Categories:"
808
  msgstr ""
809
 
810
- #: lib/Config/PopulatorData/Templates/PostNotificationsBlank1Column.php:185
811
  msgid "Read the post"
812
  msgstr ""
813
 
@@ -1427,7 +1429,7 @@ msgstr ""
1427
  msgid "Bounced"
1428
  msgstr ""
1429
 
1430
- #: lib/Newsletter/Editor/PostContentManager.php:88
1431
  msgid "Click here to view media."
1432
  msgstr ""
1433
 
@@ -1517,7 +1519,7 @@ msgid "Unsubscribe link"
1517
  msgstr ""
1518
 
1519
  #: lib/Newsletter/Shortcodes/ShortcodesHelper.php:85
1520
- #: views/newsletter/editor.html:1056
1521
  msgid "Unsubscribe"
1522
  msgstr ""
1523
 
@@ -1526,7 +1528,7 @@ msgid "Edit subscription page link"
1526
  msgstr ""
1527
 
1528
  #: lib/Newsletter/Shortcodes/ShortcodesHelper.php:93
1529
- #: views/newsletter/editor.html:1056
1530
  msgid "Manage subscription"
1531
  msgstr ""
1532
 
@@ -1681,10 +1683,14 @@ msgstr ""
1681
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:183
1682
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:209
1683
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:287
 
 
 
 
1684
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:85
1685
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:139
1686
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:165
1687
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:227
1688
  #: views/premium.html:62 views/premium.html:63 views/settings/advanced.html:122
1689
  #: views/settings/advanced.html:162 views/settings/advanced.html:202
1690
  #: views/settings/bounce.html:148 views/settings/bounce.html:179
@@ -2044,8 +2050,10 @@ msgstr ""
2044
  #: views/form/templates/settings/required.hbs:9
2045
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:124
2046
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:281
 
 
2047
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:79
2048
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:221
2049
  #: views/premium.html:56 views/settings/advanced.html:111
2050
  #: views/settings/advanced.html:151 views/settings/advanced.html:191
2051
  #: views/settings/bounce.html:190 views/settings/mta.html:588
@@ -2103,6 +2111,7 @@ msgstr ""
2103
  #: views/form/templates/settings/field_form.hbs:61
2104
  #: views/form/templates/settings/submit.hbs:2
2105
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:299
 
2106
  #: views/newsletter/templates/blocks/button/settings.hbs:117
2107
  #: views/newsletter/templates/blocks/container/settings.hbs:14
2108
  #: views/newsletter/templates/blocks/divider/settings.hbs:37
@@ -2568,357 +2577,382 @@ msgstr ""
2568
  msgid "IMPORT STOPPED BY USER"
2569
  msgstr ""
2570
 
2571
- #: views/newsletter/editor.html:256
2572
  msgid "Insert/edit link"
2573
  msgstr ""
2574
 
2575
- #: views/newsletter/editor.html:263
2576
  msgid "Type"
2577
  msgstr ""
2578
 
2579
- #: views/newsletter/editor.html:265
2580
  msgid "Link to a web page"
2581
  msgstr ""
2582
 
2583
- #: views/newsletter/editor.html:266
2584
  msgid "Browser version"
2585
  msgstr ""
2586
 
2587
- #: views/newsletter/editor.html:267
2588
  msgid "Unsubcribe page"
2589
  msgstr ""
2590
 
2591
- #: views/newsletter/editor.html:268
2592
  msgid "Manage your subscription page"
2593
  msgstr ""
2594
 
2595
- #: views/newsletter/editor.html:273 views/newsletter/editor.html:913
2596
- #: views/newsletter/editor.html:918 views/newsletter/editor.html:923
2597
- #: views/newsletter/editor.html:928 views/newsletter/editor.html:933
2598
- #: views/newsletter/editor.html:943 views/newsletter/editor.html:948
2599
- #: views/newsletter/editor.html:953 views/newsletter/editor.html:958
2600
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:237
 
2601
  #: views/newsletter/templates/blocks/button/settings.hbs:14
2602
  #: views/newsletter/templates/blocks/image/settings.hbs:4
2603
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:193
2604
  msgid "Link"
2605
  msgstr ""
2606
 
2607
- #: views/newsletter/editor.html:276
2608
  msgid "Title"
2609
  msgstr ""
2610
 
2611
- #: views/newsletter/editor.html:279
2612
  msgid "Open link in a new window/tab"
2613
  msgstr ""
2614
 
2615
- #: views/newsletter/editor.html:285
2616
  msgid "Search your content"
2617
  msgstr ""
2618
 
2619
- #: views/newsletter/editor.html:297
2620
  msgid "No search term specified. Showing recent items."
2621
  msgstr ""
2622
 
2623
- #: views/newsletter/editor.html:307
2624
  msgid "Add Link"
2625
  msgstr ""
2626
 
2627
- #: views/newsletter/editor.html:310
2628
  #: views/newsletter/templates/blocks/base/toolsGeneric.hbs:6
2629
  #: views/newsletters.html:270
2630
  #: views/subscribers/importExport/import/step2.html:150
2631
  msgid "Cancel"
2632
  msgstr ""
2633
 
2634
- #: views/newsletter/editor.html:318
2635
  msgid ""
2636
  "Didn't receive the test email? Read our [link]quick guide[/link] to sending "
2637
  "issues. <br><br>A MailPoet logo will appear in the footer of all emails "
2638
  "sent with the free version of MailPoet."
2639
  msgstr ""
2640
 
2641
- #: views/newsletter/editor.html:322
2642
  msgid "Failed to fetch available posts"
2643
  msgstr ""
2644
 
2645
- #: views/newsletter/editor.html:323
2646
  msgid "Failed to fetch rendered posts"
2647
  msgstr ""
2648
 
2649
- #: views/newsletter/editor.html:324
2650
  msgid "Select a shortcode"
2651
  msgstr ""
2652
 
2653
- #: views/newsletter/editor.html:325
2654
  msgid ""
2655
  "All emails must include an \"Unsubscribe\" link. Add a footer widget to "
2656
  "your email to continue."
2657
  msgstr ""
2658
 
2659
- #: views/newsletter/editor.html:326
2660
  msgid ""
2661
  "Please add an \"Automated Latest Content\" widget to the email from the "
2662
  "right sidebar."
2663
  msgstr ""
2664
 
2665
- #: views/newsletter/editor.html:327
2666
  msgid "Enter an email address to send the preview newsletter to."
2667
  msgstr ""
2668
 
2669
- #: views/newsletter/editor.html:328
2670
  msgid "Your test email has been sent!"
2671
  msgstr ""
2672
 
2673
- #: views/newsletter/editor.html:329
2674
  msgid "Please add a template name"
2675
  msgstr ""
2676
 
2677
- #: views/newsletter/editor.html:331
2678
  msgid ""
2679
  "We only include fonts that will display in all email clients. We understand "
2680
  "it can feel limiting!"
2681
  msgstr ""
2682
 
2683
- #: views/newsletter/editor.html:332
2684
  msgid ""
2685
  "You can add MailPoet shortcodes here. For example, you can add your "
2686
  "subscribers' first names by using this shortcode: [subscriber:firstname | "
2687
  "default:reader] Simply copy and paste the shortcode into the field."
2688
  msgstr ""
2689
 
2690
- #: views/newsletter/editor.html:333
2691
  msgid ""
2692
  "This optional text will appear in your subscribers' inboxes, beside the "
2693
  "subject line. Write something enticing!"
2694
  msgstr ""
2695
 
2696
- #: views/newsletter/editor.html:334
2697
  msgid ""
2698
  "This option eliminates padding around the image. It only works if the image "
2699
  "is larger than the column size."
2700
  msgstr ""
2701
 
2702
- #: views/newsletter/editor.html:335
2703
  msgid ""
2704
  "Use images with widths of at least 1,000 pixels to ensure sharp display on "
2705
  "high density screens, like mobile devices."
2706
  msgstr ""
2707
 
2708
- #: views/newsletter/editor.html:336
2709
  msgid "Template has been saved."
2710
  msgstr ""
2711
 
2712
- #: views/newsletter/editor.html:337
2713
  msgid "Template has not been saved, please try again"
2714
  msgstr ""
2715
 
2716
- #: views/newsletter/editor.html:338
2717
  msgid "Categories & tags"
2718
  msgstr ""
2719
 
2720
- #: views/newsletter/editor.html:339
2721
  msgid "There is no content to display."
2722
  msgstr ""
2723
 
2724
- #: views/newsletter/editor.html:340
2725
  msgid ""
2726
  "Your preview should open in a new tab. Please ensure your browser is not "
2727
  "blocking popups from this page."
2728
  msgstr ""
2729
 
2730
- #: views/newsletter/editor.html:341
2731
  msgid "Newsletter Preview"
2732
  msgstr ""
2733
 
2734
- #: views/newsletter/editor.html:342
2735
  msgid ""
2736
  "Contents of this newsletter are corrupted and may be lost, you may need to "
2737
  "add new content to this newsletter, or create a new one. If possible, "
2738
  "please contact us and report this issue."
2739
  msgstr ""
2740
 
2741
- #: views/newsletter/editor.html:343
2742
  msgid "Saving..."
2743
  msgstr ""
2744
 
2745
- #: views/newsletter/editor.html:344
2746
  msgid "There are unsaved changes which will be lost if you leave this page."
2747
  msgstr ""
2748
 
2749
- #: views/newsletter/editor.html:347
2750
  msgid "Email sending has been paused."
2751
  msgstr ""
2752
 
2753
- #: views/newsletter/editor.html:349 views/newsletters.html:58
2754
  msgid "Select type"
2755
  msgstr ""
2756
 
2757
- #: views/newsletter/editor.html:350 views/newsletters.html:59
2758
  msgid "Events"
2759
  msgstr ""
2760
 
2761
- #: views/newsletter/editor.html:352 views/newsletters.html:61
2762
  msgid "Template"
2763
  msgstr ""
2764
 
2765
- #: views/newsletter/editor.html:353 views/newsletters.html:62
2766
  msgid "Designer"
2767
  msgstr ""
2768
 
2769
- #: views/newsletter/editor.html:354 views/newsletters.html:63
2770
  msgid "Send"
2771
  msgstr ""
2772
 
2773
- #: views/newsletter/editor.html:932
2774
  msgid "Website"
2775
  msgstr ""
2776
 
2777
- #: views/newsletter/editor.html:957
2778
  msgid "Custom"
2779
  msgstr ""
2780
 
2781
- #: views/newsletter/editor.html:978 views/newsletter/editor.html:980
2782
- #: views/newsletter/editor.html:1102 views/newsletter/editor.html:1104
 
2783
  msgid "Read more"
2784
  msgstr ""
2785
 
2786
- #: views/newsletter/editor.html:1018
2787
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:243
 
2788
  #: views/newsletter/templates/blocks/button/settings.hbs:1
2789
  #: views/newsletter/templates/blocks/button/widget.hbs:4
2790
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:199
2791
  msgid "Button"
2792
  msgstr ""
2793
 
2794
- #: views/newsletter/editor.html:1056
2795
  msgid "Add your postal address here!"
2796
  msgstr ""
2797
 
2798
- #: views/newsletter/editor.html:1076
2799
  msgid "An image of..."
2800
  msgstr ""
2801
 
2802
- #: views/newsletter/editor.html:1153
2803
  msgid "Facebook"
2804
  msgstr ""
2805
 
2806
- #: views/newsletter/editor.html:1164
2807
  msgid "Twitter"
2808
  msgstr ""
2809
 
2810
- #: views/newsletter/editor.html:1177
2811
  msgid "Edit this to insert text."
2812
  msgstr ""
2813
 
2814
- #: views/newsletter/editor.html:1180
2815
  msgid "Display problems?"
2816
  msgstr ""
2817
 
2818
- #: views/newsletter/editor.html:1181
2819
  msgid "Open this email in your web browser."
2820
  msgstr ""
2821
 
2822
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:1
 
2823
  #: views/newsletter/templates/blocks/posts/settings.hbs:1
2824
  msgid "Post selection"
2825
  msgstr ""
2826
 
2827
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:4
 
2828
  msgid "Show:"
2829
  msgstr ""
2830
 
2831
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:8
 
2832
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:6
2833
  #: views/newsletter/templates/blocks/posts/widget.hbs:4
2834
  msgid "Posts"
2835
  msgstr ""
2836
 
2837
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:9
 
2838
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:7
2839
  msgid "Pages"
2840
  msgstr ""
2841
 
2842
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:10
 
2843
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:8
2844
  msgid "MailPoet pages"
2845
  msgstr ""
2846
 
2847
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:26
 
2848
  msgid "Include"
2849
  msgstr ""
2850
 
2851
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:32
 
2852
  msgid "Exclude"
2853
  msgstr ""
2854
 
2855
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:41
 
2856
  #: views/newsletter/templates/blocks/posts/settings.hbs:7
2857
  msgid "Display options"
2858
  msgstr ""
2859
 
2860
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:45
 
2861
  msgid "Hide display options"
2862
  msgstr ""
2863
 
2864
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:52
 
2865
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:5
2866
  msgid "Excerpt"
2867
  msgstr ""
2868
 
2869
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:58
 
2870
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:11
2871
  msgid "Full post"
2872
  msgstr ""
2873
 
2874
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:64
 
2875
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:17
2876
  msgid "Title only"
2877
  msgstr ""
2878
 
2879
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:70
 
2880
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:25
2881
  msgid "Title Format"
2882
  msgstr ""
2883
 
2884
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:74
 
2885
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:29
2886
  #: views/newsletter/templates/components/sidebar/styles.hbs:34
2887
  msgid "Heading 1"
2888
  msgstr ""
2889
 
2890
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:80
 
2891
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:35
2892
  #: views/newsletter/templates/components/sidebar/styles.hbs:49
2893
  msgid "Heading 2"
2894
  msgstr ""
2895
 
2896
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:86
 
2897
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:41
2898
  #: views/newsletter/templates/components/sidebar/styles.hbs:64
2899
  msgid "Heading 3"
2900
  msgstr ""
2901
 
2902
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:92
 
2903
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:47
2904
  msgid "Show as list"
2905
  msgstr ""
2906
 
2907
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:98
 
2908
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:53
2909
  msgid "Title Alignment"
2910
  msgstr ""
2911
 
2912
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:102
 
 
2913
  #: views/newsletter/templates/blocks/button/settings.hbs:27
2914
  #: views/newsletter/templates/blocks/footer/settings.hbs:41
2915
  #: views/newsletter/templates/blocks/header/settings.hbs:41
2916
  #: views/newsletter/templates/blocks/image/settings.hbs:65
2917
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:57
 
2918
  msgid "Left"
2919
  msgstr ""
2920
 
2921
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:108
 
2922
  #: views/newsletter/templates/blocks/button/settings.hbs:33
2923
  #: views/newsletter/templates/blocks/footer/settings.hbs:47
2924
  #: views/newsletter/templates/blocks/header/settings.hbs:47
@@ -2928,25 +2962,29 @@ msgid "Center"
2928
  msgstr ""
2929
 
2930
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:114
 
 
2931
  #: views/newsletter/templates/blocks/button/settings.hbs:39
2932
  #: views/newsletter/templates/blocks/footer/settings.hbs:53
2933
  #: views/newsletter/templates/blocks/header/settings.hbs:53
2934
  #: views/newsletter/templates/blocks/image/settings.hbs:77
2935
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:69
 
2936
  msgid "Right"
2937
  msgstr ""
2938
 
2939
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:120
 
2940
  msgid "Title as links"
2941
  msgstr ""
2942
 
2943
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:138
 
2944
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:95
2945
  msgid "Featured image position"
2946
  msgstr ""
2947
 
2948
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:142
2949
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:99
2950
  msgid "Below title"
2951
  msgstr ""
2952
 
@@ -2955,94 +2993,124 @@ msgid "Above title"
2955
  msgstr ""
2956
 
2957
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:154
2958
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:111
 
2959
  #: views/premium.html:55
2960
  msgid "None"
2961
  msgstr ""
2962
 
2963
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:161
2964
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:117
 
2965
  msgid "Image width"
2966
  msgstr ""
2967
 
2968
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:165
 
2969
  #: views/newsletter/templates/blocks/image/settings.hbs:55
2970
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:121
2971
  msgid "Full width"
2972
  msgstr ""
2973
 
2974
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:171
2975
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:127
 
2976
  msgid "Padded"
2977
  msgstr ""
2978
 
2979
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:179
2980
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:135
 
2981
  msgid "Show author"
2982
  msgstr ""
2983
 
2984
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:189
2985
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:215
2986
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:145
2987
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:171
 
 
2988
  msgid "Above text"
2989
  msgstr ""
2990
 
2991
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:195
2992
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:221
2993
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:151
2994
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:177
 
 
2995
  msgid "Below text"
2996
  msgstr ""
2997
 
2998
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:198
2999
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:224
3000
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:154
3001
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:180
 
 
3002
  msgid "Preceded by:"
3003
  msgstr ""
3004
 
3005
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:205
3006
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:161
 
3007
  msgid "Show categories"
3008
  msgstr ""
3009
 
3010
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:233
3011
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:189
 
3012
  msgid "\"Read more\" text"
3013
  msgstr ""
3014
 
3015
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:252
3016
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:208
 
3017
  msgid "Design a button"
3018
  msgstr ""
3019
 
3020
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:260
 
3021
  msgid "Sort by"
3022
  msgstr ""
3023
 
3024
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:264
 
3025
  msgid "Newest"
3026
  msgstr ""
3027
 
3028
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:270
 
3029
  msgid "Oldest"
3030
  msgstr ""
3031
 
3032
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:277
3033
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:217
 
3034
  msgid "Show divider between posts"
3035
  msgstr ""
3036
 
3037
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:291
3038
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:231
 
3039
  msgid "Select divider"
3040
  msgstr ""
3041
 
3042
  #: views/newsletter/templates/blocks/automatedLatestContent/widget.hbs:4
 
3043
  msgid "Automatic Latest Content"
3044
  msgstr ""
3045
 
 
 
 
 
 
 
 
 
 
 
3046
  #: views/newsletter/templates/blocks/base/toolsGeneric.hbs:2
3047
  msgid "Switch editing layer"
3048
  msgstr ""
@@ -3214,10 +3282,6 @@ msgstr ""
3214
  msgid "Make the post title into a link"
3215
  msgstr ""
3216
 
3217
- #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:105
3218
- msgid "Above block"
3219
- msgstr ""
3220
-
3221
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:3
3222
  msgid "Search..."
3223
  msgstr ""
@@ -5608,17 +5672,17 @@ msgctxt "Form input type"
5608
  msgid "Select"
5609
  msgstr ""
5610
 
5611
- #: views/newsletter/editor.html:345
5612
  msgctxt "select color"
5613
  msgid "Select"
5614
  msgstr ""
5615
 
5616
- #: views/newsletter/editor.html:346
5617
  msgctxt "cancel color selection"
5618
  msgid "Cancel"
5619
  msgstr ""
5620
 
5621
- #: views/newsletter/editor.html:351 views/newsletters.html:60
5622
  msgctxt "Configuration options for automatic email events"
5623
  msgid "Conditions"
5624
  msgstr ""
4
  msgstr ""
5
  "Project-Id-Version: \n"
6
  "Report-Msgid-Bugs-To: http://support.mailpoet.com/\n"
7
+ "POT-Creation-Date: 2018-06-05 16:20:27+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
78
  #: lib/API/MP/v1/API.php:18
79
  #: lib/Subscribers/ImportExport/ImportExportFactory.php:44
80
  #: lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php:40
81
+ #: views/newsletter/editor.html:959 views/newsletter/editor.html:960
82
  msgid "Email"
83
  msgstr ""
84
 
412
  msgid "Newsletter"
413
  msgstr ""
414
 
415
+ #: lib/Config/Menu.php:113 views/newsletter/editor.html:240
416
  msgid "Newsletter Editor"
417
  msgstr ""
418
 
651
  #: lib/Config/PopulatorData/Templates/NewsletterBlank12Column.php:255
652
  #: lib/Config/PopulatorData/Templates/NewsletterBlank13Column.php:278
653
  #: lib/Config/PopulatorData/Templates/NewsletterBlank1Column.php:194
654
+ #: lib/Config/PopulatorData/Templates/PostNotificationsBlank1Column.php:281
655
  #: lib/Config/PopulatorData/Templates/SimpleText.php:139
656
  #: lib/Config/PopulatorData/Templates/WelcomeBlank12Column.php:285
657
  #: lib/Config/PopulatorData/Templates/WelcomeBlank1Column.php:194
797
  "below.</span></p>"
798
  msgstr ""
799
 
800
+ #: lib/Config/PopulatorData/Templates/PostNotificationsBlank1Column.php:161
801
+ #: views/newsletter/editor.html:997 views/newsletter/editor.html:1052
802
+ #: views/newsletter/editor.html:1177
803
  msgid "Author:"
804
  msgstr ""
805
 
806
+ #: lib/Config/PopulatorData/Templates/PostNotificationsBlank1Column.php:163
807
+ #: views/newsletter/editor.html:999 views/newsletter/editor.html:1054
808
+ #: views/newsletter/editor.html:1179
809
  msgid "Categories:"
810
  msgstr ""
811
 
812
+ #: lib/Config/PopulatorData/Templates/PostNotificationsBlank1Column.php:168
813
  msgid "Read the post"
814
  msgstr ""
815
 
1429
  msgid "Bounced"
1430
  msgstr ""
1431
 
1432
+ #: lib/Newsletter/Editor/PostContentManager.php:92
1433
  msgid "Click here to view media."
1434
  msgstr ""
1435
 
1519
  msgstr ""
1520
 
1521
  #: lib/Newsletter/Shortcodes/ShortcodesHelper.php:85
1522
+ #: views/newsletter/editor.html:1134
1523
  msgid "Unsubscribe"
1524
  msgstr ""
1525
 
1528
  msgstr ""
1529
 
1530
  #: lib/Newsletter/Shortcodes/ShortcodesHelper.php:93
1531
+ #: views/newsletter/editor.html:1134
1532
  msgid "Manage subscription"
1533
  msgstr ""
1534
 
1683
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:183
1684
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:209
1685
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:287
1686
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:130
1687
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:195
1688
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:221
1689
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:299
1690
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:85
1691
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:151
1692
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:177
1693
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:239
1694
  #: views/premium.html:62 views/premium.html:63 views/settings/advanced.html:122
1695
  #: views/settings/advanced.html:162 views/settings/advanced.html:202
1696
  #: views/settings/bounce.html:148 views/settings/bounce.html:179
2050
  #: views/form/templates/settings/required.hbs:9
2051
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:124
2052
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:281
2053
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:124
2054
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:293
2055
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:79
2056
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:233
2057
  #: views/premium.html:56 views/settings/advanced.html:111
2058
  #: views/settings/advanced.html:151 views/settings/advanced.html:191
2059
  #: views/settings/bounce.html:190 views/settings/mta.html:588
2111
  #: views/form/templates/settings/field_form.hbs:61
2112
  #: views/form/templates/settings/submit.hbs:2
2113
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:299
2114
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:311
2115
  #: views/newsletter/templates/blocks/button/settings.hbs:117
2116
  #: views/newsletter/templates/blocks/container/settings.hbs:14
2117
  #: views/newsletter/templates/blocks/divider/settings.hbs:37
2577
  msgid "IMPORT STOPPED BY USER"
2578
  msgstr ""
2579
 
2580
+ #: views/newsletter/editor.html:268
2581
  msgid "Insert/edit link"
2582
  msgstr ""
2583
 
2584
+ #: views/newsletter/editor.html:275
2585
  msgid "Type"
2586
  msgstr ""
2587
 
2588
+ #: views/newsletter/editor.html:277
2589
  msgid "Link to a web page"
2590
  msgstr ""
2591
 
2592
+ #: views/newsletter/editor.html:278
2593
  msgid "Browser version"
2594
  msgstr ""
2595
 
2596
+ #: views/newsletter/editor.html:279
2597
  msgid "Unsubcribe page"
2598
  msgstr ""
2599
 
2600
+ #: views/newsletter/editor.html:280
2601
  msgid "Manage your subscription page"
2602
  msgstr ""
2603
 
2604
+ #: views/newsletter/editor.html:285 views/newsletter/editor.html:935
2605
+ #: views/newsletter/editor.html:940 views/newsletter/editor.html:945
2606
+ #: views/newsletter/editor.html:950 views/newsletter/editor.html:955
2607
+ #: views/newsletter/editor.html:965 views/newsletter/editor.html:970
2608
+ #: views/newsletter/editor.html:975 views/newsletter/editor.html:980
2609
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:237
2610
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:249
2611
  #: views/newsletter/templates/blocks/button/settings.hbs:14
2612
  #: views/newsletter/templates/blocks/image/settings.hbs:4
2613
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:205
2614
  msgid "Link"
2615
  msgstr ""
2616
 
2617
+ #: views/newsletter/editor.html:288
2618
  msgid "Title"
2619
  msgstr ""
2620
 
2621
+ #: views/newsletter/editor.html:291
2622
  msgid "Open link in a new window/tab"
2623
  msgstr ""
2624
 
2625
+ #: views/newsletter/editor.html:297
2626
  msgid "Search your content"
2627
  msgstr ""
2628
 
2629
+ #: views/newsletter/editor.html:309
2630
  msgid "No search term specified. Showing recent items."
2631
  msgstr ""
2632
 
2633
+ #: views/newsletter/editor.html:319
2634
  msgid "Add Link"
2635
  msgstr ""
2636
 
2637
+ #: views/newsletter/editor.html:322
2638
  #: views/newsletter/templates/blocks/base/toolsGeneric.hbs:6
2639
  #: views/newsletters.html:270
2640
  #: views/subscribers/importExport/import/step2.html:150
2641
  msgid "Cancel"
2642
  msgstr ""
2643
 
2644
+ #: views/newsletter/editor.html:330
2645
  msgid ""
2646
  "Didn't receive the test email? Read our [link]quick guide[/link] to sending "
2647
  "issues. <br><br>A MailPoet logo will appear in the footer of all emails "
2648
  "sent with the free version of MailPoet."
2649
  msgstr ""
2650
 
2651
+ #: views/newsletter/editor.html:334
2652
  msgid "Failed to fetch available posts"
2653
  msgstr ""
2654
 
2655
+ #: views/newsletter/editor.html:335
2656
  msgid "Failed to fetch rendered posts"
2657
  msgstr ""
2658
 
2659
+ #: views/newsletter/editor.html:336
2660
  msgid "Select a shortcode"
2661
  msgstr ""
2662
 
2663
+ #: views/newsletter/editor.html:337
2664
  msgid ""
2665
  "All emails must include an \"Unsubscribe\" link. Add a footer widget to "
2666
  "your email to continue."
2667
  msgstr ""
2668
 
2669
+ #: views/newsletter/editor.html:338
2670
  msgid ""
2671
  "Please add an \"Automated Latest Content\" widget to the email from the "
2672
  "right sidebar."
2673
  msgstr ""
2674
 
2675
+ #: views/newsletter/editor.html:339
2676
  msgid "Enter an email address to send the preview newsletter to."
2677
  msgstr ""
2678
 
2679
+ #: views/newsletter/editor.html:340
2680
  msgid "Your test email has been sent!"
2681
  msgstr ""
2682
 
2683
+ #: views/newsletter/editor.html:341
2684
  msgid "Please add a template name"
2685
  msgstr ""
2686
 
2687
+ #: views/newsletter/editor.html:343
2688
  msgid ""
2689
  "We only include fonts that will display in all email clients. We understand "
2690
  "it can feel limiting!"
2691
  msgstr ""
2692
 
2693
+ #: views/newsletter/editor.html:344
2694
  msgid ""
2695
  "You can add MailPoet shortcodes here. For example, you can add your "
2696
  "subscribers' first names by using this shortcode: [subscriber:firstname | "
2697
  "default:reader] Simply copy and paste the shortcode into the field."
2698
  msgstr ""
2699
 
2700
+ #: views/newsletter/editor.html:345
2701
  msgid ""
2702
  "This optional text will appear in your subscribers' inboxes, beside the "
2703
  "subject line. Write something enticing!"
2704
  msgstr ""
2705
 
2706
+ #: views/newsletter/editor.html:346
2707
  msgid ""
2708
  "This option eliminates padding around the image. It only works if the image "
2709
  "is larger than the column size."
2710
  msgstr ""
2711
 
2712
+ #: views/newsletter/editor.html:347
2713
  msgid ""
2714
  "Use images with widths of at least 1,000 pixels to ensure sharp display on "
2715
  "high density screens, like mobile devices."
2716
  msgstr ""
2717
 
2718
+ #: views/newsletter/editor.html:348
2719
  msgid "Template has been saved."
2720
  msgstr ""
2721
 
2722
+ #: views/newsletter/editor.html:349
2723
  msgid "Template has not been saved, please try again"
2724
  msgstr ""
2725
 
2726
+ #: views/newsletter/editor.html:350
2727
  msgid "Categories & tags"
2728
  msgstr ""
2729
 
2730
+ #: views/newsletter/editor.html:351
2731
  msgid "There is no content to display."
2732
  msgstr ""
2733
 
2734
+ #: views/newsletter/editor.html:352
2735
  msgid ""
2736
  "Your preview should open in a new tab. Please ensure your browser is not "
2737
  "blocking popups from this page."
2738
  msgstr ""
2739
 
2740
+ #: views/newsletter/editor.html:353
2741
  msgid "Newsletter Preview"
2742
  msgstr ""
2743
 
2744
+ #: views/newsletter/editor.html:354
2745
  msgid ""
2746
  "Contents of this newsletter are corrupted and may be lost, you may need to "
2747
  "add new content to this newsletter, or create a new one. If possible, "
2748
  "please contact us and report this issue."
2749
  msgstr ""
2750
 
2751
+ #: views/newsletter/editor.html:355
2752
  msgid "Saving..."
2753
  msgstr ""
2754
 
2755
+ #: views/newsletter/editor.html:356
2756
  msgid "There are unsaved changes which will be lost if you leave this page."
2757
  msgstr ""
2758
 
2759
+ #: views/newsletter/editor.html:359
2760
  msgid "Email sending has been paused."
2761
  msgstr ""
2762
 
2763
+ #: views/newsletter/editor.html:361 views/newsletters.html:58
2764
  msgid "Select type"
2765
  msgstr ""
2766
 
2767
+ #: views/newsletter/editor.html:362 views/newsletters.html:59
2768
  msgid "Events"
2769
  msgstr ""
2770
 
2771
+ #: views/newsletter/editor.html:364 views/newsletters.html:61
2772
  msgid "Template"
2773
  msgstr ""
2774
 
2775
+ #: views/newsletter/editor.html:365 views/newsletters.html:62
2776
  msgid "Designer"
2777
  msgstr ""
2778
 
2779
+ #: views/newsletter/editor.html:366 views/newsletters.html:63
2780
  msgid "Send"
2781
  msgstr ""
2782
 
2783
+ #: views/newsletter/editor.html:954
2784
  msgid "Website"
2785
  msgstr ""
2786
 
2787
+ #: views/newsletter/editor.html:979
2788
  msgid "Custom"
2789
  msgstr ""
2790
 
2791
+ #: views/newsletter/editor.html:1001 views/newsletter/editor.html:1003
2792
+ #: views/newsletter/editor.html:1056 views/newsletter/editor.html:1058
2793
+ #: views/newsletter/editor.html:1181 views/newsletter/editor.html:1183
2794
  msgid "Read more"
2795
  msgstr ""
2796
 
2797
+ #: views/newsletter/editor.html:1096
2798
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:243
2799
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:255
2800
  #: views/newsletter/templates/blocks/button/settings.hbs:1
2801
  #: views/newsletter/templates/blocks/button/widget.hbs:4
2802
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:211
2803
  msgid "Button"
2804
  msgstr ""
2805
 
2806
+ #: views/newsletter/editor.html:1134
2807
  msgid "Add your postal address here!"
2808
  msgstr ""
2809
 
2810
+ #: views/newsletter/editor.html:1154
2811
  msgid "An image of..."
2812
  msgstr ""
2813
 
2814
+ #: views/newsletter/editor.html:1232
2815
  msgid "Facebook"
2816
  msgstr ""
2817
 
2818
+ #: views/newsletter/editor.html:1243
2819
  msgid "Twitter"
2820
  msgstr ""
2821
 
2822
+ #: views/newsletter/editor.html:1256
2823
  msgid "Edit this to insert text."
2824
  msgstr ""
2825
 
2826
+ #: views/newsletter/editor.html:1259
2827
  msgid "Display problems?"
2828
  msgstr ""
2829
 
2830
+ #: views/newsletter/editor.html:1260
2831
  msgid "Open this email in your web browser."
2832
  msgstr ""
2833
 
2834
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:1
2835
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:1
2836
  #: views/newsletter/templates/blocks/posts/settings.hbs:1
2837
  msgid "Post selection"
2838
  msgstr ""
2839
 
2840
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:4
2841
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:4
2842
  msgid "Show:"
2843
  msgstr ""
2844
 
2845
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:8
2846
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:8
2847
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:6
2848
  #: views/newsletter/templates/blocks/posts/widget.hbs:4
2849
  msgid "Posts"
2850
  msgstr ""
2851
 
2852
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:9
2853
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:9
2854
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:7
2855
  msgid "Pages"
2856
  msgstr ""
2857
 
2858
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:10
2859
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:10
2860
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:8
2861
  msgid "MailPoet pages"
2862
  msgstr ""
2863
 
2864
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:26
2865
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:26
2866
  msgid "Include"
2867
  msgstr ""
2868
 
2869
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:32
2870
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:32
2871
  msgid "Exclude"
2872
  msgstr ""
2873
 
2874
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:41
2875
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:41
2876
  #: views/newsletter/templates/blocks/posts/settings.hbs:7
2877
  msgid "Display options"
2878
  msgstr ""
2879
 
2880
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:45
2881
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:45
2882
  msgid "Hide display options"
2883
  msgstr ""
2884
 
2885
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:52
2886
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:52
2887
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:5
2888
  msgid "Excerpt"
2889
  msgstr ""
2890
 
2891
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:58
2892
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:58
2893
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:11
2894
  msgid "Full post"
2895
  msgstr ""
2896
 
2897
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:64
2898
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:64
2899
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:17
2900
  msgid "Title only"
2901
  msgstr ""
2902
 
2903
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:70
2904
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:70
2905
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:25
2906
  msgid "Title Format"
2907
  msgstr ""
2908
 
2909
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:74
2910
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:74
2911
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:29
2912
  #: views/newsletter/templates/components/sidebar/styles.hbs:34
2913
  msgid "Heading 1"
2914
  msgstr ""
2915
 
2916
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:80
2917
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:80
2918
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:35
2919
  #: views/newsletter/templates/components/sidebar/styles.hbs:49
2920
  msgid "Heading 2"
2921
  msgstr ""
2922
 
2923
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:86
2924
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:86
2925
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:41
2926
  #: views/newsletter/templates/components/sidebar/styles.hbs:64
2927
  msgid "Heading 3"
2928
  msgstr ""
2929
 
2930
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:92
2931
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:92
2932
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:47
2933
  msgid "Show as list"
2934
  msgstr ""
2935
 
2936
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:98
2937
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:98
2938
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:53
2939
  msgid "Title Alignment"
2940
  msgstr ""
2941
 
2942
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:102
2943
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:102
2944
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:148
2945
  #: views/newsletter/templates/blocks/button/settings.hbs:27
2946
  #: views/newsletter/templates/blocks/footer/settings.hbs:41
2947
  #: views/newsletter/templates/blocks/header/settings.hbs:41
2948
  #: views/newsletter/templates/blocks/image/settings.hbs:65
2949
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:57
2950
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:105
2951
  msgid "Left"
2952
  msgstr ""
2953
 
2954
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:108
2955
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:108
2956
  #: views/newsletter/templates/blocks/button/settings.hbs:33
2957
  #: views/newsletter/templates/blocks/footer/settings.hbs:47
2958
  #: views/newsletter/templates/blocks/header/settings.hbs:47
2962
  msgstr ""
2963
 
2964
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:114
2965
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:114
2966
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:154
2967
  #: views/newsletter/templates/blocks/button/settings.hbs:39
2968
  #: views/newsletter/templates/blocks/footer/settings.hbs:53
2969
  #: views/newsletter/templates/blocks/header/settings.hbs:53
2970
  #: views/newsletter/templates/blocks/image/settings.hbs:77
2971
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:69
2972
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:111
2973
  msgid "Right"
2974
  msgstr ""
2975
 
2976
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:120
2977
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:120
2978
  msgid "Title as links"
2979
  msgstr ""
2980
 
2981
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:138
2982
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:138
2983
  #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:95
2984
  msgid "Featured image position"
2985
  msgstr ""
2986
 
2987
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:142
 
2988
  msgid "Below title"
2989
  msgstr ""
2990
 
2993
  msgstr ""
2994
 
2995
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:154
2996
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:166
2997
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:123
2998
  #: views/premium.html:55
2999
  msgid "None"
3000
  msgstr ""
3001
 
3002
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:161
3003
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:173
3004
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:129
3005
  msgid "Image width"
3006
  msgstr ""
3007
 
3008
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:165
3009
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:177
3010
  #: views/newsletter/templates/blocks/image/settings.hbs:55
3011
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:133
3012
  msgid "Full width"
3013
  msgstr ""
3014
 
3015
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:171
3016
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:183
3017
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:139
3018
  msgid "Padded"
3019
  msgstr ""
3020
 
3021
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:179
3022
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:191
3023
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:147
3024
  msgid "Show author"
3025
  msgstr ""
3026
 
3027
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:189
3028
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:215
3029
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:201
3030
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:227
3031
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:157
3032
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:183
3033
  msgid "Above text"
3034
  msgstr ""
3035
 
3036
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:195
3037
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:221
3038
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:207
3039
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:233
3040
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:163
3041
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:189
3042
  msgid "Below text"
3043
  msgstr ""
3044
 
3045
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:198
3046
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:224
3047
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:210
3048
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:236
3049
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:166
3050
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:192
3051
  msgid "Preceded by:"
3052
  msgstr ""
3053
 
3054
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:205
3055
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:217
3056
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:173
3057
  msgid "Show categories"
3058
  msgstr ""
3059
 
3060
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:233
3061
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:245
3062
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:201
3063
  msgid "\"Read more\" text"
3064
  msgstr ""
3065
 
3066
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:252
3067
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:264
3068
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:220
3069
  msgid "Design a button"
3070
  msgstr ""
3071
 
3072
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:260
3073
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:272
3074
  msgid "Sort by"
3075
  msgstr ""
3076
 
3077
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:264
3078
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:276
3079
  msgid "Newest"
3080
  msgstr ""
3081
 
3082
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:270
3083
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:282
3084
  msgid "Oldest"
3085
  msgstr ""
3086
 
3087
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:277
3088
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:289
3089
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:229
3090
  msgid "Show divider between posts"
3091
  msgstr ""
3092
 
3093
  #: views/newsletter/templates/blocks/automatedLatestContent/settings.hbs:291
3094
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:303
3095
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:243
3096
  msgid "Select divider"
3097
  msgstr ""
3098
 
3099
  #: views/newsletter/templates/blocks/automatedLatestContent/widget.hbs:4
3100
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/widget.hbs:4
3101
  msgid "Automatic Latest Content"
3102
  msgstr ""
3103
 
3104
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:142
3105
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:99
3106
+ msgid "Centered"
3107
+ msgstr ""
3108
+
3109
+ #: views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs:160
3110
+ #: views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs:117
3111
+ msgid "Alternate"
3112
+ msgstr ""
3113
+
3114
  #: views/newsletter/templates/blocks/base/toolsGeneric.hbs:2
3115
  msgid "Switch editing layer"
3116
  msgstr ""
3282
  msgid "Make the post title into a link"
3283
  msgstr ""
3284
 
 
 
 
 
3285
  #: views/newsletter/templates/blocks/posts/settingsSelection.hbs:3
3286
  msgid "Search..."
3287
  msgstr ""
5672
  msgid "Select"
5673
  msgstr ""
5674
 
5675
+ #: views/newsletter/editor.html:357
5676
  msgctxt "select color"
5677
  msgid "Select"
5678
  msgstr ""
5679
 
5680
+ #: views/newsletter/editor.html:358
5681
  msgctxt "cancel color selection"
5682
  msgid "Cancel"
5683
  msgstr ""
5684
 
5685
+ #: views/newsletter/editor.html:363 views/newsletters.html:60
5686
  msgctxt "Configuration options for automatic email events"
5687
  msgid "Conditions"
5688
  msgstr ""
lib/Config/Env.php CHANGED
@@ -5,6 +5,8 @@ namespace MailPoet\Config;
5
  if(!defined('ABSPATH')) exit;
6
 
7
  class Env {
 
 
8
  static $version;
9
  static $plugin_name;
10
  static $plugin_path;
5
  if(!defined('ABSPATH')) exit;
6
 
7
  class Env {
8
+ const NEWSLETTER_CONTENT_WIDTH = 1320;
9
+
10
  static $version;
11
  static $plugin_name;
12
  static $plugin_path;
lib/Config/Initializer.php CHANGED
@@ -213,7 +213,7 @@ class Initializer {
213
  }
214
 
215
  function setupImages() {
216
- add_image_size('mailpoet_newsletter_max', 1320);
217
  }
218
 
219
  function setupChangelog() {
@@ -301,4 +301,4 @@ class Initializer {
301
  }
302
  return WPNotice::displayError($exception);
303
  }
304
- }
213
  }
214
 
215
  function setupImages() {
216
+ add_image_size('mailpoet_newsletter_max', Env::NEWSLETTER_CONTENT_WIDTH);
217
  }
218
 
219
  function setupChangelog() {
301
  }
302
  return WPNotice::displayError($exception);
303
  }
304
+ }
lib/Config/PopulatorData/Templates/PostNotificationsBlank1Column.php CHANGED
@@ -130,93 +130,6 @@ class PostNotificationsBlank1Column {
130
  "borderColor" => "#aaaaaa"
131
  )
132
  )
133
- )
134
- )
135
- )
136
- )
137
- ),
138
- array(
139
- "type" => "container",
140
- "orientation" => "horizontal",
141
- "styles" => array(
142
- "block" => array(
143
- "backgroundColor" => "transparent"
144
- )
145
- ),
146
- "blocks" => array(
147
- array(
148
- "type" => "container",
149
- "orientation" => "vertical",
150
- "styles" => array(
151
- "block" => array(
152
- "backgroundColor" => "transparent"
153
- )
154
- ),
155
- "blocks" => array(
156
- array(
157
- "type" => "spacer",
158
- "styles" => array(
159
- "block" => array(
160
- "backgroundColor" => "transparent",
161
- "height" => "40px"
162
- )
163
- )
164
- ),
165
- array(
166
- "type" => "automatedLatestContent",
167
- "amount" => "3",
168
- "contentType" => "post",
169
- "terms" => array(),
170
- "inclusionType" => "include",
171
- "displayType" => "excerpt",
172
- "titleFormat" => "h3",
173
- "titleAlignment" => "left",
174
- "titleIsLink" => false,
175
- "imageFullWidth" => false,
176
- "featuredImagePosition" => "belowTitle",
177
- "showAuthor" => "no",
178
- "authorPrecededBy" => __("Author:", 'mailpoet'),
179
- "showCategories" => "no",
180
- "categoriesPrecededBy" => __("Categories:", 'mailpoet'),
181
- "readMoreType" => "button",
182
- "readMoreText" => "Read more",
183
- "readMoreButton" => array(
184
- "type" => "button",
185
- "text" => __("Read the post", 'mailpoet'),
186
- "url" => "[postLink]",
187
- "styles" => array(
188
- "block" => array(
189
- "backgroundColor" => "#2ea1cd",
190
- "borderColor" => "#0074a2",
191
- "borderWidth" => "1px",
192
- "borderRadius" => "5px",
193
- "borderStyle" => "solid",
194
- "width" => "160px",
195
- "lineHeight" => "30px",
196
- "fontColor" => "#ffffff",
197
- "fontFamily" => "Verdana",
198
- "fontSize" => "16px",
199
- "fontWeight" => "normal",
200
- "textAlign" => "center"
201
- )
202
- )
203
- ),
204
- "sortBy" => "newest",
205
- "showDivider" => true,
206
- "divider" => array(
207
- "type" => "divider",
208
- "styles" => array(
209
- "block" => array(
210
- "backgroundColor" => "transparent",
211
- "padding" => "13px",
212
- "borderStyle" => "solid",
213
- "borderWidth" => "3px",
214
- "borderColor" => "#aaaaaa"
215
- )
216
- )
217
- ),
218
- "backgroundColor" => "#ffffff",
219
- "backgroundColorAlternate" => "#eeeeee"
220
  ),
221
  array(
222
  "type" => "spacer",
@@ -231,6 +144,63 @@ class PostNotificationsBlank1Column {
231
  )
232
  )
233
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
  array(
235
  "type" => "container",
236
  "orientation" => "horizontal",
@@ -249,6 +219,15 @@ class PostNotificationsBlank1Column {
249
  )
250
  ),
251
  "blocks" => array(
 
 
 
 
 
 
 
 
 
252
  array(
253
  "type" => "divider",
254
  "styles" => array(
130
  "borderColor" => "#aaaaaa"
131
  )
132
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  ),
134
  array(
135
  "type" => "spacer",
144
  )
145
  )
146
  ),
147
+ array(
148
+ "type" => "automatedLatestContentLayout",
149
+ "withLayout" => true,
150
+ "amount" => "3",
151
+ "contentType" => "post",
152
+ "terms" => array(),
153
+ "inclusionType" => "include",
154
+ "displayType" => "excerpt",
155
+ "titleFormat" => "h3",
156
+ "titleAlignment" => "left",
157
+ "titleIsLink" => false,
158
+ "imageFullWidth" => false,
159
+ "featuredImagePosition" => "alternate",
160
+ "showAuthor" => "no",
161
+ "authorPrecededBy" => __("Author:", 'mailpoet'),
162
+ "showCategories" => "no",
163
+ "categoriesPrecededBy" => __("Categories:", 'mailpoet'),
164
+ "readMoreType" => "button",
165
+ "readMoreText" => "Read more",
166
+ "readMoreButton" => array(
167
+ "type" => "button",
168
+ "text" => __("Read the post", 'mailpoet'),
169
+ "url" => "[postLink]",
170
+ "styles" => array(
171
+ "block" => array(
172
+ "backgroundColor" => "#2ea1cd",
173
+ "borderColor" => "#0074a2",
174
+ "borderWidth" => "1px",
175
+ "borderRadius" => "5px",
176
+ "borderStyle" => "solid",
177
+ "width" => "160px",
178
+ "lineHeight" => "30px",
179
+ "fontColor" => "#ffffff",
180
+ "fontFamily" => "Verdana",
181
+ "fontSize" => "16px",
182
+ "fontWeight" => "normal",
183
+ "textAlign" => "center"
184
+ )
185
+ )
186
+ ),
187
+ "sortBy" => "newest",
188
+ "showDivider" => true,
189
+ "divider" => array(
190
+ "type" => "divider",
191
+ "styles" => array(
192
+ "block" => array(
193
+ "backgroundColor" => "transparent",
194
+ "padding" => "13px",
195
+ "borderStyle" => "solid",
196
+ "borderWidth" => "3px",
197
+ "borderColor" => "#aaaaaa"
198
+ )
199
+ )
200
+ ),
201
+ "backgroundColor" => "#ffffff",
202
+ "backgroundColorAlternate" => "#eeeeee"
203
+ ),
204
  array(
205
  "type" => "container",
206
  "orientation" => "horizontal",
219
  )
220
  ),
221
  "blocks" => array(
222
+ array(
223
+ "type" => "spacer",
224
+ "styles" => array(
225
+ "block" => array(
226
+ "backgroundColor" => "transparent",
227
+ "height" => "40px"
228
+ )
229
+ )
230
+ ),
231
  array(
232
  "type" => "divider",
233
  "styles" => array(
lib/Newsletter/Editor/LayoutHelper.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace MailPoet\Newsletter\Editor;
3
+
4
+ class LayoutHelper {
5
+ static function row($blocks) {
6
+ return array(
7
+ 'type' => 'container',
8
+ 'orientation' => 'horizontal',
9
+ 'styles' => array(
10
+ 'block' => array(
11
+ 'backgroundColor' => 'transparent'
12
+ )
13
+ ),
14
+ 'blocks' => $blocks
15
+ );
16
+ }
17
+
18
+ static function col($blocks) {
19
+ return array(
20
+ 'type' => 'container',
21
+ 'orientation' => 'vertical',
22
+ 'styles' => array(
23
+ 'block' => array(
24
+ 'backgroundColor' => 'transparent'
25
+ )
26
+ ),
27
+ 'blocks' => $blocks
28
+ );
29
+ }
30
+ }
lib/Newsletter/Editor/PostContentManager.php CHANGED
@@ -30,7 +30,7 @@ class PostContentManager {
30
  }
31
  }
32
 
33
- function filterContent($content) {
34
  $content = self::convertEmbeddedContent($content);
35
 
36
  // convert h4 h5 h6 to h3
@@ -45,11 +45,15 @@ class PostContentManager {
45
 
46
  // strip useless tags
47
  $tags_not_being_stripped = array(
48
- '<img>', '<p>', '<em>', '<span>', '<b>', '<strong>', '<i>', '<h1>',
49
- '<h2>', '<h3>', '<a>', '<ul>', '<ol>', '<li>', '<br>', '<blockquote>'
50
  );
51
  $content = strip_tags($content, implode('', $tags_not_being_stripped));
52
- $content = str_replace('<p', '<p class="' . self::WP_POST_CLASS .'"', wpautop($content));
 
 
 
 
53
  $content = trim($content);
54
 
55
  return $content;
30
  }
31
  }
32
 
33
+ function filterContent($content, $with_post_class = true) {
34
  $content = self::convertEmbeddedContent($content);
35
 
36
  // convert h4 h5 h6 to h3
45
 
46
  // strip useless tags
47
  $tags_not_being_stripped = array(
48
+ '<p>', '<em>', '<span>', '<b>', '<strong>', '<i>',
49
+ '<a>', '<ul>', '<ol>', '<li>', '<br>', '<blockquote>'
50
  );
51
  $content = strip_tags($content, implode('', $tags_not_being_stripped));
52
+ if($with_post_class) {
53
+ $content = str_replace('<p', '<p class="' . self::WP_POST_CLASS .'"', wpautop($content));
54
+ } else {
55
+ $content = wpautop($content);
56
+ }
57
  $content = trim($content);
58
 
59
  return $content;
lib/Newsletter/Editor/PostListTransformer.php CHANGED
@@ -18,7 +18,7 @@ class PostListTransformer {
18
 
19
  foreach($posts as $index => $post) {
20
  if($use_divider && $index > 0) {
21
- $results[] = $this->args['divider'];
22
  }
23
 
24
  $results = array_merge($results, $this->transformer->transform($post));
18
 
19
  foreach($posts as $index => $post) {
20
  if($use_divider && $index > 0) {
21
+ $results[] = $this->transformer->getDivider();
22
  }
23
 
24
  $results = array_merge($results, $this->transformer->transform($post));
lib/Newsletter/Editor/PostTransformer.php CHANGED
@@ -4,155 +4,199 @@ namespace MailPoet\Newsletter\Editor;
4
  use MailPoet\Newsletter\Editor\PostContentManager;
5
  use MailPoet\Newsletter\Editor\MetaInformationManager;
6
  use MailPoet\Newsletter\Editor\StructureTransformer;
 
 
7
 
8
  if(!defined('ABSPATH')) exit;
9
 
10
  class PostTransformer {
11
 
 
 
 
 
12
  function __construct($args) {
13
  $this->args = $args;
 
 
 
 
 
 
 
 
 
 
 
14
  }
15
 
16
  function transform($post) {
17
- $content_manager = new PostContentManager();
18
- $meta_manager = new MetaInformationManager();
 
 
 
19
 
20
- $content = $content_manager->getContent($post, $this->args['displayType']);
21
- $content = $meta_manager->appendMetaInformation($content, $post, $this->args);
22
- $content = $content_manager->filterContent($content);
 
23
 
24
- $structure_transformer = new StructureTransformer();
25
- $structure = $structure_transformer->transform($content, $this->args['imageFullWidth'] === true);
26
-
27
- if($this->args['featuredImagePosition'] === 'aboveTitle') {
28
- $structure = $this->appendPostTitle($post, $structure);
29
- $structure = $this->appendFeaturedImage(
30
- $post,
31
- $this->args['displayType'],
32
- filter_var($this->args['imageFullWidth'], FILTER_VALIDATE_BOOLEAN),
33
- $structure
34
- );
35
  } else {
36
- if($this->args['featuredImagePosition'] === 'belowTitle') {
37
- $structure = $this->appendFeaturedImage(
38
- $post,
39
- $this->args['displayType'],
40
- filter_var($this->args['imageFullWidth'], FILTER_VALIDATE_BOOLEAN),
41
- $structure
42
- );
43
  }
44
- $structure = $this->appendPostTitle($post, $structure);
45
  }
46
- $structure = $this->appendReadMore($post->ID, $structure);
47
 
48
- return $structure;
49
  }
50
 
51
- private function appendFeaturedImage($post, $display_type, $image_full_width, $structure) {
52
- if($display_type !== 'excerpt') {
53
- // Append featured images only on excerpts
54
- return $structure;
 
 
 
 
 
 
 
 
 
 
 
55
  }
56
 
57
- $featured_image = $this->getFeaturedImage(
58
- $post->ID,
59
- $post->post_title,
60
- (bool)$image_full_width
61
- );
62
 
63
- if(is_array($featured_image)) {
64
- return array_merge(array($featured_image), $structure);
 
 
 
 
 
 
 
 
 
65
  }
66
 
67
- return $structure;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  }
69
 
70
- private function getFeaturedImage($post_id, $post_title, $image_full_width) {
71
- if(has_post_thumbnail($post_id)) {
72
- $thumbnail_id = get_post_thumbnail_id($post_id);
 
73
 
74
- // get attachment data (src, width, height)
75
- $image_info = wp_get_attachment_image_src(
76
- $thumbnail_id,
77
- 'mailpoet_newsletter_max'
78
- );
79
 
80
- // get alt text
81
- $alt_text = trim(strip_tags(get_post_meta(
82
- $thumbnail_id,
83
- '_wp_attachment_image_alt',
84
- true
85
- )));
86
- if(strlen($alt_text) === 0) {
87
- // if the alt text is empty then use the post title
88
- $alt_text = trim(strip_tags($post_title));
89
- }
90
 
91
- return array(
92
- 'type' => 'image',
93
- 'link' => get_permalink($post_id),
94
- 'src' => $image_info[0],
95
- 'alt' => $alt_text,
96
- 'fullWidth' => $image_full_width,
97
- 'width' => $image_info[1],
98
- 'height' => $image_info[2],
99
- 'styles' => array(
100
- 'block' => array(
101
- 'textAlign' => 'center',
102
- ),
103
- ),
104
- );
105
  }
 
106
  }
107
 
108
- private function appendPostTitle($post, $structure) {
109
- $title = $this->getPostTitle($post);
 
 
110
 
111
- // Append title always at the top of the post structure
112
- // Reuse an existing text block if needed
 
113
 
114
- if(count($structure) > 0 && $structure[0]['type'] === 'text') {
115
- $structure[0]['text'] = $title . $structure[0]['text'];
116
- } else {
117
- array_unshift(
118
- $structure,
119
- array(
120
- 'type' => 'text',
121
- 'text' => $title,
122
- )
123
- );
 
 
124
  }
125
 
126
- return $structure;
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  }
128
 
129
- private function appendReadMore($post_id, $structure) {
130
  if($this->args['readMoreType'] === 'button') {
131
  $button = $this->args['readMoreButton'];
132
- $button['url'] = get_permalink($post_id);
133
- $structure[] = $button;
134
- } else {
135
- $total_blocks = count($structure);
136
- $read_more_text = sprintf(
137
- '<p><a href="%s">%s</a></p>',
138
- get_permalink($post_id),
139
- $this->args['readMoreText']
140
- );
141
-
142
- if($structure[$total_blocks - 1]['type'] === 'text') {
143
- $structure[$total_blocks - 1]['text'] .= $read_more_text;
144
- } else {
145
- $structure[] = array(
146
- 'type' => 'text',
147
- 'text' => $read_more_text,
148
- );
149
- }
150
  }
151
 
152
- return $structure;
 
 
 
 
 
 
 
 
 
153
  }
154
 
155
- private function getPostTitle($post) {
156
  $title = $post->post_title;
157
 
158
  if(filter_var($this->args['titleIsLink'], FILTER_VALIDATE_BOOLEAN)) {
@@ -169,6 +213,11 @@ class PostTransformer {
169
 
170
  $alignment = (in_array($this->args['titleAlignment'], array('left', 'right', 'center'))) ? $this->args['titleAlignment'] : 'left';
171
 
172
- return '<' . $tag . ' data-post-id="' . $post->ID . '" style="text-align: ' . $alignment . ';">' . $title . '</' . $tag . '>';
 
 
 
 
173
  }
 
174
  }
4
  use MailPoet\Newsletter\Editor\PostContentManager;
5
  use MailPoet\Newsletter\Editor\MetaInformationManager;
6
  use MailPoet\Newsletter\Editor\StructureTransformer;
7
+ use MailPoet\Newsletter\Editor\LayoutHelper;
8
+ use MailPoet\WP\Functions as WPFunctions;
9
 
10
  if(!defined('ABSPATH')) exit;
11
 
12
  class PostTransformer {
13
 
14
+ private $args;
15
+ private $with_layout;
16
+ private $image_position;
17
+
18
  function __construct($args) {
19
  $this->args = $args;
20
+ $this->with_layout = (bool)filter_var($args['withLayout'], FILTER_VALIDATE_BOOLEAN);
21
+ $this->image_position = 'left';
22
+ }
23
+
24
+ function getDivider() {
25
+ if(empty($this->with_layout)) {
26
+ return $this->args['divider'];
27
+ }
28
+ return LayoutHelper::row(array(
29
+ LayoutHelper::col(array($this->args['divider']))
30
+ ));
31
  }
32
 
33
  function transform($post) {
34
+ if(empty($this->with_layout)) {
35
+ return $this->getStructure($post);
36
+ }
37
+ return $this->getStructureWithLayout($post);
38
+ }
39
 
40
+ private function getStructure($post) {
41
+ $content = $this->getContent($post, true);
42
+ $title = $this->getTitle($post);
43
+ $featured_image = $this->getFeaturedImage($post);
44
 
45
+ $image_position = $this->args['featuredImagePosition'];
46
+
47
+ if($featured_image && $image_position === 'belowTitle') {
48
+ array_unshift($content, $title, $featured_image);
 
 
 
 
 
 
 
49
  } else {
50
+ if($content[0]['type'] === 'text') {
51
+ $content[0]['text'] = $title['text'] . $content[0]['text'];
52
+ } else {
53
+ array_unshift($content, $title);
54
+ }
55
+ if($featured_image) {
56
+ array_unshift($content, $featured_image);
57
  }
 
58
  }
 
59
 
60
+ return $content;
61
  }
62
 
63
+ private function getStructureWithLayout($post) {
64
+ $content = $this->getContent($post, false);
65
+ $title = $this->getTitle($post);
66
+ $featured_image = $this->getFeaturedImage($post);
67
+
68
+ $position = $this->args['featuredImagePosition'];
69
+
70
+ if(!$featured_image || $position === 'none' || $this->args['displayType'] !== 'excerpt') {
71
+ array_unshift($content, $title);
72
+
73
+ return array(
74
+ LayoutHelper::row(array(
75
+ LayoutHelper::col($content)
76
+ ))
77
+ );
78
  }
79
 
80
+ if($position === 'aboveTitle' || $position === 'belowTitle') {
81
+ $position = 'centered';
82
+ }
 
 
83
 
84
+ if($position === 'centered') {
85
+ array_unshift($content, $title, $featured_image);
86
+ return array(
87
+ LayoutHelper::row(array(
88
+ LayoutHelper::col($content)
89
+ ))
90
+ );
91
+ }
92
+
93
+ if($position === 'alternate') {
94
+ $position = $this->nextImagePosition();
95
  }
96
 
97
+ $content = ($position === 'left')
98
+ ? array(
99
+ LayoutHelper::col(array($featured_image)),
100
+ LayoutHelper::col($content)
101
+ )
102
+ : array(
103
+ LayoutHelper::col($content),
104
+ LayoutHelper::col(array($featured_image))
105
+ );
106
+
107
+ return array(
108
+ LayoutHelper::row(array(
109
+ LayoutHelper::col(array($title))
110
+ )),
111
+ LayoutHelper::row($content)
112
+ );
113
  }
114
 
115
+ private function nextImagePosition() {
116
+ $this->image_position = ($this->image_position === 'left') ? 'right' : 'left';
117
+ return $this->image_position;
118
+ }
119
 
120
+ private function getContent($post, $with_post_class) {
121
+ $content_manager = new PostContentManager();
122
+ $meta_manager = new MetaInformationManager();
 
 
123
 
124
+ $content = $content_manager->getContent($post, $this->args['displayType']);
125
+ $content = $meta_manager->appendMetaInformation($content, $post, $this->args);
126
+ $content = $content_manager->filterContent($content, $with_post_class);
 
 
 
 
 
 
 
127
 
128
+ $structure_transformer = new StructureTransformer();
129
+ $content = $structure_transformer->transform($content, $this->args['imageFullWidth'] === true);
130
+
131
+ $read_more_btn = $this->getReadMoreButton($post);
132
+ $blocks_count = count($content);
133
+ if($read_more_btn['type'] === 'text' && $blocks_count > 0 && $content[$blocks_count - 1]['type'] === 'text') {
134
+ $content[$blocks_count - 1]['text'] .= $read_more_btn['text'];
135
+ } else {
136
+ $content[] = $read_more_btn;
 
 
 
 
 
137
  }
138
+ return $content;
139
  }
140
 
141
+ private function getFeaturedImage($post) {
142
+ $post_id = $post->ID;
143
+ $post_title = $post->post_title;
144
+ $image_full_width = (bool)filter_var($this->args['imageFullWidth'], FILTER_VALIDATE_BOOLEAN);
145
 
146
+ if(!has_post_thumbnail($post_id)) {
147
+ return false;
148
+ }
149
 
150
+ $thumbnail_id = get_post_thumbnail_id($post_id);
151
+ $image_info = WPFunctions::getImageInfo($thumbnail_id);
152
+
153
+ // get alt text
154
+ $alt_text = trim(strip_tags(get_post_meta(
155
+ $thumbnail_id,
156
+ '_wp_attachment_image_alt',
157
+ true
158
+ )));
159
+ if(strlen($alt_text) === 0) {
160
+ // if the alt text is empty then use the post title
161
+ $alt_text = trim(strip_tags($post_title));
162
  }
163
 
164
+ return array(
165
+ 'type' => 'image',
166
+ 'link' => get_permalink($post_id),
167
+ 'src' => $image_info[0],
168
+ 'alt' => $alt_text,
169
+ 'fullWidth' => $image_full_width,
170
+ 'width' => $image_info[1],
171
+ 'height' => $image_info[2],
172
+ 'styles' => array(
173
+ 'block' => array(
174
+ 'textAlign' => 'center',
175
+ ),
176
+ ),
177
+ );
178
  }
179
 
180
+ private function getReadMoreButton($post) {
181
  if($this->args['readMoreType'] === 'button') {
182
  $button = $this->args['readMoreButton'];
183
+ $button['url'] = get_permalink($post->ID);
184
+ return $button;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  }
186
 
187
+ $read_more_text = sprintf(
188
+ '<p><a href="%s">%s</a></p>',
189
+ get_permalink($post->ID),
190
+ $this->args['readMoreText']
191
+ );
192
+
193
+ return array(
194
+ 'type' => 'text',
195
+ 'text' => $read_more_text,
196
+ );
197
  }
198
 
199
+ private function getTitle($post) {
200
  $title = $post->post_title;
201
 
202
  if(filter_var($this->args['titleIsLink'], FILTER_VALIDATE_BOOLEAN)) {
213
 
214
  $alignment = (in_array($this->args['titleAlignment'], array('left', 'right', 'center'))) ? $this->args['titleAlignment'] : 'left';
215
 
216
+ $title = '<' . $tag . ' data-post-id="' . $post->ID . '" style="text-align: ' . $alignment . ';">' . $title . '</' . $tag . '>';
217
+ return array(
218
+ 'type' => 'text',
219
+ 'text' => $title
220
+ );
221
  }
222
+
223
  }
lib/Newsletter/Renderer/Blocks/Renderer.php CHANGED
@@ -64,16 +64,20 @@ class Renderer {
64
  return $block_class::render($block, $column_count);
65
  }
66
 
67
- function processAutomatedLatestContent($args, $column_count) {
68
  $posts_to_exclude = $this->getPosts();
69
  $ALC_posts = $this->ALC->getPosts($args, $posts_to_exclude);
70
  foreach($ALC_posts as $post) {
71
  $posts_to_exclude[] = $post->ID;
72
  }
 
 
 
 
 
73
  $transformed_posts = array(
74
- 'blocks' => $this->ALC->transformPosts($args, $ALC_posts)
75
  );
76
- $this->setPosts($posts_to_exclude);
77
  $transformed_posts = StylesHelper::applyTextAlignment($transformed_posts);
78
  $rendered_posts = $this->render($transformed_posts, $column_count);
79
  return $rendered_posts;
64
  return $block_class::render($block, $column_count);
65
  }
66
 
67
+ function automatedLatestContentTransformedPosts($args) {
68
  $posts_to_exclude = $this->getPosts();
69
  $ALC_posts = $this->ALC->getPosts($args, $posts_to_exclude);
70
  foreach($ALC_posts as $post) {
71
  $posts_to_exclude[] = $post->ID;
72
  }
73
+ $this->setPosts($posts_to_exclude);
74
+ return $this->ALC->transformPosts($args, $ALC_posts);
75
+ }
76
+
77
+ function processAutomatedLatestContent($args, $column_count) {
78
  $transformed_posts = array(
79
+ 'blocks' => $this->automatedLatestContentTransformedPosts($args)
80
  );
 
81
  $transformed_posts = StylesHelper::applyTextAlignment($transformed_posts);
82
  $rendered_posts = $this->render($transformed_posts, $column_count);
83
  return $rendered_posts;
lib/Newsletter/Renderer/Renderer.php CHANGED
@@ -48,6 +48,7 @@ class Renderer {
48
  $content = $this->addMailpoetLogoContentBlock($content, $styles);
49
  }
50
 
 
51
  $rendered_body = $this->renderBody($content);
52
  $rendered_styles = $this->renderStyles($styles);
53
 
@@ -70,6 +71,26 @@ class Renderer {
70
  $rendered_newsletter;
71
  }
72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  function renderBody($content) {
74
  $blocks = (array_key_exists('blocks', $content))
75
  ? $content['blocks']
48
  $content = $this->addMailpoetLogoContentBlock($content, $styles);
49
  }
50
 
51
+ $content = $this->preProcessALC($content);
52
  $rendered_body = $this->renderBody($content);
53
  $rendered_styles = $this->renderStyles($styles);
54
 
71
  $rendered_newsletter;
72
  }
73
 
74
+ function preProcessALC($content) {
75
+ $blocks = array();
76
+ $content_blocks = (array_key_exists('blocks', $content))
77
+ ? $content['blocks']
78
+ : array();
79
+ foreach($content_blocks as $block) {
80
+ if($block['type'] === 'automatedLatestContentLayout') {
81
+ $blocks = array_merge(
82
+ $blocks,
83
+ $this->blocks_renderer->automatedLatestContentTransformedPosts($block)
84
+ );
85
+ } else {
86
+ $blocks[] = $block;
87
+ }
88
+ }
89
+
90
+ $content['blocks'] = $blocks;
91
+ return $content;
92
+ }
93
+
94
  function renderBody($content) {
95
  $blocks = (array_key_exists('blocks', $content))
96
  ? $content['blocks']
lib/Settings/Pages.php CHANGED
@@ -37,7 +37,6 @@ class Pages {
37
  'post_title' => __('MailPoet Page', 'mailpoet'),
38
  'post_name' => 'subscriptions'
39
  ));
40
- flush_rewrite_rules();
41
 
42
  return ((int)$id > 0) ? (int)$id : false;
43
  }
37
  'post_title' => __('MailPoet Page', 'mailpoet'),
38
  'post_name' => 'subscriptions'
39
  ));
 
40
 
41
  return ((int)$id > 0) ? (int)$id : false;
42
  }
lib/WP/Functions.php CHANGED
@@ -1,6 +1,8 @@
1
  <?php
2
  namespace MailPoet\WP;
3
 
 
 
4
  class Functions {
5
  static function wpRemotePost() {
6
  return self::callWithFallback('wp_remote_post', func_get_args());
@@ -33,4 +35,23 @@ class Functions {
33
  }
34
  return call_user_func_array($func, $args);
35
  }
36
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
  namespace MailPoet\WP;
3
 
4
+ use Mailpoet\Config\Env;
5
+
6
  class Functions {
7
  static function wpRemotePost() {
8
  return self::callWithFallback('wp_remote_post', func_get_args());
35
  }
36
  return call_user_func_array($func, $args);
37
  }
38
+
39
+ static function getImageInfo($id) {
40
+ /*
41
+ * In some cases wp_get_attachment_image_src ignore the second parameter
42
+ * and use global variable $content_width value instead.
43
+ * By overriding it ourselves when ensure a constant behaviour regardless
44
+ * of the user setup.
45
+ *
46
+ * https://mailpoet.atlassian.net/browse/MAILPOET-1365
47
+ */
48
+ global $content_width; // default is NULL
49
+
50
+ $content_width_copy = $content_width;
51
+ $content_width = Env::NEWSLETTER_CONTENT_WIDTH;
52
+ $image_info = wp_get_attachment_image_src($id, 'mailpoet_newsletter_max');
53
+ $content_width = $content_width_copy;
54
+
55
+ return $image_info;
56
+ }
57
+ }
mailpoet.php CHANGED
@@ -4,7 +4,7 @@ if(!defined('ABSPATH')) exit;
4
 
5
  /*
6
  * Plugin Name: MailPoet 3 (New)
7
- * Version: 3.7.4
8
  * Plugin URI: http://www.mailpoet.com
9
  * Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
10
  * Author: MailPoet
@@ -20,7 +20,7 @@ if(!defined('ABSPATH')) exit;
20
  */
21
 
22
  $mailpoet_plugin = array(
23
- 'version' => '3.7.4',
24
  'filename' => __FILE__,
25
  'path' => dirname(__FILE__),
26
  'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
4
 
5
  /*
6
  * Plugin Name: MailPoet 3 (New)
7
+ * Version: 3.7.5
8
  * Plugin URI: http://www.mailpoet.com
9
  * Description: Create and send newsletters, post notifications and welcome emails from your WordPress.
10
  * Author: MailPoet
20
  */
21
 
22
  $mailpoet_plugin = array(
23
+ 'version' => '3.7.5',
24
  'filename' => __FILE__,
25
  'path' => dirname(__FILE__),
26
  'autoloader' => dirname(__FILE__) . '/vendor/autoload.php',
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: mailpoet, wysija
3
  Tags: newsletter, email, welcome email, post notification, autoresponder, signup, subscription, SMTP
4
  Requires at least: 4.7
5
  Tested up to: 4.9
6
- Requires PHP: 5.3
7
- Stable tag: 3.7.4
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -21,10 +21,11 @@ The new MailPoet is here! With our new free sending plan, send unlimited emails
21
  * Improved user experience
22
  * Easy configuration
23
  * Solid reliability
 
24
  * Weekly releases
25
 
26
  = See it in action. =
27
- [Test the demo](http://demo3.mailpoet.com/launch/) or [see the 2 min. video](https://vimeo.com/223581490)
28
  [vimeo https://vimeo.com/223581490]
29
 
30
  = Before you install =
@@ -33,12 +34,11 @@ Take note:
33
 
34
  * Not optimized for right-to-left (RTL) languages yet
35
  * Multisite works, but is not officially supported
36
- * Please check the translations in your language
37
  * Review [our minimum requirements](http://beta.docs.mailpoet.com/article/152-minimum-requirements-for-mailpoet-3)
38
 
39
  = What about the Premium? =
40
 
41
- MailPoet is fully featured in its free version and works up until you have 2000 subscribers.
42
 
43
  The Premium version adds the following features:
44
 
@@ -46,7 +46,7 @@ The Premium version adds the following features:
46
  * ability to send Welcome Emails automatically; i.e. "Welcome to my Newsletter” autoresponders or multi-email courses
47
  * removes the small MailPoet logo in the footer of your emails
48
  * same day support (Monday to Friday)
49
- * send to over 2000 subscribers with your own sending method
50
  * see the [short video summary on the Premium](http://beta.docs.mailpoet.com/article/208-video-overview-of-mailpoet-premium)
51
 
52
  Plus: if you sign up to one of our sending plans, you’ll get all of these fancy features for free. Visit the Premium page inside the plugin for more info.
@@ -75,6 +75,8 @@ We welcome experienced translators to translate directly on [our Transifex proje
75
 
76
  [Security audits are made by LogicalTrust](https://logicaltrust.net/en/), an independent third party.
77
 
 
 
78
  == Installation ==
79
 
80
  There are 3 ways to install this plugin:
@@ -116,6 +118,10 @@ Stop by our [support site](https://www.mailpoet.com/support).
116
 
117
  == Changelog ==
118
 
 
 
 
 
119
  = 3.7.4 - 2018-05-30 =
120
  * Added: What's New page no longer shows after every update;
121
  * Improved: template selection page thumbnails are larger;
@@ -321,7 +327,7 @@ Stop by our [support site](https://www.mailpoet.com/support).
321
  = 3.0.0 - 2017-09-20 =
322
  * Official launch of the new MailPoet. :)
323
  * Improved: MailPoet 3 now works with other plugins that use a supported version of Twig templating engine. Thanks @supsysticcom;
324
- * Added: we now offer a free sending plan for 2000 subscribers or less. Thx MailPoet!
325
 
326
  = 3.0.0-rc.2.0.3 - 2017-09-12 =
327
  * Added: hook to override default cron URL. Thanks Fred;
@@ -382,310 +388,6 @@ Stop by our [support site](https://www.mailpoet.com/support).
382
  * Fixed: [newsletter:post_title] properly displays titles of custom post types; Thanks Adrian!
383
  * Fixed: post images are displayed in expected positions; Thanks Gary!
384
 
385
- = 3.0.0-beta.37.0.0 - 2017-07-25 =
386
- * Improved: we collect more informative data from those who share it with us in order to improve the plugin. You should share too!
387
- * Fixed: deleted WordPress users are removed from the WordPress Users list as well;
388
- * Fixed: shortcodes for custom fields are now inserted correctly in the email designer;
389
- * Fixed: MailPoet Sending Service stays activated after saving Settings;
390
- * Fixed: improperly rendered newsletters will not be sent. Thanks Scott and Alison!
391
-
392
- = 3.0.0-beta.36.3.1 - 2017-07-18 =
393
- * Added: you can now duplicate any item in the email designer;
394
- * Improved: added filter to specify custom SMTP connection timeout value. Thanks, Rik;
395
- * Improved: added a custom filter to whitelist JS/CSS styles that are loaded by other plugins on MailPoet's pages;
396
- * Fixed: sending is not interrupted if a newsletter contains URLs with unicode characters. Thanks Sam!
397
- * Fixed: sent date is reset when newsletter is duplicated;
398
- * Fixed: SMTP sending frequency is properly updated when changed;
399
- * Fixed: newsletter/form/subscriber listings no longer throw an error on some PHP 5.3 hosts. Thanks, Jérôme!
400
-
401
- = 3.0.0-beta.36.3.0 - 2017-07-11 =
402
- * Added: migration script for MailPoet 2 users now imports settings;
403
- * Fixed: emails are sorted by date sent instead of modified date; thanks Scott
404
- * Fixed: cursor doesn't get stuck on "move" icon when editing text;
405
- * Fixed: repeated subscriptions don't duplicate welcome notifications; thanks Luc
406
-
407
- = 3.0.0-beta.36.2.0 - 2017-07-04 =
408
- * Added: 13 new default templates to choose from;
409
- * Added: a new help page in the menu to help us help you better;
410
- * Added: link to list of form plugins that work with MailPoet in our Forms page;
411
- * Improved: display infinite number of posts in Posts widget, instead of just 10. Kudos Keith!
412
- * Fixed: DB connection exceptions are now safely handled. Thanks FxB!
413
-
414
- = 3.0.0-beta.36.1.0 - 2017-06-27 =
415
- * Improved: error notices are displayed when AJAX requests fail;
416
- * Added: MailPoet 2 forms are migrated when MailPoet 3 is installed/reinstalled.
417
-
418
- = 3.0.0-beta.36.0.1 - 2017-06-23 =
419
- * Improved: preheader will now be hidden in Gmail app;
420
- * Fixed: subscription forms now work without causing "missing file" errors. Thanks Sherrie!
421
- * Fixed: Premium keys status to not be invalidated after saving Settings;
422
- * Fixed: email shortcodes are correctly displayed in Newsletter Archive. Thanks Lukáš!
423
-
424
- = 3.0.0-beta.36.0.0 - 2017-06-20 =
425
- * Improved: "view in browser" link is disabled in preview emails. Thanks Riccardo;
426
- * Improved: show a warning when activating on Multisite environments;
427
- * Improved: suggest to activate MailPoet Sending Service after a successful key check;
428
- * Added: MailPoet Sending Service sets the List-Unsubscribe header;
429
- * Fixed: outdated JS assets aren't loaded in new releases;
430
- * Fixed: settings page is not blocked any more if you have more than 2000 subscribers which prevented Premium version updates;
431
- * Fixed: premium and Welcome pages are correctly formated in WP 4.8;
432
- * Fixed: scheduled regular emails are now sent. Thanks Karen;
433
- * Fixed: subscription form no longer throws an error message when included in a popup. Thanks Gregor.
434
-
435
- = 3.0.0-beta.35.0.0 - 2017-06-13 =
436
- * Added: Subscriber and List migration from MailPoet 2, the option will be offered for new installations;
437
- * Improved: switched "Your own website" sending method to use PHPMailer library from WordPress;
438
- * Fixed: "Subscriber Import" screen allows hyphens in email addresses. Thanks Cherian!
439
- * Fixed: "addSubscriber" method in MailPoet API sends confirmation emails;
440
- * Fixed: subscribing via a IPv6 IP address no longer throws an error. Thanks Hans!
441
- * Fixed: "Apply to all" button will apply button styles to Automatic Latest Content as well.
442
-
443
- = 3.0.0-beta.34.0.0 - 2017-06-07 =
444
- * Added: Premium features are officially available. Free users can visit the Premium page in the menu for more info. Premium users: get your key on account.mailpoet.com to continue using Premium;
445
- * Improved: email addresses are now validated using WordPress is_email() function. Kudos Oskar L. and cnesbit!;
446
- * Fixed: scheduled sending queue jobs are paused when post notifications are made inactive. Thanks Oskar!;
447
- * Fixed: post notification history no longer displays a blank subject for notifications waiting in queue. Thanks Lyon!;
448
- * Fixed: unsubscribe page works again. Thx Oskar one more time!
449
-
450
- = 3.0.0-beta.33.1 - 2017-05-30 =
451
- * Updated: minimum required PHP version was increased from 5.3 to 5.3.3. Don't be stuck in the last decade. Ask your host to upgrade you to PHP 7;
452
- * Improved: we now bundle multilingual translations that are 75% or more complete (a decrease from the previous 100% threshold);
453
- * Fixed: âccéntèd characters are properly saved and displayed on all hosts. WARNING: non-English language users are advised to back up their data before upgrading and contact us if something goes wrong;
454
- * Fixed: when subscription confirmation is enabled, welcome notifications will only get scheduled when one's subscription is confirmed;
455
- * Fixed: subscription widget's title is styled in accordance with the active theme's configuration.
456
-
457
- = 3.0.0-beta.32 - 2017-05-23 =
458
- * Added: API methods for 3rd party plugins to add subscribers to MailPoet. Which plugins should we connect to?
459
-
460
- = 3.0.0-beta.31 - 2017-05-16 =
461
- * Improved: automated latest content/post search boxes in the editor now return up to 50 results;
462
- * Improved: sending progress bar got a new look;
463
- * Improved: added plugin translation to Persian (Iran) language. Thanks Ali Reza Karami!;
464
- * Fixed: submission of subscription forms with list selection or non-text custom fields works again. Thanks Stefan!;
465
- * Fixed: subscription management form works fine again;
466
- * Fixed: invalid license key warnings are temporarily hidden if a key is empty;
467
- * Fixed: newsletter link hashes are much less likely to collide. Thanks Sherrie!
468
-
469
- = 3.0.0-beta.30 - 2017-05-09 =
470
- * Fixed: list buttons (ordered/unordered) were added back to the newsletter designer's WYSIWYG editor;
471
- * Fixed: form editor properly displays custom field names when notifying of a completed action (add/update/delete).
472
-
473
- = 3.0.0-beta.29 - 2017-05-02 =
474
- * Improved: added a filter allowing to change SMTP configuration. Thanks Luc!
475
- * Improved: MailPoet now avoids conflicts with other plugins using footer scripts. Thanks Mike and Tina!
476
- * Improved: newsletter stats got a new look with badges that help to measure success of a campaign at a glance;
477
- * Fixed: restoring trashed newsletters restores their sending progress;
478
- * Fixed: trashed lists no longer appear as filters in listings. Thanks Luc and Marc!
479
- * Fixed: newsletter subscription management, unsubscription, browser preview links now work with tracking enabled. Thanks Luc!
480
- * Fixed: shortcode's default values are used when subscriber does not have first or last names;
481
-
482
- = 3.0.0-beta.28 - 2017-04-25 =
483
- * Improved: now you can subscribe to our brand new email course on the Welcome page;
484
- * Improved: API is now versioned. More goodies to come for 3rd-party developers!;
485
- * Improved: List-Unsubscribe header is added to newsletters. Thanks Galfom!;
486
- * Fixed: editor loads correct newsletters when the specified ID is greater or equals 1000. Thx Jim!;
487
- * Fixed: created/updated subscriber count in import results is shown correctly for large imports;
488
- * Fixed: some admin notices now look better.
489
-
490
- = 3.0.0-beta.27 - 2017-04-18 =
491
- * Improved: a warning notice is displayed when the required XML and ZIP PHP extensions are missing;
492
- * Improved: when clicking on a text block inside the email designer, the text cursor is positioned where the click took place;
493
- * Fixed: images remotely added inside the email designer are no longer scaled down to 281px. Thanks Marcelo;
494
- * Fixed: re-importing existing users no longer resets their subscription status. Thanks Marco;
495
- * Fixed: import doesn't fail on certain MySQL setups when subscribers' first and/or last name data is missing;
496
- * Fixed: custom field data no longer get swapped between subscribers during import. Thanks Eric;
497
- * Fixed: automatic latest content block now properly applies tag/category filters to all post types. Thanks JP;
498
- * Fixed: various minor issues.
499
-
500
- = 3.0.0-beta.26 - 2017-04-11 =
501
- * Fixed: interactive widget customizer is now working with MailPoet form widgets. Thanks Peter and Charis!
502
- * Fixed: multi-line headings are now properly displayed in emails. Thanks Karen!
503
-
504
- = 3.0.0-beta.25 - 2017-04-04 =
505
- * Improved: subscriber listings with large number of subscribers (tens of thousands) now load much faster on MySQL 5.5 and lower. Thanks Moulouk!;
506
- * Fixed: updating sending frequency no longer breaks limit enforcement. Thx Vincent!;
507
- * Fixed: sending works again on hosts running (very old) PHP version 5.3. WordPress recommends PHP 7 or newer. Ask your host how to upgrade. Thanks Emmanuel.
508
-
509
- = 3.0.0-beta.24 - 2017-03-28 =
510
- * Improved: clarified UI language in Settings and Import. Thanks Lloyd, @rtomo and @perthmetro;
511
- * Added: hooks and filters for premium features. Thx Alex;
512
- * Premium: Google Analytics tracking is now enabled. Get in touch with us if you're a premium user!
513
- * Fixed: multilingual translations are no longer breaking the UI. Thanks Marco;
514
- * Fixed: tracking image inside newsletters is now transparent and does not produce a false positive result during VaultPress's security scan. Thanks Raw-B.
515
-
516
- = 3.0.0-beta.23.2 - 2017-03-14 =
517
- * Improved: added plugin translations to Dutch, English (UK), French, German, Italian, Portuguese (Brazil), Portuguese (Portugal), Russian and Spanish languages. Thank you translators!
518
- * Fixed: unsubscribed subscriber will no longer receive newsletters (whoops!). Thanks, Oskar;
519
- * Fixed: previously scheduled send tasks are rescheduled when post notifications' scheduling options change. Thanks, Karen and Eric!
520
- * Fixed: Amazon SES sending method now works regardless of custom "arg_separator" set in PHP's configuration. Thanks Lukas!
521
-
522
- = 3.0.0-beta.22 - 2017-03-07 =
523
- * Improved: sending very large emails with our sending service is less likely to time out. Thanks Mark!;
524
- * Fixed: WordPress warnings are no longer displayed in the editor's contents;
525
- * Small, little and tiny improvements to show we pay attention to details;
526
- * British scientists say people whose sites run on PHP below version 7 have the lowest quality of life.
527
-
528
- = 3.0.0-beta.21 - 2017-02-28 =
529
- * Fixed: newsletter sending process will fully stop when sending is paused. Thanks Terry!
530
- * Fixed: MailPoet sending method will work on sites using PHP 5.3. Thanks Jeff!
531
- * Fixed: bulk trashing and restoring newsletters and forms will work on sites using PHP 5.3. Thanks Scott!
532
- * We recommend all of you to upgrade to PHP 7. It's faster, more reliable, and safer. It's just a question of asking your host to switch.
533
-
534
- = 3.0.0-beta.20 - 2017-02-23 =
535
- * Fixed: scheduling options are properly saved when creating a new or re-saving an existing email. Thx Oskar!;
536
- * Fixed: sending is not interrupted when a post included in the email is trashed. Thanks Bernhard!
537
-
538
- = 3.0.0-beta.19 - 2017-02-21 =
539
- * Improved: import uses stricter email validation rules. Kudos Oskar;
540
- * Improved: database is cleaned up after deleting subscribers. Thx Eric;
541
- * Improved: cursor focuses on the modal window and sidebars. A big thanks to users who reported the issue;
542
- * Improved: plugin is leaner;
543
- * Improved: we're translation-ready. Contact us to help and get freebies;
544
- * Improved: detailed error messages are displayed when sending with SMTP fails. Thx Rik;
545
- * Fixed: going back to email designer does not corrupt its contents. Thx Taut;
546
- * Fixed: emails trashed while sending can be resent if restored. Thnx Vlad;
547
- * Fixed: sending to large lists (30,000+) works again. Oskar, again!;
548
- * Fixed: default email templates are not duplicated when changed;
549
- * Fixed: email rendering does not display warning notices on PHP 7.1. Thx Alex;
550
- * Fixed: bulk trashing of subscribers works on PHP 5.3. Thx Chris!
551
-
552
- = 3.0.0-beta.18 - 2017-02-14 =
553
- * Fixed: subscriber stats for lists are accurately calculated;
554
- * Fixed: 'Create a new form' link in the MailPoet Form widget now leads to the Form editor;
555
- * Fixed: category names are shown for Automated latest content widget posts on WP 4.7. Thanks Christopher!;
556
- * Fixed: SendGrid error messages are properly displayed. Thanks Larry!;
557
- * Fixed: non-Latin-1 characters are now rendered on some hosts running PHP 5.3. Thanks Andreas!
558
-
559
- = 3.0.0-beta.17 - 2017-02-01 =
560
- * Added: send in style with MailPoet's own sending service. Visit your MailPoet Settings > Send with... tab.
561
-
562
- = 3.0.0-beta.16 - 2017-01-31 =
563
- * Improved: Updated language strings for better translation support;
564
- * Fixed: subscription forms now allow to subscribe only to specified lists. Thanks Paul!
565
- * Fixed: subscription forms now ignore any extra fields added not via the Form editor. Thx again Paul!
566
- * Fixed: previewing sent welcome emails now displays latest email version. Thanks Tim!
567
- * Fixed: plugin no longer triggers a PHP error during initialization on hosts using PHP 5.3;
568
- * Fixed: plugin warns about missing required PDO_MYSQL extension.
569
-
570
- = 3.0.0-beta.15 - 2017-01-24 =
571
- * Fixed: plugin no longer throws a fatal exception error on (prehistoric :)) hosts running older versions than PHP 5.3. Thanks Otto & jtm12!;
572
- * Fixed: users who are not subscribed to any list can be filtered in the admin panel;
573
- * Fixed: newsletter preview links can now be shared with non WP users.
574
-
575
- = 3.0.0-beta.14 - 2017-01-19 =
576
- * Fixed: images can't be added to newsletters. Thanks Leon!;
577
- * Fixed: forms require first & last name input fields on some systems;
578
- * Fixed: unable to remove subscribers from lists in admin panel. Thanks Kay!
579
-
580
- = 3.0.0-beta.13 - 2017-01-17 =
581
- * Improved: style/script conflicts on MailPoet pages are now resolved by unloading non-default assets. Thx Michel for reporting one such case!;
582
- * Fixed: MySQL wait_timeout of less than 20 seconds results in errors when sending. Thx Tim!;
583
- * Fixed: unsubscribe URL doesn't work when BuddyPress is enabled;
584
- * Fixed: some form styles aren't saved. Thanks Pete!;
585
- * Fixed: typo in subscription management shortcode instructions. Thx Tim once more!
586
-
587
- = 3.0.0-beta.12 - 2017-01-10 =
588
- * Improved: faster load times of Emails page with large database;
589
- * Improved: sender header is now set for SMTP/PHPMail method to work with MS Exchange. Thx Karsten!;
590
- * Improved: better asset conflict management with other plugins;
591
- * Fixed: newly published custom post types are now sent. Thx Jim!;
592
- * Fixed: post notifications now sent when ALC block is configured to display titles only. Thx Pete;
593
- * Fixed: shortcode "date:dtext" displays full name (e.g., Sunday) instead of abbreviated (e.g., Sun);
594
- * Fixed: hide mailer error on send previews. Thx Karsten again!;
595
- * Fixed: various minor issues.
596
-
597
- = 3.0.0-beta.11 - 2016-12-31 =
598
- * Improved: newsletters' statistics are generated in a split second;
599
- * Fixed: subscribers' data is properly saved on repeat and/or multiple subscription attempts;
600
- * Fixed: WP posts are displayed/rendered with proper line breaks and spaces;
601
- * Fixed: preview-by-email works once again;
602
- * Wished: 2017 sees the release of the fantastic MailPoet 3 and the super-duper MailPoet Sending Service;
603
- * Wished: 2017 turns out to be an amazing year for all of our beloved and new users!
604
-
605
- = 3.0.0-beta.10 - 2016-12-27 =
606
- * Improved: newsletter is saved prior to sending an email preview;
607
- * Improved: subscription management page conditionally displays the "bounced" status;
608
- * Improved: deleted lists are displayed in newsletter listings;
609
- * Fixed: newsletter/subscriber/list/form dates are properly formatted according to WP settings;
610
- * Fixed: emails' "Return-path" header is set to the bounce address configured in Settings->Advanced;
611
- * Fixed: archived newsletters' shortcode works for site visitors;
612
- * Fixed: unicode support for newsletters.
613
-
614
- = 3.0.0-beta.9 - 2016-12-20 =
615
- * Improved: the plugin is now tested up to WP 4.7;
616
- * Improved: MailPoet's sending service bounce status API update;
617
- * Improved: change duplicate subscribers import message to be more descriptive;
618
- * Fixed: database character set and time zone setup;
619
- * Fixed: alignment of post titles inside notificaiton emails;
620
- * Fixed: partially generated or missing translations from .pot file.
621
-
622
- = 3.0.0-beta.8 - 2016-12-13 =
623
- * Added: MailPoet's sending service can now sync hard bounced addresses with the plugin to keep your lists tidy and clean;
624
- * Improved: gracefully catch vendor library conflicts with other plugins. Thx Vikas;
625
- * Improved: force browsers to load the intended JS and CSS assets by adding a parameter, ie style.css?ver=x.y.z;
626
- * Fixed: render non paragraph elements inside a block quote. Thx Remco!;
627
- * Fixed a query that's gone awry in Mysql version 5.6. Dank je Pim!
628
-
629
- = 3.0.0-beta.7.1 - 2016-12-06 =
630
- * Improved: allow user to restart sending after sending method failure;
631
- * Fixed: subscribers are not added to lists after import;
632
- * Fixed: sending should stop when newsletter is trashed;
633
- * Fixed: update database schema after an update which fixes an SQL error;
634
- * Fixed: status of sent newsletters is showing "paused" instead of "sent";
635
- * Fixed: dividers in Automatic Latest Posts posts are not displayed. Thx Gregor!;
636
- * Fixed: shortcodes (ie, first name) are not rendered when sending a preview;
637
- * Fixed: count of confirmed subscribers only in step 2 of import is erroneous.
638
-
639
- = 3.0.0-beta.6 - 2016-11-29 =
640
- * Added: "bounced" status has been added to subscribers;
641
- * Improved: execution time enforced between individual send operations. Avoids duplicate sending on really slow servers;
642
- * Improved: Welcome emails are given higher priority for sending;
643
- * Fixed: Welcome emails are not scheduled for WP users;
644
- * Fixed: Unicode characters in FROM/REPLY-TO/TO fields are not rendered;
645
- * Fixed: sending HTML emails with Amazon SES works again. Kudos Alex for reporting;
646
- * Fixed: import fails when subscriber already exists in the database but the email is in different case format. Thx Ellen for telling us;
647
- * Fixed: ampersand char ("&") inside the subject line won't throw errors in browser preview. Thanks Michel for reporting.
648
-
649
- = 3.0.0-beta.5 - 2016-11 =
650
- * Fixed ALC block in newsletter editor to not show tools of content blocks;
651
- * Fixed Sending Queue to remove post notification history newsletter when sending queue record is removed;
652
- * Fixed vendor library initialization path on certain configurations;
653
- * Optimized image assets to reduce file size;
654
- * Added security fixes;
655
- * Added plugin requirements checker;
656
- * Fixed "MailPoet Page" custom post type to not display an entry on admin menu;
657
- * Fixed language strings in subscriber import;
658
- * Added "Get back to MailPoet" button on plugin update page.
659
-
660
- = 3.0.0-beta.4 - 2016-11 =
661
-
662
- * Updated HelpScout beacon to provide support articles;
663
- * Fixed handling of URLs containing shortcodes in newsletter editor;
664
- * Security fixes;
665
- * Fixed subscriber count to not count trashed subscribers;
666
- * Fixed template renderer to gracefully display an error when template caching issues arise;
667
- * Added security measures to prevent mass subscriptions.
668
-
669
- = 3.0.0-beta.3 - 2016-11 =
670
-
671
- * Improved compatibility with PHP 7;
672
- * Fixed showing current newsletter status in newsletter listings when there are no subscribers to send to;
673
- * Removed obsolete libraries;
674
- * Fixed security issues;
675
- * Fixed html form embed code to use correct paths;
676
- * Updated settings documentation URL;
677
- * Improved text fitting in newsletter type/template selection boxes;
678
- * Fixed Populator compatibility with earlier PHP versions;
679
- * Fixed newsletter number shortcode for notification newsletters;
680
- * Enhanced HelpScout support beacon report with extra support data;
681
- * Fixed email renderer to not throw entity warnings on earlier PHP versions;
682
- * Fixed newsletter preview incompatibility errors for earlier PHP versions.
683
-
684
- = 3.0.0-beta.2 - 2016-10 =
685
-
686
- * Fixed compatibility issues with PHP versions earlier than PHP 5.6;
687
- * Renamed 'Emails' email type to 'Newsletters'.
688
-
689
  = 3.0.0-beta.1 - 2016-10 =
690
 
691
  * Initial public beta release.
3
  Tags: newsletter, email, welcome email, post notification, autoresponder, signup, subscription, SMTP
4
  Requires at least: 4.7
5
  Tested up to: 4.9
6
+ Requires PHP: 5.6
7
+ Stable tag: 3.7.5
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
 
21
  * Improved user experience
22
  * Easy configuration
23
  * Solid reliability
24
+ * GDPR compliant
25
  * Weekly releases
26
 
27
  = See it in action. =
28
+ [Test the demo](http://demo.mailpoet.com/) or [see the 2 min. video](https://vimeo.com/223581490)
29
  [vimeo https://vimeo.com/223581490]
30
 
31
  = Before you install =
34
 
35
  * Not optimized for right-to-left (RTL) languages yet
36
  * Multisite works, but is not officially supported
 
37
  * Review [our minimum requirements](http://beta.docs.mailpoet.com/article/152-minimum-requirements-for-mailpoet-3)
38
 
39
  = What about the Premium? =
40
 
41
+ MailPoet is fully featured in its free version and works up until you have "2000" subscribers.
42
 
43
  The Premium version adds the following features:
44
 
46
  * ability to send Welcome Emails automatically; i.e. "Welcome to my Newsletter” autoresponders or multi-email courses
47
  * removes the small MailPoet logo in the footer of your emails
48
  * same day support (Monday to Friday)
49
+ * send to over "2000" subscribers with your own sending method
50
  * see the [short video summary on the Premium](http://beta.docs.mailpoet.com/article/208-video-overview-of-mailpoet-premium)
51
 
52
  Plus: if you sign up to one of our sending plans, you’ll get all of these fancy features for free. Visit the Premium page inside the plugin for more info.
75
 
76
  [Security audits are made by LogicalTrust](https://logicaltrust.net/en/), an independent third party.
77
 
78
+ Have a question for us? Reach us at security@ our domain.
79
+
80
  == Installation ==
81
 
82
  There are 3 ways to install this plugin:
118
 
119
  == Changelog ==
120
 
121
+ = 3.7.5 - 2018-06-05 =
122
+ * Added: align images left or right of posts excerpts;
123
+ * Fixed: post content block image alignment issues.
124
+
125
  = 3.7.4 - 2018-05-30 =
126
  * Added: What's New page no longer shows after every update;
127
  * Improved: template selection page thumbnails are larger;
327
  = 3.0.0 - 2017-09-20 =
328
  * Official launch of the new MailPoet. :)
329
  * Improved: MailPoet 3 now works with other plugins that use a supported version of Twig templating engine. Thanks @supsysticcom;
330
+ * Added: we now offer a free sending plan for "2000" subscribers or less. Thx MailPoet!
331
 
332
  = 3.0.0-rc.2.0.3 - 2017-09-12 =
333
  * Added: hook to override default cron URL. Thanks Fred;
388
  * Fixed: [newsletter:post_title] properly displays titles of custom post types; Thanks Adrian!
389
  * Fixed: post images are displayed in expected positions; Thanks Gary!
390
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
  = 3.0.0-beta.1 - 2016-10 =
392
 
393
  * Initial public beta release.
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit4d9111e3a54c2a8eb9f81bba71451d8b::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInite98a710e71e6174923a86d79102fe7dc::getLoader();
vendor/composer/autoload_classmap.php CHANGED
@@ -172,6 +172,7 @@ return array(
172
  'MailPoet\\Models\\SubscriberIP' => $baseDir . '/lib/Models/SubscriberIP.php',
173
  'MailPoet\\Models\\SubscriberSegment' => $baseDir . '/lib/Models/SubscriberSegment.php',
174
  'MailPoet\\Newsletter\\AutomatedLatestContent' => $baseDir . '/lib/Newsletter/AutomatedLatestContent.php',
 
175
  'MailPoet\\Newsletter\\Editor\\MetaInformationManager' => $baseDir . '/lib/Newsletter/Editor/MetaInformationManager.php',
176
  'MailPoet\\Newsletter\\Editor\\PostContentManager' => $baseDir . '/lib/Newsletter/Editor/PostContentManager.php',
177
  'MailPoet\\Newsletter\\Editor\\PostListTransformer' => $baseDir . '/lib/Newsletter/Editor/PostListTransformer.php',
172
  'MailPoet\\Models\\SubscriberIP' => $baseDir . '/lib/Models/SubscriberIP.php',
173
  'MailPoet\\Models\\SubscriberSegment' => $baseDir . '/lib/Models/SubscriberSegment.php',
174
  'MailPoet\\Newsletter\\AutomatedLatestContent' => $baseDir . '/lib/Newsletter/AutomatedLatestContent.php',
175
+ 'MailPoet\\Newsletter\\Editor\\LayoutHelper' => $baseDir . '/lib/Newsletter/Editor/LayoutHelper.php',
176
  'MailPoet\\Newsletter\\Editor\\MetaInformationManager' => $baseDir . '/lib/Newsletter/Editor/MetaInformationManager.php',
177
  'MailPoet\\Newsletter\\Editor\\PostContentManager' => $baseDir . '/lib/Newsletter/Editor/PostContentManager.php',
178
  'MailPoet\\Newsletter\\Editor\\PostListTransformer' => $baseDir . '/lib/Newsletter/Editor/PostListTransformer.php',
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit4d9111e3a54c2a8eb9f81bba71451d8b
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit4d9111e3a54c2a8eb9f81bba71451d8b
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit4d9111e3a54c2a8eb9f81bba71451d8b', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit4d9111e3a54c2a8eb9f81bba71451d8b', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInit4d9111e3a54c2a8eb9f81bba71451d8b::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
@@ -48,19 +48,19 @@ class ComposerAutoloaderInit4d9111e3a54c2a8eb9f81bba71451d8b
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
- $includeFiles = Composer\Autoload\ComposerStaticInit4d9111e3a54c2a8eb9f81bba71451d8b::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
- composerRequire4d9111e3a54c2a8eb9f81bba71451d8b($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
- function composerRequire4d9111e3a54c2a8eb9f81bba71451d8b($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInite98a710e71e6174923a86d79102fe7dc
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInite98a710e71e6174923a86d79102fe7dc', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInite98a710e71e6174923a86d79102fe7dc', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInite98a710e71e6174923a86d79102fe7dc::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
+ $includeFiles = Composer\Autoload\ComposerStaticInite98a710e71e6174923a86d79102fe7dc::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
+ composerRequiree98a710e71e6174923a86d79102fe7dc($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
+ function composerRequiree98a710e71e6174923a86d79102fe7dc($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit4d9111e3a54c2a8eb9f81bba71451d8b
8
  {
9
  public static $files = array (
10
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@@ -289,6 +289,7 @@ class ComposerStaticInit4d9111e3a54c2a8eb9f81bba71451d8b
289
  'MailPoet\\Models\\SubscriberIP' => __DIR__ . '/../..' . '/lib/Models/SubscriberIP.php',
290
  'MailPoet\\Models\\SubscriberSegment' => __DIR__ . '/../..' . '/lib/Models/SubscriberSegment.php',
291
  'MailPoet\\Newsletter\\AutomatedLatestContent' => __DIR__ . '/../..' . '/lib/Newsletter/AutomatedLatestContent.php',
 
292
  'MailPoet\\Newsletter\\Editor\\MetaInformationManager' => __DIR__ . '/../..' . '/lib/Newsletter/Editor/MetaInformationManager.php',
293
  'MailPoet\\Newsletter\\Editor\\PostContentManager' => __DIR__ . '/../..' . '/lib/Newsletter/Editor/PostContentManager.php',
294
  'MailPoet\\Newsletter\\Editor\\PostListTransformer' => __DIR__ . '/../..' . '/lib/Newsletter/Editor/PostListTransformer.php',
@@ -1001,10 +1002,10 @@ class ComposerStaticInit4d9111e3a54c2a8eb9f81bba71451d8b
1001
  public static function getInitializer(ClassLoader $loader)
1002
  {
1003
  return \Closure::bind(function () use ($loader) {
1004
- $loader->prefixLengthsPsr4 = ComposerStaticInit4d9111e3a54c2a8eb9f81bba71451d8b::$prefixLengthsPsr4;
1005
- $loader->prefixDirsPsr4 = ComposerStaticInit4d9111e3a54c2a8eb9f81bba71451d8b::$prefixDirsPsr4;
1006
- $loader->prefixesPsr0 = ComposerStaticInit4d9111e3a54c2a8eb9f81bba71451d8b::$prefixesPsr0;
1007
- $loader->classMap = ComposerStaticInit4d9111e3a54c2a8eb9f81bba71451d8b::$classMap;
1008
 
1009
  }, null, ClassLoader::class);
1010
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInite98a710e71e6174923a86d79102fe7dc
8
  {
9
  public static $files = array (
10
  '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
289
  'MailPoet\\Models\\SubscriberIP' => __DIR__ . '/../..' . '/lib/Models/SubscriberIP.php',
290
  'MailPoet\\Models\\SubscriberSegment' => __DIR__ . '/../..' . '/lib/Models/SubscriberSegment.php',
291
  'MailPoet\\Newsletter\\AutomatedLatestContent' => __DIR__ . '/../..' . '/lib/Newsletter/AutomatedLatestContent.php',
292
+ 'MailPoet\\Newsletter\\Editor\\LayoutHelper' => __DIR__ . '/../..' . '/lib/Newsletter/Editor/LayoutHelper.php',
293
  'MailPoet\\Newsletter\\Editor\\MetaInformationManager' => __DIR__ . '/../..' . '/lib/Newsletter/Editor/MetaInformationManager.php',
294
  'MailPoet\\Newsletter\\Editor\\PostContentManager' => __DIR__ . '/../..' . '/lib/Newsletter/Editor/PostContentManager.php',
295
  'MailPoet\\Newsletter\\Editor\\PostListTransformer' => __DIR__ . '/../..' . '/lib/Newsletter/Editor/PostListTransformer.php',
1002
  public static function getInitializer(ClassLoader $loader)
1003
  {
1004
  return \Closure::bind(function () use ($loader) {
1005
+ $loader->prefixLengthsPsr4 = ComposerStaticInite98a710e71e6174923a86d79102fe7dc::$prefixLengthsPsr4;
1006
+ $loader->prefixDirsPsr4 = ComposerStaticInite98a710e71e6174923a86d79102fe7dc::$prefixDirsPsr4;
1007
+ $loader->prefixesPsr0 = ComposerStaticInite98a710e71e6174923a86d79102fe7dc::$prefixesPsr0;
1008
+ $loader->classMap = ComposerStaticInite98a710e71e6174923a86d79102fe7dc::$classMap;
1009
 
1010
  }, null, ClassLoader::class);
1011
  }
views/newsletter/editor.html CHANGED
@@ -17,6 +17,18 @@
17
  'newsletter_editor_template_automated_latest_content_settings',
18
  'newsletter/templates/blocks/automatedLatestContent/settings.hbs'
19
  ) %>
 
 
 
 
 
 
 
 
 
 
 
 
20
  <%= partial(
21
  'newsletter_editor_template_button_block',
22
  'newsletter/templates/blocks/button/block.hbs'
@@ -521,6 +533,16 @@
521
  jQuery('#newsletter_editor_template_automated_latest_content_settings').html()
522
  ),
523
 
 
 
 
 
 
 
 
 
 
 
524
  postsBlock: Handlebars.compile(
525
  jQuery('#newsletter_editor_template_posts_block').html()
526
  ),
@@ -962,6 +984,7 @@
962
  blockDefaults: {
963
  automatedLatestContent: {
964
  amount: '5',
 
965
  contentType: 'post', // 'post'|'page'|'mailpoet_page'
966
  inclusionType: 'include', // 'include'|'exclude'
967
  displayType: 'excerpt', // 'excerpt'|'full'|'titleOnly'
@@ -1014,6 +1037,61 @@
1014
  backgroundColor: '#ffffff',
1015
  backgroundColorAlternate: '#eeeeee',
1016
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1017
  button: {
1018
  text: '<%= __('Button') | escape('js') %>',
1019
  url: '',
@@ -1085,6 +1163,7 @@
1085
  },
1086
  posts: {
1087
  amount: '10',
 
1088
  contentType: 'post', // 'post'|'page'|'mailpoet_page'
1089
  postStatus: 'publish', // 'draft'|'pending'|'private'|'publish'|'future'
1090
  inclusionType: 'include', // 'include'|'exclude'
@@ -1093,7 +1172,7 @@
1093
  titleAlignment: 'left', // 'left'|'center'|'right'
1094
  titleIsLink: false, // false|true
1095
  imageFullWidth: false, // true|false
1096
- featuredImagePosition: 'belowTitle', // 'belowTitle'|'aboveTitle'|'none',
1097
  showAuthor: 'no', // 'no'|'aboveText'|'belowText'
1098
  authorPrecededBy: '<%= __('Author:') | escape('js') %>',
1099
  showCategories: 'no', // 'no'|'aboveText'|'belowText'
17
  'newsletter_editor_template_automated_latest_content_settings',
18
  'newsletter/templates/blocks/automatedLatestContent/settings.hbs'
19
  ) %>
20
+ <%= partial(
21
+ 'newsletter_editor_template_automated_latest_content_layout_block',
22
+ 'newsletter/templates/blocks/automatedLatestContentLayout/block.hbs'
23
+ ) %>
24
+ <%= partial(
25
+ 'newsletter_editor_template_automated_latest_content_layout_widget',
26
+ 'newsletter/templates/blocks/automatedLatestContentLayout/widget.hbs'
27
+ ) %>
28
+ <%= partial(
29
+ 'newsletter_editor_template_automated_latest_content_layout_settings',
30
+ 'newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs'
31
+ ) %>
32
  <%= partial(
33
  'newsletter_editor_template_button_block',
34
  'newsletter/templates/blocks/button/block.hbs'
533
  jQuery('#newsletter_editor_template_automated_latest_content_settings').html()
534
  ),
535
 
536
+ automatedLatestContentLayoutBlock: Handlebars.compile(
537
+ jQuery('#newsletter_editor_template_automated_latest_content_layout_block').html()
538
+ ),
539
+ automatedLatestContentLayoutInsertion: Handlebars.compile(
540
+ jQuery('#newsletter_editor_template_automated_latest_content_layout_widget').html()
541
+ ),
542
+ automatedLatestContentLayoutBlockSettings: Handlebars.compile(
543
+ jQuery('#newsletter_editor_template_automated_latest_content_layout_settings').html()
544
+ ),
545
+
546
  postsBlock: Handlebars.compile(
547
  jQuery('#newsletter_editor_template_posts_block').html()
548
  ),
984
  blockDefaults: {
985
  automatedLatestContent: {
986
  amount: '5',
987
+ withLayout: false,
988
  contentType: 'post', // 'post'|'page'|'mailpoet_page'
989
  inclusionType: 'include', // 'include'|'exclude'
990
  displayType: 'excerpt', // 'excerpt'|'full'|'titleOnly'
1037
  backgroundColor: '#ffffff',
1038
  backgroundColorAlternate: '#eeeeee',
1039
  },
1040
+ automatedLatestContentLayout: {
1041
+ amount: '5',
1042
+ withLayout: true,
1043
+ contentType: 'post', // 'post'|'page'|'mailpoet_page'
1044
+ inclusionType: 'include', // 'include'|'exclude'
1045
+ displayType: 'excerpt', // 'excerpt'|'full'|'titleOnly'
1046
+ titleFormat: 'h1', // 'h1'|'h2'|'h3'|'ul'
1047
+ titleAlignment: 'left', // 'left'|'center'|'right'
1048
+ titleIsLink: false, // false|true
1049
+ imageFullWidth: false, // true|false
1050
+ featuredImagePosition: 'alternate', // 'centered'|'left'|'right'|'alternate'|'none',
1051
+ showAuthor: 'no', // 'no'|'aboveText'|'belowText'
1052
+ authorPrecededBy: '<%= __('Author:') | escape('js') %>',
1053
+ showCategories: 'no', // 'no'|'aboveText'|'belowText'
1054
+ categoriesPrecededBy: '<%= __('Categories:') | escape('js') %>',
1055
+ readMoreType: 'button', // 'link'|'button'
1056
+ readMoreText: '<%= __('Read more') | escape('js') %>',
1057
+ readMoreButton: {
1058
+ text: '<%= __('Read more') | escape('js') %>',
1059
+ url: '[postLink]',
1060
+ context: 'automatedLatestContentLayout.readMoreButton',
1061
+ styles: {
1062
+ block: {
1063
+ backgroundColor: '#2ea1cd',
1064
+ borderColor: '#0074a2',
1065
+ borderWidth: '1px',
1066
+ borderRadius: '5px',
1067
+ borderStyle: 'solid',
1068
+ width: '180px',
1069
+ lineHeight: '40px',
1070
+ fontColor: '#ffffff',
1071
+ fontFamily: 'Verdana',
1072
+ fontSize: '18px',
1073
+ fontWeight: 'normal',
1074
+ textAlign: 'center',
1075
+ }
1076
+ }
1077
+ },
1078
+ sortBy: 'newest', // 'newest'|'oldest',
1079
+ showDivider: true, // true|false
1080
+ divider: {
1081
+ context: 'automatedLatestContentLayout.divider',
1082
+ styles: {
1083
+ block: {
1084
+ backgroundColor: 'transparent',
1085
+ padding: '13px',
1086
+ borderStyle: 'solid',
1087
+ borderWidth: '3px',
1088
+ borderColor: '#aaaaaa',
1089
+ },
1090
+ },
1091
+ },
1092
+ backgroundColor: '#ffffff',
1093
+ backgroundColorAlternate: '#eeeeee',
1094
+ },
1095
  button: {
1096
  text: '<%= __('Button') | escape('js') %>',
1097
  url: '',
1163
  },
1164
  posts: {
1165
  amount: '10',
1166
+ withLayout: true,
1167
  contentType: 'post', // 'post'|'page'|'mailpoet_page'
1168
  postStatus: 'publish', // 'draft'|'pending'|'private'|'publish'|'future'
1169
  inclusionType: 'include', // 'include'|'exclude'
1172
  titleAlignment: 'left', // 'left'|'center'|'right'
1173
  titleIsLink: false, // false|true
1174
  imageFullWidth: false, // true|false
1175
+ featuredImagePosition: 'alternate', // 'centered'|'left'|'right'|'alternate'|'none',
1176
  showAuthor: 'no', // 'no'|'aboveText'|'belowText'
1177
  authorPrecededBy: '<%= __('Author:') | escape('js') %>',
1178
  showCategories: 'no', // 'no'|'aboveText'|'belowText'
views/newsletter/templates/blocks/automatedLatestContentLayout/block.hbs ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <div class="mailpoet_tools"></div>
2
+ <div class="mailpoet_content">
3
+ <div class="mailpoet_automated_latest_content_block_overlay"></div>
4
+ <div class="mailpoet_automated_latest_content_block_posts"></div>
5
+ </div>
6
+ <div class="mailpoet_block_highlight"></div>
views/newsletter/templates/blocks/automatedLatestContentLayout/index.php ADDED
File without changes
views/newsletter/templates/blocks/automatedLatestContentLayout/settings.hbs ADDED
@@ -0,0 +1,313 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h3><%= __('Post selection') %></h3>
2
+
3
+ <div class="mailpoet_form_field">
4
+ <div class="mailpoet_form_field_title mailpoet_form_field_title_inline"><%= __('Show:') %></div>
5
+ <div class="mailpoet_form_field_input_option">
6
+ <input type="text" class="mailpoet_input mailpoet_input_small mailpoet_automated_latest_content_show_amount" value="{{ model.amount }}" maxlength="2" size="2" />
7
+ <select class="mailpoet_select mailpoet_select_large mailpoet_automated_latest_content_content_type">
8
+ <option value="post" {{#ifCond model.contentType '==' 'post'}}SELECTED{{/ifCond}}><%= __('Posts') %></option>
9
+ <option value="page" {{#ifCond model.contentType '==' 'page'}}SELECTED{{/ifCond}}><%= __('Pages') %></option>
10
+ <option value="mailpoet_page" {{#ifCond model.contentType '==' 'mailpoet_page'}}SELECTED{{/ifCond}}><%= __('MailPoet pages') %></option>
11
+ </select>
12
+ </div>
13
+ </div>
14
+
15
+ <div class="mailpoet_form_field">
16
+ <div class="mailpoet_form_field_select_option">
17
+ <select class="mailpoet_select mailpoet_automated_latest_content_categories_and_tags" multiple="multiple">
18
+ {{#each model.terms}}
19
+ <option value="{{ id }}" selected="selected">{{ text }}</option>
20
+ {{/each}}
21
+ </select>
22
+ </div>
23
+ <div class="mailpoet_form_field_radio_option">
24
+ <label>
25
+ <input type="radio" name="mailpoet_automated_latest_content_include_or_exclude" class="mailpoet_automated_latest_content_include_or_exclude" value="include" {{#ifCond model.inclusionType '==' 'include'}}CHECKED{{/ifCond}}/>
26
+ <%= __('Include') %>
27
+ </label>
28
+ </div>
29
+ <div class="mailpoet_form_field_radio_option">
30
+ <label>
31
+ <input type="radio" name="mailpoet_automated_latest_content_include_or_exclude" class="mailpoet_automated_latest_content_include_or_exclude" value="exclude" {{#ifCond model.inclusionType '==' 'exclude'}}CHECKED{{/ifCond}} />
32
+ <%= __('Exclude') %>
33
+ </label>
34
+ </div>
35
+ </div>
36
+
37
+ <hr class="mailpoet_separator" />
38
+
39
+
40
+ <div class="mailpoet_form_field">
41
+ <a href="javascript:;" class="mailpoet_automated_latest_content_show_display_options"><%= __('Display options') %></a>
42
+ </div>
43
+ <div class="mailpoet_automated_latest_content_display_options mailpoet_closed">
44
+ <div class="mailpoet_form_field">
45
+ <a href="javascript:;" class="mailpoet_automated_latest_content_hide_display_options"><%= __('Hide display options') %></a>
46
+ </div>
47
+
48
+ <div class="mailpoet_form_field">
49
+ <div class="mailpoet_form_field_radio_option">
50
+ <label>
51
+ <input type="radio" name="mailpoet_automated_latest_content_display_type" class="mailpoet_automated_latest_content_display_type" value="excerpt" {{#ifCond model.displayType '==' 'excerpt'}}CHECKED{{/ifCond}}/>
52
+ <%= __('Excerpt') %>
53
+ </label>
54
+ </div>
55
+ <div class="mailpoet_form_field_radio_option">
56
+ <label>
57
+ <input type="radio" name="mailpoet_automated_latest_content_display_type" class="mailpoet_automated_latest_content_display_type" value="full" {{#ifCond model.displayType '==' 'full'}}CHECKED{{/ifCond}}/>
58
+ <%= __('Full post') %>
59
+ </label>
60
+ </div>
61
+ <div class="mailpoet_form_field_radio_option">
62
+ <label>
63
+ <input type="radio" name="mailpoet_automated_latest_content_display_type" class="mailpoet_automated_latest_content_display_type" value="titleOnly" {{#ifCond model.displayType '==' 'titleOnly'}}CHECKED{{/ifCond}} />
64
+ <%= __('Title only') %>
65
+ </label>
66
+ </div>
67
+ </div>
68
+
69
+ <div class="mailpoet_form_field">
70
+ <div class="mailpoet_form_field_title"><%= __('Title Format') %></div>
71
+ <div class="mailpoet_form_field_radio_option">
72
+ <label>
73
+ <input type="radio" name="mailpoet_automated_latest_content_title_format" class="mailpoet_automated_latest_content_title_format" value="h1" {{#ifCond model.titleFormat '==' 'h1'}}CHECKED{{/ifCond}}/>
74
+ <%= __('Heading 1') %>
75
+ </label>
76
+ </div>
77
+ <div class="mailpoet_form_field_radio_option">
78
+ <label>
79
+ <input type="radio" name="mailpoet_automated_latest_content_title_format" class="mailpoet_automated_latest_content_title_format" value="h2" {{#ifCond model.titleFormat '==' 'h2'}}CHECKED{{/ifCond}}/>
80
+ <%= __('Heading 2') %>
81
+ </label>
82
+ </div>
83
+ <div class="mailpoet_form_field_radio_option">
84
+ <label>
85
+ <input type="radio" name="mailpoet_automated_latest_content_title_format" class="mailpoet_automated_latest_content_title_format" value="h3" {{#ifCond model.titleFormat '==' 'h3'}}CHECKED{{/ifCond}}/>
86
+ <%= __('Heading 3') %>
87
+ </label>
88
+ </div>
89
+ <div class="mailpoet_form_field_radio_option mailpoet_automated_latest_content_title_as_list {{#ifCond model.displayType '!=' 'titleOnly'}}mailpoet_hidden{{/ifCond}}">
90
+ <label>
91
+ <input type="radio" name="mailpoet_automated_latest_content_title_format" class="mailpoet_automated_latest_content_title_format" value="ul" {{#ifCond model.titleFormat '==' 'ul'}}CHECKED{{/ifCond}}/>
92
+ <%= __('Show as list') %>
93
+ </label>
94
+ </div>
95
+ </div>
96
+
97
+ <div class="mailpoet_form_field">
98
+ <div class="mailpoet_form_field_title"><%= __('Title Alignment') %></div>
99
+ <div class="mailpoet_form_field_radio_option">
100
+ <label>
101
+ <input type="radio" name="mailpoet_automated_latest_content_title_alignment" class="mailpoet_automated_latest_content_title_alignment" value="left" {{#ifCond model.titleAlignment '==' 'left'}}CHECKED{{/ifCond}} />
102
+ <%= __('Left') %>
103
+ </label>
104
+ </div>
105
+ <div class="mailpoet_form_field_radio_option">
106
+ <label>
107
+ <input type="radio" name="mailpoet_automated_latest_content_title_alignment" class="mailpoet_automated_latest_content_title_alignment" value="center" {{#ifCond model.titleAlignment '==' 'center'}}CHECKED{{/ifCond}} />
108
+ <%= __('Center') %>
109
+ </label>
110
+ </div>
111
+ <div class="mailpoet_form_field_radio_option">
112
+ <label>
113
+ <input type="radio" name="mailpoet_automated_latest_content_title_alignment" class="mailpoet_automated_latest_content_title_alignment" value="right" {{#ifCond model.titleAlignment '==' 'right'}}CHECKED{{/ifCond}} />
114
+ <%= __('Right') %>
115
+ </label>
116
+ </div>
117
+ </div>
118
+
119
+ <div class="mailpoet_form_field mailpoet_automated_latest_content_title_as_link {{#ifCond model.titleFormat '===' 'ul'}}mailpoet_hidden{{/ifCond}}">
120
+ <div class="mailpoet_form_field_title"><%= __('Title as links') %></div>
121
+ <div class="mailpoet_form_field_radio_option">
122
+ <label>
123
+ <input type="radio" name="mailpoet_automated_latest_content_title_as_links" class="mailpoet_automated_latest_content_title_as_links" value="true" {{#if model.titleIsLink}}CHECKED{{/if}}/>
124
+ <%= __('Yes') %>
125
+ </label>
126
+ </div>
127
+ <div class="mailpoet_form_field_radio_option">
128
+ <label>
129
+ <input type="radio" name="mailpoet_automated_latest_content_title_as_links" class="mailpoet_automated_latest_content_title_as_links" value="false" {{#unless model.titleIsLink}}CHECKED{{/unless}}/>
130
+ <%= __('No') %>
131
+ </label>
132
+ </div>
133
+ </div>
134
+
135
+ <hr class="mailpoet_separator mailpoet_automated_latest_content_image_separator {{#ifCond model.displayType '===' 'titleOnly'}}mailpoet_hidden{{/ifCond}}" />
136
+
137
+ <div class="mailpoet_form_field mailpoet_automated_latest_content_featured_image_position_container {{#ifCond model.displayType '!==' 'excerpt'}}mailpoet_hidden{{/ifCond}}">
138
+ <div class="mailpoet_form_field_title"><%= __('Featured image position') %></div>
139
+ <div class="mailpoet_form_field_radio_option">
140
+ <label>
141
+ <input type="radio" name="mailpoet_automated_latest_content_featured_image_position" class="mailpoet_automated_latest_content_featured_image_position" value="centered" {{#ifCond model.featuredImagePosition '==' 'centered' }}CHECKED{{/ifCond}}/>
142
+ <%= __('Centered') %>
143
+ </label>
144
+ </div>
145
+ <div class="mailpoet_form_field_radio_option">
146
+ <label>
147
+ <input type="radio" name="mailpoet_automated_latest_content_featured_image_position" class="mailpoet_automated_latest_content_featured_image_position" value="left" {{#ifCond model.featuredImagePosition '==' 'left' }}CHECKED{{/ifCond}}/>
148
+ <%= __('Left') %>
149
+ </label>
150
+ </div>
151
+ <div class="mailpoet_form_field_radio_option">
152
+ <label>
153
+ <input type="radio" name="mailpoet_automated_latest_content_featured_image_position" class="mailpoet_automated_latest_content_featured_image_position" value="right" {{#ifCond model.featuredImagePosition '==' 'right' }}CHECKED{{/ifCond}}/>
154
+ <%= __('Right') %>
155
+ </label>
156
+ </div>
157
+ <div class="mailpoet_form_field_radio_option">
158
+ <label>
159
+ <input type="radio" name="mailpoet_automated_latest_content_featured_image_position" class="mailpoet_automated_latest_content_featured_image_position" value="alternate" {{#ifCond model.featuredImagePosition '==' 'alternate' }}CHECKED{{/ifCond}}/>
160
+ <%= __('Alternate') %>
161
+ </label>
162
+ </div>
163
+ <div class="mailpoet_form_field_radio_option">
164
+ <label>
165
+ <input type="radio" name="mailpoet_automated_latest_content_featured_image_position" class="mailpoet_automated_latest_content_featured_image_position" value="none" {{#ifCond model.featuredImagePosition '==' 'none' }}CHECKED{{/ifCond}}/>
166
+ <%= __('None') %>
167
+ </label>
168
+ </div>
169
+ </div>
170
+
171
+ <div class="mailpoet_automated_latest_content_non_title_list_options {{#ifCond model.displayType '==' 'titleOnly'}}{{#ifCond model.titleFormat '==' 'ul'}}mailpoet_hidden{{/ifCond}}{{/ifCond}}">
172
+ <div class="mailpoet_form_field mailpoet_automated_latest_content_image_full_width_option {{#ifCond model.displayType '==' 'titleOnly'}}mailpoet_hidden{{/ifCond}}">
173
+ <div class="mailpoet_form_field_title"><%= __('Image width') %></div>
174
+ <div class="mailpoet_form_field_radio_option">
175
+ <label>
176
+ <input type="radio" name="imageFullWidth" class="mailpoet_automated_latest_content_image_full_width" value="true" {{#if model.imageFullWidth}}CHECKED{{/if}}/>
177
+ <%= __('Full width') %>
178
+ </label>
179
+ </div>
180
+ <div class="mailpoet_form_field_radio_option">
181
+ <label>
182
+ <input type="radio" name="imageFullWidth" class="mailpoet_automated_latest_content_image_full_width" value="false" {{#unless model.imageFullWidth}}CHECKED{{/unless}}/>
183
+ <%= __('Padded') %>
184
+ </label>
185
+ </div>
186
+ </div>
187
+
188
+ <hr class="mailpoet_separator" />
189
+
190
+ <div class="mailpoet_form_field">
191
+ <div class="mailpoet_form_field_title"><%= __('Show author') %></div>
192
+ <div class="mailpoet_form_field_radio_option">
193
+ <label>
194
+ <input type="radio" name="mailpoet_automated_latest_content_show_author" class="mailpoet_automated_latest_content_show_author" value="no" {{#ifCond model.showAuthor '==' 'no'}}CHECKED{{/ifCond}}/>
195
+ <%= __('No') %>
196
+ </label>
197
+ </div>
198
+ <div class="mailpoet_form_field_radio_option">
199
+ <label>
200
+ <input type="radio" name="mailpoet_automated_latest_content_show_author" class="mailpoet_automated_latest_content_show_author" value="aboveText" {{#ifCond model.showAuthor '==' 'aboveText'}}CHECKED{{/ifCond}}/>
201
+ <%= __('Above text') %>
202
+ </label>
203
+ </div>
204
+ <div class="mailpoet_form_field_radio_option">
205
+ <label>
206
+ <input type="radio" name="mailpoet_automated_latest_content_show_author" class="mailpoet_automated_latest_content_show_author" value="belowText" {{#ifCond model.showAuthor '==' 'belowText'}}CHECKED{{/ifCond}}/>
207
+ <%= __('Below text') %><br />
208
+ </label>
209
+ </div>
210
+ <div class="mailpoet_form_field_title mailpoet_form_field_title_small"><%= __('Preceded by:') %></div>
211
+ <div class="mailpoet_form_field_input_option mailpoet_form_field_block">
212
+ <input type="text" class="mailpoet_input mailpoet_input_full mailpoet_automated_latest_content_author_preceded_by" value="{{ model.authorPrecededBy }}" />
213
+ </div>
214
+ </div>
215
+
216
+ <div class="mailpoet_form_field">
217
+ <div class="mailpoet_form_field_title"><%= __('Show categories') %></div>
218
+ <div class="mailpoet_form_field_radio_option">
219
+ <label>
220
+ <input type="radio" name="mailpoet_automated_latest_content_show_categories" class="mailpoet_automated_latest_content_show_categories" value="no" {{#ifCond model.showCategories '==' 'no'}}CHECKED{{/ifCond}}/>
221
+ <%= __('No') %>
222
+ </label>
223
+ </div>
224
+ <div class="mailpoet_form_field_radio_option">
225
+ <label>
226
+ <input type="radio" name="mailpoet_automated_latest_content_show_categories" class="mailpoet_automated_latest_content_show_categories" value="aboveText" {{#ifCond model.showCategories '==' 'aboveText'}}CHECKED{{/ifCond}}/>
227
+ <%= __('Above text') %>
228
+ </label>
229
+ </div>
230
+ <div class="mailpoet_form_field_radio_option">
231
+ <label>
232
+ <input type="radio" name="mailpoet_automated_latest_content_show_categories" class="mailpoet_automated_latest_content_show_categories" value="belowText" {{#ifCond model.showCategories '==' 'belowText'}}CHECKED{{/ifCond}}/>
233
+ <%= __('Below text') %>
234
+ </label>
235
+ </div>
236
+ <div class="mailpoet_form_field_title mailpoet_form_field_title_small"><%= __('Preceded by:') %></div>
237
+ <div class="mailpoet_form_field_input_option mailpoet_form_field_block">
238
+ <input type="text" class="mailpoet_input mailpoet_input_full mailpoet_automated_latest_content_categories" value="{{ model.categoriesPrecededBy }}" />
239
+ </div>
240
+ </div>
241
+
242
+ <hr class="mailpoet_separator" />
243
+
244
+ <div class="mailpoet_form_field">
245
+ <div class="mailpoet_form_field_title mailpoet_form_field_title_small"><%= __('"Read more" text') %></div>
246
+ <div class="mailpoet_form_field_radio_option">
247
+ <label>
248
+ <input type="radio" name="mailpoet_automated_latest_content_read_more_type" class="mailpoet_automated_latest_content_read_more_type" value="link" {{#ifCond model.readMoreType '==' 'link'}}CHECKED{{/ifCond}}/>
249
+ <%= __('Link') %>
250
+ </label>
251
+ </div>
252
+ <div class="mailpoet_form_field_radio_option">
253
+ <label>
254
+ <input type="radio" name="mailpoet_automated_latest_content_read_more_type" class="mailpoet_automated_latest_content_read_more_type" value="button" {{#ifCond model.readMoreType '==' 'button'}}CHECKED{{/ifCond}}/>
255
+ <%= __('Button') %>
256
+ </label>
257
+ </div>
258
+
259
+ <div class="mailpoet_form_field_input_option mailpoet_form_field_block">
260
+ <input type="text" class="mailpoet_input mailpoet_input_full mailpoet_automated_latest_content_read_more_text {{#ifCond model.readMoreType '!=' 'link'}}mailpoet_hidden{{/ifCond}}" value="{{ model.readMoreText }}" />
261
+ </div>
262
+
263
+ <div class="mailpoet_form_field_input_option mailpoet_form_field_block">
264
+ <a href="javascript:;" class="mailpoet_automated_latest_content_select_button {{#ifCond model.readMoreType '!=' 'button'}}mailpoet_hidden{{/ifCond}}"><%= __('Design a button') %></a>
265
+ </div>
266
+ </div>
267
+
268
+ <hr class="mailpoet_separator" />
269
+ </div>
270
+
271
+ <div class="mailpoet_form_field">
272
+ <div class="mailpoet_form_field_title mailpoet_form_field_title_small"><%= __('Sort by') %></div>
273
+ <div class="mailpoet_form_field_radio_option">
274
+ <label>
275
+ <input type="radio" name="mailpoet_automated_latest_content_sort_by" class="mailpoet_automated_latest_content_sort_by" value="newest" {{#ifCond model.sortBy '==' 'newest'}}CHECKED{{/ifCond}}/>
276
+ <%= __('Newest') %>
277
+ </label>
278
+ </div>
279
+ <div class="mailpoet_form_field_radio_option">
280
+ <label>
281
+ <input type="radio" name="mailpoet_automated_latest_content_sort_by" class="mailpoet_automated_latest_content_sort_by" value="oldest" {{#ifCond model.sortBy '==' 'oldest'}}CHECKED{{/ifCond}}/>
282
+ <%= __('Oldest') %>
283
+ </label>
284
+ </div>
285
+ </div>
286
+
287
+ <div class="mailpoet_automated_latest_content_non_title_list_options {{#ifCond model.displayType '==' 'titleOnly'}}{{#ifCond model.titleFormat '==' 'ul'}}mailpoet_hidden{{/ifCond}}{{/ifCond}}">
288
+ <div class="mailpoet_form_field">
289
+ <div class="mailpoet_form_field_title mailpoet_form_field_title_small"><%= __('Show divider between posts') %></div>
290
+ <div class="mailpoet_form_field_radio_option">
291
+ <label>
292
+ <input type="radio" name="mailpoet_automated_latest_content_show_divider"class="mailpoet_automated_latest_content_show_divider" value="true" {{#if model.showDivider}}CHECKED{{/if}}/>
293
+ <%= __('Yes') %>
294
+ </label>
295
+ </div>
296
+ <div class="mailpoet_form_field_radio_option">
297
+ <label>
298
+ <input type="radio" name="mailpoet_automated_latest_content_show_divider"class="mailpoet_automated_latest_content_show_divider" value="false" {{#unless model.showDivider}}CHECKED{{/unless}}/>
299
+ <%= __('No') %>
300
+ </label>
301
+ </div>
302
+ <div>
303
+ <a href="javascript:;" class="mailpoet_automated_latest_content_select_divider"><%= __('Select divider') %></a>
304
+ </div>
305
+ </div>
306
+
307
+ </div>
308
+ </div>
309
+
310
+ <div class="mailpoet_form_field">
311
+ <input type="button" class="button button-primary mailpoet_done_editing" value="<%= __('Done') | escape('html_attr') %>" />
312
+ </div>
313
+
views/newsletter/templates/blocks/automatedLatestContentLayout/widget.hbs ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <div class="mailpoet_widget_icon">
2
+ <%= source('newsletter/templates/svg/block-icons/auto-post.svg') %>
3
+ </div>
4
+ <div class="mailpoet_widget_title"><%= __('Automatic Latest Content') %></div>
views/newsletter/templates/blocks/posts/block.hbs CHANGED
@@ -1,5 +1,3 @@
1
  <div class="mailpoet_tools"></div>
2
- <div class="mailpoet_content">
3
- <div class="mailpoet_posts_block_posts"></div>
4
- </div>
5
  <div class="mailpoet_block_highlight"></div>
1
  <div class="mailpoet_tools"></div>
2
+ <div class="mailpoet_posts_container"></div>
 
 
3
  <div class="mailpoet_block_highlight"></div>
views/newsletter/templates/blocks/posts/settingsDisplayOptions.hbs CHANGED
@@ -95,14 +95,26 @@
95
  <div class="mailpoet_form_field_title"><%= __('Featured image position') %></div>
96
  <div class="mailpoet_form_field_radio_option">
97
  <label>
98
- <input type="radio" name="mailpoet_posts_featured_image_position" class="mailpoet_posts_featured_image_position" value="belowTitle" {{#ifCond model.featuredImagePosition '==' 'belowTitle' }}CHECKED{{/ifCond}}/>
99
- <%= __('Below title') %>
100
  </label>
101
  </div>
102
  <div class="mailpoet_form_field_radio_option">
103
  <label>
104
- <input type="radio" name="mailpoet_posts_featured_image_position" class="mailpoet_posts_featured_image_position" value="aboveTitle" {{#ifCond model.featuredImagePosition '==' 'aboveTitle' }}CHECKED{{/ifCond}}/>
105
- <%= __('Above block') %>
 
 
 
 
 
 
 
 
 
 
 
 
106
  </label>
107
  </div>
108
  <div class="mailpoet_form_field_radio_option">
95
  <div class="mailpoet_form_field_title"><%= __('Featured image position') %></div>
96
  <div class="mailpoet_form_field_radio_option">
97
  <label>
98
+ <input type="radio" name="mailpoet_posts_featured_image_position" class="mailpoet_posts_featured_image_position" value="centered" {{#ifCond model.featuredImagePosition '==' 'centered' }}CHECKED{{/ifCond}}/>
99
+ <%= __('Centered') %>
100
  </label>
101
  </div>
102
  <div class="mailpoet_form_field_radio_option">
103
  <label>
104
+ <input type="radio" name="mailpoet_posts_featured_image_position" class="mailpoet_posts_featured_image_position" value="left" {{#ifCond model.featuredImagePosition '==' 'left' }}CHECKED{{/ifCond}}/>
105
+ <%= __('Left') %>
106
+ </label>
107
+ </div>
108
+ <div class="mailpoet_form_field_radio_option">
109
+ <label>
110
+ <input type="radio" name="mailpoet_posts_featured_image_position" class="mailpoet_posts_featured_image_position" value="right" {{#ifCond model.featuredImagePosition '==' 'right' }}CHECKED{{/ifCond}}/>
111
+ <%= __('Right') %>
112
+ </label>
113
+ </div>
114
+ <div class="mailpoet_form_field_radio_option">
115
+ <label>
116
+ <input type="radio" name="mailpoet_posts_featured_image_position" class="mailpoet_posts_featured_image_position" value="alternate" {{#ifCond model.featuredImagePosition '==' 'alternate' }}CHECKED{{/ifCond}}/>
117
+ <%= __('Alternate') %>
118
  </label>
119
  </div>
120
  <div class="mailpoet_form_field_radio_option">