Page Builder: PageLayer – Drag and Drop website builder - Version 1.5.5

Version Description

(Sep 16, 2021) = * [Improvement] The Title Widget has been further improved. Now users can search for widgets with a slash (/) and replace the selected widget with the current widget and also added the plus icon near the bottom of all widgets to add widget after the current widget. * [Improvement] Login widget has been further improved. * [Improvement] Insert link option UI of our pen editor has been further improved. * [Bug-Fix] In certain cases the Pagelayer pen heading and paragraph formatting was not working properly. This is fixed. * [Bug-Fix] The Roboto font within the system section was not working. We have removed the system font option of Roboto and left the Google Font option. This is fixed. * [Bug-Fix] In certain cases the background video was not working properly. This is fixed. * [Bug-Fix] When the dropdown menu was set to in tablet or mobile mode, the full primary menu was shown when reloading the page. This is fixed. * [Bug-Fix] In some cases, the pen editor's unlink option was not working properly. This is fixed.

Download this release

Release Info

Developer pagelayer
Plugin Icon 128x128 Page Builder: PageLayer – Drag and Drop website builder
Version 1.5.5
Comparing to
See all releases

Code changes from version 1.5.4 to 1.5.5

css/pagelayer-editor-frontend.css CHANGED
@@ -10,15 +10,16 @@ padding:5px;
10
  color:#4f4f4f;
11
  font-size: 16px;
12
  line-height: 1.5;
 
13
  }
14
 
15
- .pagelayer-add-ele .fa{
16
  font-size:15px;
17
  color:#4a4949;
18
  cursor:pointer;
19
  }
20
 
21
- .pagelayer-add-ele .fa:hover:before{
22
  color:#3e8ef7;
23
  }
24
 
@@ -211,7 +212,7 @@ transition: all 0.2s;
211
  white-space:nowrap;
212
  }
213
 
214
- .pagelayer-right-click-options a .fa{
215
  margin-right: 5px;
216
  }
217
 
@@ -242,6 +243,7 @@ border-style: dashed;
242
  position:relative;
243
  font-family: "Open Sans", Arial,Helvetica,sans-serif;
244
  margin:20px auto;
 
245
  }
246
 
247
  .pagelayer-add-widget-area .pagelayer-add-button{
@@ -477,4 +479,37 @@ visibility: visible;
477
  .pagelayer-service-details{
478
  position:relative;
479
  z-index:9;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
480
  }
10
  color:#4f4f4f;
11
  font-size: 16px;
12
  line-height: 1.5;
13
+ position: relative;
14
  }
15
 
16
+ .pagelayer-add-ele .fas{
17
  font-size:15px;
18
  color:#4a4949;
19
  cursor:pointer;
20
  }
21
 
22
+ .pagelayer-add-ele .fas:hover:before{
23
  color:#3e8ef7;
24
  }
25
 
212
  white-space:nowrap;
213
  }
214
 
215
+ .pagelayer-right-click-options a .far{
216
  margin-right: 5px;
217
  }
218
 
243
  position:relative;
244
  font-family: "Open Sans", Arial,Helvetica,sans-serif;
245
  margin:20px auto;
246
+ cursor: pointer;
247
  }
248
 
249
  .pagelayer-add-widget-area .pagelayer-add-button{
479
  .pagelayer-service-details{
480
  position:relative;
481
  z-index:9;
482
+ }
483
+
484
+ .pagelayer-shortcode-plus{
485
+ border: none;
486
+ margin: auto;
487
+ z-index: 11;
488
+ cursor: pointer;
489
+ font-size: 10px;
490
+ position: absolute;
491
+ left: 50%;
492
+ transform: translateX(-50%);
493
+ bottom: -7px;
494
+ text-align: center;
495
+ pointer-events: all;
496
+ display: none;
497
+ line-height:1 !important;
498
+ padding:0 !important;
499
+ }
500
+
501
+ .pagelayer-ele-hover .pagelayer-shortcode-plus{
502
+ display: block;
503
+ }
504
+
505
+ .pagelayer-shortcode-plus .fas{
506
+ display: inline-block !important;
507
+ font-size: 10px !important;
508
+ padding: 2px !important;
509
+ background: #444;
510
+ color: #fff;
511
+ }
512
+
513
+ .pagelayer-shortcode-plus:hover .fas{
514
+ background: #0069d9;
515
  }
css/pagelayer-editor.css CHANGED
@@ -2333,6 +2333,7 @@ font-size: 14px;
2333
  height:30px;
2334
  }
2335
 
 
2336
  .pagelayer-leftbar-search .pli{
2337
  position: absolute;
2338
  top: 0;
@@ -2342,6 +2343,7 @@ color: #666;
2342
  line-height: 30px;
2343
  }
2344
 
 
2345
  .pagelayer-leftbar-search .pagelayer-sf-empty{
2346
  right:0;
2347
  left:auto;
@@ -2353,6 +2355,7 @@ cursor:pointer;
2353
  margin-left:17px;
2354
  }
2355
 
 
2356
  .pagelayer-leftbar-group{
2357
  width: 100%;
2358
  background-repeat: no-repeat;
@@ -2365,6 +2368,7 @@ font-family: Roboto, 'Open Sans', Arial, sans-serif !important;
2365
  margin-bottom: 2px;
2366
  }
2367
 
 
2368
  .pagelayer-leftbar-group h5{
2369
  font-size: 11px;
2370
  line-height: 20px;
@@ -2381,7 +2385,8 @@ padding-top: 20px;
2381
  font-size: 14px;
2382
  }
2383
 
2384
- .pagelayer-shortcode-drag, .pagelayer-shortcode-drag:hover{
 
2385
  width: 100px !important;
2386
  height:67px !important;
2387
  margin-bottom:12px;
@@ -2398,6 +2403,7 @@ background-color:#252529;
2398
  box-shadow:0 0.5rem 1rem #00000026;
2399
  }
2400
 
 
2401
  .pagelayer-shortcode-drag:hover{
2402
  transform: scale(1.06);
2403
  }
@@ -3861,4 +3867,88 @@ background-color: #cc1818;
3861
  .pagelayer-dark .pagelayer-elp-postdate-div .pagelayer-elp-postdate::-webkit-calendar-picker-indicator{
3862
  filter: invert(70%);
3863
  }
3864
- /* Pagelayer post props(tags) end */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2333
  height:30px;
2334
  }
2335
 
2336
+ .pagelayer-widget-search .pli,
2337
  .pagelayer-leftbar-search .pli{
2338
  position: absolute;
2339
  top: 0;
2343
  line-height: 30px;
2344
  }
2345
 
2346
+ .pagelayer-widget-search .pagelayer-sf-empty,
2347
  .pagelayer-leftbar-search .pagelayer-sf-empty{
2348
  right:0;
2349
  left:auto;
2355
  margin-left:17px;
2356
  }
2357
 
2358
+ .pagelayer-widget-group,
2359
  .pagelayer-leftbar-group{
2360
  width: 100%;
2361
  background-repeat: no-repeat;
2368
  margin-bottom: 2px;
2369
  }
2370
 
2371
+ .pagelayer-widget-group h5,
2372
  .pagelayer-leftbar-group h5{
2373
  font-size: 11px;
2374
  line-height: 20px;
2385
  font-size: 14px;
2386
  }
2387
 
2388
+ .pagelayer-shortcode-holder,
2389
+ .pagelayer-shortcode-drag{
2390
  width: 100px !important;
2391
  height:67px !important;
2392
  margin-bottom:12px;
2403
  box-shadow:0 0.5rem 1rem #00000026;
2404
  }
2405
 
2406
+ .pagelayer-shortcode-holder:hover,
2407
  .pagelayer-shortcode-drag:hover{
2408
  transform: scale(1.06);
2409
  }
3867
  .pagelayer-dark .pagelayer-elp-postdate-div .pagelayer-elp-postdate::-webkit-calendar-picker-indicator{
3868
  filter: invert(70%);
3869
  }
3870
+ /* Pagelayer post props(tags) end */
3871
+ /* Pagelayer widget list tooltip start*/
3872
+
3873
+ .pagelayer-widget-tooltip{
3874
+ position: fixed;
3875
+ top: 0;
3876
+ left: 0;
3877
+ background: #fff;
3878
+ width: 300px;
3879
+ max-height: 350px;
3880
+ min-height: 125px;
3881
+ height: 100%;
3882
+ overflow-y: auto;
3883
+ box-shadow: 0 2px 6px rgb(0 0 0 / 5%);
3884
+ border-radius: 2px;
3885
+ display: none;
3886
+ z-index: 999;
3887
+ }
3888
+
3889
+ .pagelayer-widget-search-holder{
3890
+ position: sticky;
3891
+ top: 0;
3892
+ padding: 10px 10%;
3893
+ z-index: 1;
3894
+ background: #fff;
3895
+ }
3896
+
3897
+ .pagelayer-widget-search{
3898
+ position: relative;
3899
+ }
3900
+
3901
+ .pagelayer-pointer.pagelayer-shortcode-text,
3902
+ .pagelayer-pointer.pagelayer-sc{
3903
+ cursor: pointer !important;
3904
+ }
3905
+
3906
+ .pagelayer-widget-tooltip .pagelayer-search-field{
3907
+ border: 2px solid;
3908
+ }
3909
+
3910
+ .pagelayer-widget-tooltip .pagelayer-shortcode-holder{
3911
+ width: 70px !important;
3912
+ }
3913
+
3914
+ .pagelayer-widget-list-tooltip{
3915
+ width: 150px !important;
3916
+ padding: 0px 10px;
3917
+ }
3918
+
3919
+ .pagelayer-shortcode-holder[pagelayer-tag="pl_row"],
3920
+ .pagelayer-shortcode-holder[pagelayer-tag="pl_col"],
3921
+ .pagelayer-widget-list-tooltip .pagelayer-widget-group h5,
3922
+ .pagelayer-widget-list-tooltip .pagelayer-widget-search-holder{
3923
+ display:none !important;
3924
+ }
3925
+
3926
+ .pagelayer-widget-list-tooltip .pagelayer-shortcode{
3927
+ width: 24px;
3928
+ height: 16px;
3929
+ font-size: 14px;
3930
+ text-align: left;
3931
+ }
3932
+
3933
+ .pagelayer-widget-list-tooltip .pagelayer-shortcode-holder{
3934
+ width: 100% !important;
3935
+ height: auto !important;
3936
+ float: unset;
3937
+ margin: 0px;
3938
+ }
3939
+
3940
+ .pagelayer-widget-list-tooltip .pagelayer-sc{
3941
+ display: flex;
3942
+ align-items: center;
3943
+ }
3944
+
3945
+ .pagelayer-widget-list-tooltip .pagelayer-shortcode-text{
3946
+ text-align: left;
3947
+ }
3948
+
3949
+ .pagelayer-widget-list-tooltip .pagelayer-shortcode-inner{
3950
+ height: auto;
3951
+ width: 22px;
3952
+ }
3953
+
3954
+ /* Pagelayer widget list tooltip end*/
css/pagelayer-pen.css CHANGED
@@ -189,15 +189,22 @@ width: 16px;
189
  content: attr(data-value);
190
  }
191
 
192
- .pagelayer-pen-link-tooltip{
193
- padding-left:8px;
 
 
 
 
 
 
194
  }
195
 
196
  .pagelayer-pen-unlink-btn,
197
  .pagelayer-pen-link-btn{
198
- padding:8px;
199
- color: #007bff !important;
200
  cursor: pointer;
 
 
201
  }
202
 
203
  /* End Dropdown picker*/
@@ -230,6 +237,8 @@ width: 100%;
230
  height: calc(100% - 50px);
231
  border-radius: 0;
232
  padding: 10px;
 
 
233
  }
234
 
235
  .pagelayer-pen-html-viewer .pagelayer-pen-html-btn{
189
  content: attr(data-value);
190
  }
191
 
192
+ .pagelayer-pen-link-tooltip > *{
193
+ margin:0 2px;
194
+ }
195
+
196
+ .pagelayer-pen-link-tooltip input{
197
+ min-width: 300px;
198
+ font-size: 13px;
199
+ padding: 5px;
200
  }
201
 
202
  .pagelayer-pen-unlink-btn,
203
  .pagelayer-pen-link-btn{
204
+ padding: 7px;
 
205
  cursor: pointer;
206
+ border-radius: 4px;
207
+ font-size: 13px;
208
  }
209
 
210
  /* End Dropdown picker*/
237
  height: calc(100% - 50px);
238
  border-radius: 0;
239
  padding: 10px;
240
+ font-family: courier, courier new, serif;
241
+ line-height: 1.5;
242
  }
243
 
244
  .pagelayer-pen-html-viewer .pagelayer-pen-html-btn{
init.php CHANGED
@@ -5,7 +5,7 @@ if (!defined('ABSPATH')) exit;
5
 
6
  define('PAGELAYER_BASE', plugin_basename(PAGELAYER_FILE));
7
  define('PAGELAYER_PRO_BASE', 'pagelayer-pro/pagelayer-pro.php');
8
- define('PAGELAYER_VERSION', '1.5.4');
9
  define('PAGELAYER_DIR', dirname(PAGELAYER_FILE));
10
  define('PAGELAYER_SLUG', 'pagelayer');
11
  define('PAGELAYER_URL', plugins_url('', PAGELAYER_FILE));
@@ -760,12 +760,18 @@ function pagelayer_global_styles(){
760
  .pagelayer-hide-tablet{
761
  display:none !important;
762
  }
 
 
 
763
  }
764
 
765
  @media (max-width: '.$pagelayer->settings['mobile_breakpoint'].'px){
766
  .pagelayer-hide-mobile{
767
  display:none !important;
768
  }
 
 
 
769
  }'.PHP_EOL;
770
 
771
  }
5
 
6
  define('PAGELAYER_BASE', plugin_basename(PAGELAYER_FILE));
7
  define('PAGELAYER_PRO_BASE', 'pagelayer-pro/pagelayer-pro.php');
8
+ define('PAGELAYER_VERSION', '1.5.5');
9
  define('PAGELAYER_DIR', dirname(PAGELAYER_FILE));
10
  define('PAGELAYER_SLUG', 'pagelayer');
11
  define('PAGELAYER_URL', plugins_url('', PAGELAYER_FILE));
760
  .pagelayer-hide-tablet{
761
  display:none !important;
762
  }
763
+ .pagelayer-wp-menu-holder[data-drop_breakpoint="tablet"] .pagelayer-wp_menu-ul{
764
+ display:none;
765
+ }
766
  }
767
 
768
  @media (max-width: '.$pagelayer->settings['mobile_breakpoint'].'px){
769
  .pagelayer-hide-mobile{
770
  display:none !important;
771
  }
772
+ .pagelayer-wp-menu-holder[data-drop_breakpoint="mobile"] .pagelayer-wp_menu-ul{
773
+ display:none;
774
+ }
775
  }'.PHP_EOL;
776
 
777
  }
js/pagelayer-editor.js CHANGED
@@ -89,8 +89,11 @@ function pagelayer_start(){
89
  pagelayer_bottombar();
90
 
91
  // Make the Leftbar
92
- pagelayer_leftbar();
93
-
 
 
 
94
  // Add widget section
95
  pagelayer_add_widget();
96
 
@@ -1144,14 +1147,15 @@ function pagelayer_empty_col(selector){
1144
  jEle.append('<div class="pagelayer-add-ele pagelayer-ele-wrap"><i class="fas fa-plus"></i><br /><span>Empty column please Drag Widgets</span></div>');
1145
  //var h = jEle.parent().parent().children('.pagelayer-ele-overlay').height();
1146
  //jEle.children('.pagelayer-add-ele').height(h);
1147
- jEle.find('>.pagelayer-add-ele .fa').unbind('click');
1148
- jEle.find('>.pagelayer-add-ele .fa').on('click', function(event){
1149
  event.stopPropagation();
1150
  pagelayer.$$('.pagelayer-elpd-close').click();
1151
 
1152
  // Show left bar
1153
  pagelayer.$$('.pagelayer-leftbar-table').removeClass('pagelayer-leftbar-hidden pagelayer-leftbar-minimize');
1154
 
 
1155
  });
1156
 
1157
  // Any add ele sign with non-empty columns here ?
@@ -1576,6 +1580,9 @@ function pagelayer_element_clicked(selector, e){
1576
  pagelayer_make_editable(jQuery(this), e);
1577
  });
1578
 
 
 
 
1579
  // Show left bar
1580
  pagelayer.$$('.pagelayer-leftbar-table').removeClass('pagelayer-leftbar-hidden pagelayer-leftbar-minimize');
1581
 
@@ -1592,6 +1599,33 @@ function pagelayer_element_clicked(selector, e){
1592
 
1593
  }
1594
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1595
  // The edit option
1596
  function pagelayer_edit_element(selector){
1597
  pagelayer_element_clicked(selector);
@@ -1746,6 +1780,12 @@ function pagelayer_element_setup(selector, render){
1746
 
1747
  // Append to the child
1748
  overlay.append(html);
 
 
 
 
 
 
1749
  jQuery('[pagelayer-option-id='+id+']').hide();
1750
 
1751
  // Setup the HOVER events ABD create WRAPS IF we dont have a parent
@@ -2162,29 +2202,31 @@ pagelayer.gDocument.keydown(function(event){
2162
  return caretOffset;
2163
  }
2164
 
2165
- if( getCaretCharacterOffsetWithin(editable[0]) != 0 ){
 
 
2166
  return;
2167
  }
2168
 
2169
  //event.preventDefault();
2170
- var html = editable[0].innerHTML;
2171
- html = jQuery('<div>').append(html).html();
2172
  editable.blur();
2173
  prev.children('.pagelayer-ele').click();
2174
-
2175
- var prevArea = prev.find('[pagelayer-editable="text"]');
2176
  prevArea.click();
2177
 
2178
  var newSel = window.getSelection();
2179
  var newRange = newSel.getRangeAt(0);
2180
-
2181
- var lastChild = prevArea.children().last();
2182
 
2183
  prevArea.append(html);
2184
  prevArea.trigger('input');
2185
 
2186
- if(lastChild.length > 0 ){
2187
- newRange.setStartAfter(lastChild[0]);
 
 
 
 
2188
  }
2189
 
2190
  newRange.collapse(true);
@@ -6252,3 +6294,213 @@ function pagelayer_length(mixed_var) {
6252
 
6253
  return length;
6254
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  pagelayer_bottombar();
90
 
91
  // Make the Leftbar
92
+ pagelayer_leftbar();
93
+
94
+ // Make widget list toolbar
95
+ pagelayer_create_widget_tooltip();
96
+
97
  // Add widget section
98
  pagelayer_add_widget();
99
 
1147
  jEle.append('<div class="pagelayer-add-ele pagelayer-ele-wrap"><i class="fas fa-plus"></i><br /><span>Empty column please Drag Widgets</span></div>');
1148
  //var h = jEle.parent().parent().children('.pagelayer-ele-overlay').height();
1149
  //jEle.children('.pagelayer-add-ele').height(h);
1150
+ jEle.find('>.pagelayer-add-ele .fas').unbind('click');
1151
+ jEle.find('>.pagelayer-add-ele .fas').on('click', function(event){
1152
  event.stopPropagation();
1153
  pagelayer.$$('.pagelayer-elpd-close').click();
1154
 
1155
  // Show left bar
1156
  pagelayer.$$('.pagelayer-leftbar-table').removeClass('pagelayer-leftbar-hidden pagelayer-leftbar-minimize');
1157
 
1158
+ pagelayer_show_widget_list(jQuery(this));
1159
  });
1160
 
1161
  // Any add ele sign with non-empty columns here ?
1580
  pagelayer_make_editable(jQuery(this), e);
1581
  });
1582
 
1583
+ // Use text widget for search widget
1584
+ pagelayer_search_widgets(jEle);
1585
+
1586
  // Show left bar
1587
  pagelayer.$$('.pagelayer-leftbar-table').removeClass('pagelayer-leftbar-hidden pagelayer-leftbar-minimize');
1588
 
1599
 
1600
  }
1601
 
1602
+ // Use text widget for search widget
1603
+ function pagelayer_search_widgets(jEle){
1604
+
1605
+ var tag = pagelayer_tag(jEle);
1606
+
1607
+ if(tag !='pl_heading'){
1608
+ return;
1609
+ }
1610
+
1611
+ jEle.find('[pagelayer-editable="text"]').off('input.search_widgets');
1612
+ jEle.find('[pagelayer-editable="text"]').on('input.search_widgets', function(){
1613
+
1614
+ var tEle = jQuery(this);
1615
+ var val = tEle.text();
1616
+
1617
+ if(val.charAt(0) == "/"){
1618
+ val = val.replace('/', '');
1619
+ pagelayer_show_widget_list(tEle, val);
1620
+ }else if(pagelayer.$$('.pagelayer-widget-tooltip').is(':visible')){
1621
+ // Hide Widget list
1622
+ pagelayer.gDocument.trigger('mousedown.pagelayer_wdlist');
1623
+ }
1624
+
1625
+ });
1626
+
1627
+ }
1628
+
1629
  // The edit option
1630
  function pagelayer_edit_element(selector){
1631
  pagelayer_element_clicked(selector);
1780
 
1781
  // Append to the child
1782
  overlay.append(html);
1783
+
1784
+ // Add shortcode icon
1785
+ if(tag != 'pl_row' && tag != 'pl_col'){
1786
+ overlay.append('<span class="pagelayer-shortcode-plus" onclick="event.stopPropagation();pagelayer_show_widget_list(this);"><i class="fas fa-plus"></i></span>');
1787
+ }
1788
+
1789
  jQuery('[pagelayer-option-id='+id+']').hide();
1790
 
1791
  // Setup the HOVER events ABD create WRAPS IF we dont have a parent
2202
  return caretOffset;
2203
  }
2204
 
2205
+ var prevArea = prev.find('[pagelayer-editable="text"]');
2206
+
2207
+ if( getCaretCharacterOffsetWithin(editable[0]) != 0 || prevArea.length < 1){
2208
  return;
2209
  }
2210
 
2211
  //event.preventDefault();
2212
+ var html = editable.html();
 
2213
  editable.blur();
2214
  prev.children('.pagelayer-ele').click();
 
 
2215
  prevArea.click();
2216
 
2217
  var newSel = window.getSelection();
2218
  var newRange = newSel.getRangeAt(0);
2219
+ var lastChild = jQuery(prevArea[0].lastChild);
 
2220
 
2221
  prevArea.append(html);
2222
  prevArea.trigger('input');
2223
 
2224
+ if(lastChild.length > 0){
2225
+ if(lastChild[0].nextSibling != null){
2226
+ newRange.setStart(lastChild[0].nextSibling, 0);
2227
+ }else{
2228
+ newRange.setStartAfter(lastChild[0]);
2229
+ }
2230
  }
2231
 
2232
  newRange.collapse(true);
6294
 
6295
  return length;
6296
  };
6297
+
6298
+ // Create Widget list dropdown
6299
+ function pagelayer_create_widget_tooltip(){
6300
+
6301
+ var html = '<div class="pagelayer-widget-tooltip">'+
6302
+ '<div class="pagelayer-widget-search-holder">'+
6303
+ '<div class="pagelayer-widget-search">'+
6304
+ '<i class="pli pli-search" ></i><input class="pagelayer-search-field" /><span class="pagelayer-sf-empty pli">&times;</span>'+
6305
+ '</div>'+
6306
+ '</div>';
6307
+
6308
+ for(var x in pagelayer_groups){
6309
+
6310
+ // Title
6311
+ html += '<div class="pagelayer-widget-group pagelayer-group-name-'+x+'"><h5>'+x+'</h5>';
6312
+
6313
+ // Indivdual icon
6314
+ for(var y in pagelayer_groups[x]){
6315
+
6316
+ var sc = pagelayer_groups[x][y];
6317
+
6318
+ if(!(sc in pagelayer_shortcodes) || 'not_visible' in pagelayer_shortcodes[sc]){
6319
+ continue;
6320
+ }
6321
+
6322
+ html += '<div class="pagelayer-shortcode-holder" pagelayer-tag="'+sc+'">'+
6323
+ '<div class="pagelayer-pointer pagelayer-sc">'+
6324
+ '<center class="pagelayer-shortcode-inner">';
6325
+
6326
+ if('icon' in pagelayer_shortcodes[sc]){
6327
+ html += '<i class="pagelayer-shortcode '+pagelayer_shortcodes[sc]['icon']+'"></i>';
6328
+ }else{
6329
+ html += '<i class="pagelayer-shortcode pli pagelayer-'+sc+'"></i>';
6330
+ }
6331
+
6332
+ html += '</center>'+
6333
+ '<span class="pagelayer-pointer pagelayer-shortcode-text">'+pagelayer_shortcodes[sc]['name']+'</span>'+
6334
+ '</div>'+
6335
+ '</div>';
6336
+
6337
+ }
6338
+
6339
+ html += '</div>';
6340
+
6341
+ }
6342
+
6343
+ html += '</div>';
6344
+
6345
+ pagelayer.$$('body').append(html);
6346
+
6347
+ var wdHolder = pagelayer.$$('.pagelayer-widget-tooltip');
6348
+
6349
+ // Hide the ones which are not supposed to be shown
6350
+ wdHolder.find('.pagelayer-search-field').on('input', function(){
6351
+
6352
+ var val = jQuery(this).val();
6353
+ var re = new RegExp(val, 'i');
6354
+
6355
+ // Show only the required tags
6356
+ wdHolder.find('.pagelayer-widget-group').each(function(){
6357
+
6358
+ var group = jQuery(this);
6359
+ var res = group.find('[pagelayer-tag]');
6360
+ var hidden = 0;
6361
+
6362
+ res.each(function(){
6363
+
6364
+ var tEle = jQuery(this);
6365
+ if(tEle.find('.pagelayer-shortcode-text').html().match(re)){
6366
+ tEle.show();
6367
+ }else{
6368
+ hidden += 1;
6369
+ tEle.hide();
6370
+ }
6371
+
6372
+ });
6373
+
6374
+ // Hide the whole group
6375
+ if(hidden == res.length){
6376
+ group.hide();
6377
+ }else{
6378
+ group.show();
6379
+ }
6380
+
6381
+ });
6382
+
6383
+ });
6384
+
6385
+ // On click search empty
6386
+ wdHolder.find('.pagelayer-widget-search>.pagelayer-sf-empty').click(function(){
6387
+ wdHolder.find('.pagelayer-search-field').val('').trigger('input');
6388
+ });
6389
+
6390
+ pagelayer.gDocument.on('mousedown.pagelayer_wdlist', function(e){
6391
+ var target = jQuery(e.target);
6392
+
6393
+ if(target.closest('.pagelayer-widget-tooltip').is(wdHolder)){
6394
+ return;
6395
+ }
6396
+
6397
+ wdHolder.hide();
6398
+ jQuery(window).off('scroll.pagelayer_wdlist resize.pagelayer_wdlist');
6399
+ });
6400
+
6401
+ }
6402
+
6403
+ // Show Widget list dropdown
6404
+ function pagelayer_show_widget_list(jEle, val){
6405
+
6406
+ val = val || '';
6407
+ jEle = jQuery(jEle);
6408
+
6409
+ var wEle = pagelayer.$$('.pagelayer-widget-tooltip'),
6410
+ bounds = jEle[0].getBoundingClientRect(),
6411
+ winH = jQuery(window).height(),
6412
+ iOffset = pagelayer.$$('#pagelayer-iframe').offset(),
6413
+ style = {},
6414
+ wTop = 'auto',
6415
+ wBottom = 'auto',
6416
+ wHeight = '';
6417
+
6418
+ var search_val = function(_val){
6419
+ wEle.find('.pagelayer-search-field').val(_val);
6420
+ wEle.find('.pagelayer-search-field').trigger('input');
6421
+ }
6422
+
6423
+ style['left'] = (bounds.left + iOffset.left) - wEle.width() / 2;
6424
+
6425
+ if(winH / 2 < bounds.top + 10){
6426
+ wBottom = winH - bounds.top + 10;
6427
+ wHeight = bounds.top - 10;
6428
+ }else{
6429
+ wTop = bounds.bottom + 10;
6430
+ wHeight = winH - bounds.bottom - 10;
6431
+ }
6432
+
6433
+ style['top'] = wTop;
6434
+ style['bottom'] = wBottom;
6435
+ style['max-height'] = '';
6436
+
6437
+ if(wHeight < 350){
6438
+ style['max-height'] = wHeight;
6439
+ }
6440
+
6441
+ if(val){
6442
+ search_val(val);
6443
+ }else{
6444
+ search_val();
6445
+ }
6446
+
6447
+ wEle.closest('.pagelayer-widget-tooltip').show();
6448
+ wEle.css(style);
6449
+
6450
+ jQuery(window).off('scroll.pagelayer_wdlist resize.pagelayer_wdlist');
6451
+ jQuery(window).on('scroll.pagelayer_wdlist resize.pagelayer_wdlist', function(){
6452
+ pagelayer_show_widget_list(jEle);
6453
+ });
6454
+
6455
+ // In list view?
6456
+ if(jEle.closest('[pagelayer-editable]').length > 0){
6457
+ wEle.addClass('pagelayer-widget-list-tooltip');
6458
+
6459
+ if(wEle.find('.pagelayer-widget-group:visible').length < 1){
6460
+ // Hide Widget list
6461
+ pagelayer.gDocument.trigger('mousedown.pagelayer_wdlist');
6462
+ }
6463
+ }else{
6464
+ wEle.removeClass('pagelayer-widget-list-tooltip');
6465
+ }
6466
+
6467
+ wEle.find('.pagelayer-shortcode-holder').off('click');
6468
+ wEle.find('.pagelayer-shortcode-holder').on('click', function(e){
6469
+
6470
+ var tag = jQuery(this).attr('pagelayer-tag');
6471
+ var mWrap = jEle.closest('.pagelayer-ele-wrap[pagelayer-wrap-id]');
6472
+ var mTag = pagelayer_tag(mWrap);
6473
+
6474
+ var ele = jQuery('<div pagelayer-tag="'+tag+'"></div>');
6475
+
6476
+ // Is col?
6477
+ if(mTag == 'pl_col'){
6478
+ var colHolder = mWrap.find('>.pagelayer-col > .pagelayer-col-holder');
6479
+ colHolder.append(ele);
6480
+ pagelayer_empty_col(colHolder);
6481
+ }else{
6482
+ mWrap.after(ele);
6483
+ }
6484
+
6485
+ // Replace widegt
6486
+ if(jEle.closest('[pagelayer-editable]').length > 0){
6487
+ pagelayer_delete_element(mWrap.find('>.pagelayer-ele'));
6488
+ }
6489
+
6490
+ var eleId = pagelayer_onadd(ele, false);
6491
+ var eEle = pagelayer_ele_by_id(eleId);
6492
+
6493
+ // Create Column
6494
+ if( tag == 'pl_inner_row' ){
6495
+ var in_col = jQuery('<div pagelayer-tag="pl_col"></div>');
6496
+ eEle.find('>.pagelayer-row-holder').append(in_col);
6497
+ var in_col_id = pagelayer_onadd(in_col, false);
6498
+ }
6499
+
6500
+ eEle.click();
6501
+
6502
+ // Hide Widget list
6503
+ pagelayer.gDocument.trigger('mousedown.pagelayer_wdlist');
6504
+ });
6505
+
6506
+ }
js/pagelayer-pen.js CHANGED
@@ -129,7 +129,7 @@ class PagelayerPen{
129
  },
130
  align:{
131
  style: 'text-align',
132
- fn: 'alignHandler',
133
  icon: {
134
  'left': '<i class="fas fa-align-left"></i>',
135
  'center': '<i class="fas fa-align-center"></i>',
@@ -500,6 +500,248 @@ class PagelayerPen{
500
 
501
  }
502
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
503
  semanticCode(){
504
  var t = this;
505
  t.semanticTag('b');
@@ -526,14 +768,8 @@ class PagelayerPen{
526
  if($oldTag.contents().length === 0) {
527
  return false;
528
  }
529
-
530
- $oldTag.wrap('<' + newTag + '/>');
531
- if (copyAttributes) {
532
- jQuery.each($oldTag.prop('attributes'), function () {
533
- $oldTag.parent().attr(this.name, this.value);
534
- });
535
- }
536
- $oldTag.contents().unwrap();
537
  });
538
  }
539
 
@@ -1164,7 +1400,9 @@ class PagelayerPen{
1164
  documentSelection = t.doc.getSelection(),
1165
  node = documentSelection.focusNode,
1166
  text = new XMLSerializer().serializeToString(documentSelection.getRangeAt(0).cloneContents()),
1167
- url = '';
 
 
1168
 
1169
  while (['A', 'DIV'].indexOf(node.nodeName) < 0) {
1170
  node = node.parentNode;
@@ -1175,55 +1413,50 @@ class PagelayerPen{
1175
  url = $a.attr('href');
1176
  }
1177
 
 
 
 
 
 
1178
  t.saveRange();
1179
 
1180
  var tooltip = this.addContainer('pagelayer-pen-link-tooltip');
1181
  t.linkTooltip = tooltip;
1182
 
1183
- var html = '<input type="text" name="url" placeholder="https://example.com" value="'+url+'" autocomplete="off"><span class="pagelayer-pen-link-btn">Link</span><span class="pagelayer-pen-unlink-btn">Unlink</span>';
1184
  tooltip.html(html);
1185
 
1186
  var input = tooltip.find('input[name="url"]');
1187
 
 
 
 
 
 
 
 
 
 
1188
  t.linkTooltip.find('.pagelayer-pen-link-btn').on('click', function(){
1189
  var url = input.val();
1190
 
1191
- t.restoreRange();
1192
-
1193
  t.execCmd('createLink', url, true );
1194
  t.editor.trigger('input');
1195
  t.showPen();
1196
  });
1197
 
1198
  t.linkTooltip.find('.pagelayer-pen-unlink-btn').on('click', function(){
1199
- t.restoreRange();
1200
- t.execCmd('unlink', undefined, undefined, true);
 
 
1201
  t.showPen();
1202
  });
1203
 
1204
  t.showPen(t.linkTooltip);
1205
  }
1206
 
1207
- // TODO change this with commandHandler function
1208
- alignHandler(val){
1209
- var t = this;
1210
- var cmd = 'justifyLeft';
1211
-
1212
- switch(val){
1213
- case 'center':
1214
- cmd = 'justifyCenter';
1215
- break;
1216
- case 'right':
1217
- cmd = 'justifyRight';
1218
- break;
1219
- case 'justify':
1220
- cmd = 'justifyFull';
1221
- break;
1222
- }
1223
-
1224
- t.execCmd(cmd, val, true);
1225
- }
1226
-
1227
  imageBtnHandler(){
1228
  var t = this;
1229
  t.destroyEd = false;
129
  },
130
  align:{
131
  style: 'text-align',
132
+ fn: 'formatBlock',
133
  icon: {
134
  'left': '<i class="fas fa-align-left"></i>',
135
  'center': '<i class="fas fa-align-center"></i>',
500
 
501
  }
502
 
503
+ formatBlock(value){
504
+
505
+ var t = this,
506
+ format = t.currentFormat,
507
+ btn = t.handlers[format],
508
+ startNode = t.range.startContainer,
509
+ endNode = t.range.endContainer;
510
+
511
+ if( startNode.nodeType == Node.TEXT_NODE && startNode.parentNode != t.editor[0] ){
512
+ startNode = startNode.parentNode;
513
+ }
514
+
515
+ if( endNode.nodeType == Node.TEXT_NODE && endNode.parentNode != t.editor[0] ){
516
+ endNode = endNode.parentNode;
517
+ }
518
+
519
+ // TODO: only for seleced content
520
+ // Wrap text nodes in span for easier processing
521
+ t.editor.contents().filter(function () {
522
+ return this.nodeType === 3 && this.nodeValue.trim().length > 0;
523
+ }).wrap('<span data-pts/>');
524
+
525
+ var isLineEnd = function(lEle){
526
+ return lEle == null || lEle.nodeName == 'BR' || t.isline(lEle);
527
+ }
528
+
529
+ var wrapLine = function(pLine){
530
+
531
+ var pLine = jQuery(pLine),
532
+ lineFele,
533
+ lineEele,
534
+ finalP;
535
+
536
+ // Get Parent Element
537
+ if(pLine.parentsUntil(t.editor).length > 0){
538
+ pLine = pLine.parentsUntil(t.editor).last();
539
+ }
540
+
541
+ if(t.isline(pLine)){
542
+ return pLine;
543
+ }
544
+
545
+ // Get line first element
546
+ if(isLineEnd(pLine[0].previousSibling)){
547
+ lineFele = pLine;
548
+ }else{
549
+ lineFele = pLine.prevAll().filter(function(){
550
+ return isLineEnd(this.previousSibling);
551
+ }).first();
552
+ }
553
+
554
+ // Get line last element
555
+ if(isLineEnd(lineFele[0].nextSibling)){
556
+ lineEele = lineFele;
557
+ }else{
558
+ lineEele = lineFele.nextAll().filter(function(){
559
+ return isLineEnd(this.nextSibling);
560
+ }).first();
561
+ }
562
+
563
+ // Wrap all with p tag
564
+ if(lineFele.is(lineEele)){
565
+ finalP = lineFele.wrap('<p/>').parent()
566
+ }else{
567
+ finalP = lineFele.nextUntil(lineEele.next()).addBack().wrapAll('<p/>').parent();
568
+ }
569
+
570
+ finalP.next('br').remove();
571
+ return finalP;
572
+ }
573
+
574
+ // Get start block lavel elements
575
+ var $sNode = jQuery(t.blockNode(startNode));
576
+ if($sNode.is(t.editor)){
577
+ $sNode = wrapLine(startNode);
578
+ }
579
+
580
+ var $eNode = jQuery(t.blockNode(endNode));
581
+ if($eNode.is(t.editor)){
582
+ $eNode = wrapLine(endNode);
583
+ }
584
+
585
+ var $oldEle = $sNode;
586
+
587
+ if(! $sNode.is($eNode) ){
588
+
589
+ var findEnd = false;
590
+
591
+ var addElement = function(addEle){
592
+ if(addEle[0].nodeName == 'UL' || addEle[0].nodeName == 'OL') {
593
+ addEle.children().each(function(){
594
+ $oldEle = $oldEle.add(jQuery(this));
595
+ });
596
+ return;
597
+ }
598
+ $oldEle = $oldEle.add(addEle);
599
+ }
600
+
601
+ var wrapAllEle = function(nextEle){
602
+
603
+ if(nextEle.is($eNode) || nextEle.find($eNode).length > 0){
604
+ findEnd = true;
605
+ return;
606
+ }
607
+
608
+ if(nextEle.length < 1){
609
+ return;
610
+ }
611
+
612
+ if(!t.isline(nextEle[0])){
613
+ nextEle = wrapLine(nextEle);
614
+ }
615
+
616
+ addElement(nextEle);
617
+ wrapAllEle( nextEle.next() );
618
+ }
619
+
620
+ wrapAllEle($sNode.next());
621
+
622
+ // Is start Element have a another parent
623
+ var pars = $sNode.parentsUntil(t.editor);
624
+
625
+ pars.each(function(){
626
+ var $par = jQuery(this);
627
+ wrapAllEle($par.next());
628
+ });
629
+
630
+ if( pars.length > 0 ){
631
+ $sNode = pars.last();
632
+ }
633
+
634
+ var nextEnd = $sNode.nextAll().filter(function(){
635
+ return jQuery(this).is($eNode) || jQuery(this).find($eNode).length > 0;
636
+ }).first();
637
+
638
+ // Add elements
639
+ if( nextEnd.length > 0 ){
640
+ var $nextEle = $sNode.nextUntil(nextEnd);
641
+ $nextEle.each(function(){
642
+ var ulEle = jQuery(this);
643
+ if($oldEle.has(ulEle)) return;
644
+ addElement(ulEle);
645
+ });
646
+ }
647
+
648
+ // Add end element
649
+ if(nextEnd.length > 0 && !nextEnd.is($eNode) && (nextEnd[0].nodeName == 'UL' || nextEnd[0].nodeName == 'OL')){
650
+ nextEnd.children().each(function(){
651
+ var li = jQuery(this);
652
+ $oldEle = $oldEle.add(li);
653
+ if(li.is($eNode) || li.find($eNode).length > 0) return false;
654
+ });
655
+ }else{
656
+ $oldEle = $oldEle.add($eNode);
657
+ }
658
+ }
659
+
660
+ if('style' in btn){
661
+ var style = {};
662
+ style[btn.style] = value;
663
+
664
+ $oldEle.css(style);
665
+ }else if('atts' in btn){
666
+ // Add attribute or toggle the element
667
+ var attr = {};
668
+ attr[btn.atts] = value;
669
+
670
+ $oldEle.attr(attr);
671
+ }else{
672
+ // Replace tag
673
+ var tag = value.toLowerCase();
674
+
675
+ // need to find all block ele and replace this
676
+ $oldEle.each( function(){
677
+
678
+ var $cEle = jQuery(this);
679
+
680
+ if($cEle.is(t.editor)){
681
+ return;
682
+ }
683
+
684
+ // Is List element
685
+ if($cEle.css('display') == 'list-item'){
686
+ if( t.isline($cEle[0].firstChild)){
687
+ $cEle.children().each(function(){
688
+ var liChild = jQuery(this);
689
+
690
+ if(t.isline(liChild[0])){
691
+ t.replaceTag(liChild, tag, true);
692
+ return;
693
+ }
694
+ // TODO: Check and need to correct
695
+ liChild.wrap('<' + tag + '/>');
696
+ liChild.next('br').remove();
697
+
698
+ });
699
+ return
700
+ }
701
+
702
+ $cEle.contents().wrapAll('<' + tag + '/>');
703
+ return;
704
+ }
705
+
706
+ t.replaceTag($cEle, tag, true);
707
+ });
708
+ }
709
+
710
+ // Get rid of pen temporary span's
711
+ jQuery('[data-pts]', t.editor).contents().unwrap();
712
+ t.semanticCode();
713
+ t.restoreRange();
714
+ }
715
+
716
+ blockNode( node ){
717
+ var t = this;
718
+ while( !t.isline(node) && node != t.editor[0] ) {
719
+ node = node.parentNode;
720
+ }
721
+ return node;
722
+ }
723
+
724
+ isline(node){
725
+ if (node.nodeType !== Node.ELEMENT_NODE) return false;
726
+ if (node.childNodes.length === 0) return false; // Exclude embed blocks
727
+ var style = window.getComputedStyle(node);
728
+ return ['block', 'list-item'].indexOf(style.display) > -1;
729
+ }
730
+
731
+ replaceTag(ele, tag, copyAttr){
732
+ ele.wrap('<' + tag + '/>');
733
+ if(copyAttr){
734
+ jQuery.each(ele.prop('attributes'), function () {
735
+ par.attr(this.name, this.value);
736
+ });
737
+ }
738
+
739
+ var par = ele.parent();
740
+ ele.contents().unwrap();
741
+
742
+ return par;
743
+ }
744
+
745
  semanticCode(){
746
  var t = this;
747
  t.semanticTag('b');
768
  if($oldTag.contents().length === 0) {
769
  return false;
770
  }
771
+
772
+ t.replaceTag($oldTag, newTag, copyAttributes);
 
 
 
 
 
 
773
  });
774
  }
775
 
1400
  documentSelection = t.doc.getSelection(),
1401
  node = documentSelection.focusNode,
1402
  text = new XMLSerializer().serializeToString(documentSelection.getRangeAt(0).cloneContents()),
1403
+ url = '',
1404
+ linkBtn = 'Link',
1405
+ unlinkBtn = 'Cancel';
1406
 
1407
  while (['A', 'DIV'].indexOf(node.nodeName) < 0) {
1408
  node = node.parentNode;
1413
  url = $a.attr('href');
1414
  }
1415
 
1416
+ if(!pagelayer_empty(url)){
1417
+ linkBtn = 'Update';
1418
+ unlinkBtn = 'Unlink';
1419
+ }
1420
+
1421
  t.saveRange();
1422
 
1423
  var tooltip = this.addContainer('pagelayer-pen-link-tooltip');
1424
  t.linkTooltip = tooltip;
1425
 
1426
+ var html = '<input type="text" name="url" placeholder="https://example.com" value="'+url+'" autocomplete="off"><span class="pagelayer-pen-link-btn pagelayer-btn-success">'+linkBtn+'</span><span class="pagelayer-pen-unlink-btn pagelayer-btn-primary">'+unlinkBtn+'</span>';
1427
  tooltip.html(html);
1428
 
1429
  var input = tooltip.find('input[name="url"]');
1430
 
1431
+ // Keep saving old range
1432
+ var metaRange = t.metaRange;
1433
+ var savedRange = t.range;
1434
+ var restoreRange = function(){
1435
+ t.metaRange = metaRange;
1436
+ t.range = savedRange;
1437
+ t.restoreRange();
1438
+ }
1439
+
1440
  t.linkTooltip.find('.pagelayer-pen-link-btn').on('click', function(){
1441
  var url = input.val();
1442
 
1443
+ restoreRange();
 
1444
  t.execCmd('createLink', url, true );
1445
  t.editor.trigger('input');
1446
  t.showPen();
1447
  });
1448
 
1449
  t.linkTooltip.find('.pagelayer-pen-unlink-btn').on('click', function(){
1450
+ restoreRange();
1451
+ if(unlinkBtn == 'Unlink'){
1452
+ t.execCmd('unlink', undefined, undefined, true);
1453
+ }
1454
  t.showPen();
1455
  });
1456
 
1457
  t.showPen(t.linkTooltip);
1458
  }
1459
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1460
  imageBtnHandler(){
1461
  var t = this;
1462
  t.destroyEd = false;
main/ajax.php CHANGED
@@ -309,6 +309,9 @@ function pagelayer_save_content(){
309
 
310
  // Update the post into the database
311
  $ret = wp_update_post($post, true);
 
 
 
312
 
313
  if (is_wp_error($ret)) {
314
  $errors = $ret->get_error_messages();
309
 
310
  // Update the post into the database
311
  $ret = wp_update_post($post, true);
312
+
313
+ // Render the post
314
+ //update_post_meta($postID, 'pagelayer_rendered_post', pagelayer_get_post_content($postID));
315
 
316
  if (is_wp_error($ret)) {
317
  $errors = $ret->get_error_messages();
main/class.php CHANGED
@@ -117,7 +117,7 @@ class PageLayer{
117
  'i' => ['name' => 'Italics', 'sel' => 'em, i'],
118
  ];
119
 
120
- $this->system_fonts = ['Arial', 'Arial Black', 'Courier', 'Georgia', 'Helvetica', 'impact', 'Roboto Slab', 'Tahoma', 'Times New Roman', 'Trebuchet MS', 'Verdana'];
121
  }
122
 
123
  function load_extra_languages(){
117
  'i' => ['name' => 'Italics', 'sel' => 'em, i'],
118
  ];
119
 
120
+ $this->system_fonts = ['Arial', 'Arial Black', 'Courier', 'Georgia', 'Helvetica', 'impact', 'Tahoma', 'Times New Roman', 'Trebuchet MS', 'Verdana'];
121
  }
122
 
123
  function load_extra_languages(){
main/import.php CHANGED
@@ -449,7 +449,7 @@ global $pagelayer, $pl_error, $sitepad;
449
  //die($pagelayer_theme_path);
450
 
451
  // Delete Old Data ?
452
- if(isset($_POST['delete_old_import'])){
453
  $args = array(
454
  'post_type' => ['page', 'post', $pagelayer->builder['name']],
455
  'meta_query' => array(
@@ -582,7 +582,33 @@ global $pagelayer, $pl_error, $sitepad;
582
 
583
  foreach($_media as $k => $v){
584
  $file_name = basename($v);
585
- $ret = pagelayer_upload_media($file_name, file_get_contents($v));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
586
  if(!empty($ret)){
587
  $pagelayer->import_media['{{theme_url}}/images/'.$file_name] = $ret;
588
 
@@ -782,8 +808,16 @@ global $pagelayer, $pl_error, $sitepad;
782
 
783
  $path = pagelayer_cleanpath($pagelayer_theme_path.'/data/'.$data_type.'/'.$k);
784
 
 
 
 
 
 
 
 
 
785
  // Is the page there ?
786
- $page = get_page_by_path($v['post_name'], OBJECT, array('page'));
787
  //r_print($page);
788
 
789
  $new_post = array();
@@ -796,8 +830,8 @@ global $pagelayer, $pl_error, $sitepad;
796
 
797
  if(isset($_POST['overwrite'])){
798
  $rev = wp_save_post_revision($page->ID);
799
- $new_post['ID'] = $page->ID;
800
- $insert_meta = 1;
801
  }
802
 
803
  }
@@ -809,6 +843,7 @@ global $pagelayer, $pl_error, $sitepad;
809
  $new_post['post_name'] = $v['post_name'];
810
  $new_post['post_type'] = $data_type;
811
  $new_post['post_status'] = 'publish';
 
812
 
813
  // Category register
814
  if(!empty($v['taxonomies'])){
449
  //die($pagelayer_theme_path);
450
 
451
  // Delete Old Data ?
452
+ if(isset($_POST['delete_old_import']) && !isset($_POST['maintain_ids'])){
453
  $args = array(
454
  'post_type' => ['page', 'post', $pagelayer->builder['name']],
455
  'meta_query' => array(
582
 
583
  foreach($_media as $k => $v){
584
  $file_name = basename($v);
585
+
586
+ // We are going to create a loop to find the image
587
+ for($i = 1; $i <= 3; $i++){
588
+
589
+ // Upload the image
590
+ $ret = pagelayer_upload_media($file_name, file_get_contents($v));
591
+
592
+ // Lets check the file exists ?
593
+ if(!empty($ret)){
594
+
595
+ // Lets check if the file exists
596
+ $tmp_image_path = pagelayer_cleanpath(get_attached_file($ret));
597
+
598
+ // If the file does not exist, simply delete the old upload as well
599
+ if(!file_exists($tmp_image_path)){
600
+ wp_delete_attachment($ret, true);
601
+ $ret = false;
602
+
603
+ // The image does exist and we can continue
604
+ }else{
605
+ break;
606
+ }
607
+
608
+ }
609
+
610
+ }
611
+
612
  if(!empty($ret)){
613
  $pagelayer->import_media['{{theme_url}}/images/'.$file_name] = $ret;
614
 
808
 
809
  $path = pagelayer_cleanpath($pagelayer_theme_path.'/data/'.$data_type.'/'.$k);
810
 
811
+ $args = ['post_type' => $data_type,
812
+ 'name' => $v['post_name'],
813
+ 'post_status' => $v['post_status'],
814
+ 'posts_per_page' => -1
815
+ ];
816
+
817
+ $type_query = new WP_Query($args);
818
+
819
  // Is the page there ?
820
+ $page = @current($type_query->posts);
821
  //r_print($page);
822
 
823
  $new_post = array();
830
 
831
  if(isset($_POST['overwrite'])){
832
  $rev = wp_save_post_revision($page->ID);
833
+ $new_post['ID'] = $page->ID;
834
+ $insert_meta = 1;
835
  }
836
 
837
  }
843
  $new_post['post_name'] = $v['post_name'];
844
  $new_post['post_type'] = $data_type;
845
  $new_post['post_status'] = 'publish';
846
+ $new_post['import_id'] = $v['ID'];
847
 
848
  // Category register
849
  if(!empty($v['taxonomies'])){
main/shortcode_functions.php CHANGED
@@ -1004,11 +1004,11 @@ function pagelayer_bg_video(&$el){
1004
 
1005
  if (!empty($source)) {
1006
 
1007
- if ($iframe_atts['src'] == 'youtube') {
1008
 
1009
  $el['atts']['vid_src'] = '<iframe src="'.$iframe_atts['src'].'&autoplay=1&controls=0&showinfo=0&rel=0&autohide=1&playlist='.$iframe_atts['id'].'" allowfullscreen="1" webkitallowfullscreen="1" mozallowfullscreen="1" frameborder="0"></iframe>';
1010
 
1011
- } else if ($iframe_atts['src'] == 'vimeo') {
1012
 
1013
  $el['atts']['vid_src'] = '<iframe src="'.$iframe_atts['src'].'&background=1&autoplay=1&byline=0&title=0" allowfullscreen="1" webkitallowfullscreen="1" mozallowfullscreen="1" frameborder="0"></iframe>';
1014
 
1004
 
1005
  if (!empty($source)) {
1006
 
1007
+ if ($iframe_atts['type'] == 'youtube') {
1008
 
1009
  $el['atts']['vid_src'] = '<iframe src="'.$iframe_atts['src'].'&autoplay=1&controls=0&showinfo=0&rel=0&autohide=1&playlist='.$iframe_atts['id'].'" allowfullscreen="1" webkitallowfullscreen="1" mozallowfullscreen="1" frameborder="0"></iframe>';
1010
 
1011
+ } else if ($iframe_atts['type'] == 'vimeo') {
1012
 
1013
  $el['atts']['vid_src'] = '<iframe src="'.$iframe_atts['src'].'&background=1&autoplay=1&byline=0&title=0" allowfullscreen="1" webkitallowfullscreen="1" mozallowfullscreen="1" frameborder="0"></iframe>';
1014
 
pagelayer.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: PageLayer
4
  Plugin URI: http://wordpress.org/plugins/pagelayer/
5
  Description: PageLayer is a WordPress page builder plugin. Its very easy to use and very light on the browser.
6
- Version: 1.5.4
7
  Author: Pagelayer Team
8
  Author URI: https://pagelayer.com/
9
  License: LGPL v2.1
3
  Plugin Name: PageLayer
4
  Plugin URI: http://wordpress.org/plugins/pagelayer/
5
  Description: PageLayer is a WordPress page builder plugin. Its very easy to use and very light on the browser.
6
+ Version: 1.5.5
7
  Author: Pagelayer Team
8
  Author URI: https://pagelayer.com/
9
  License: LGPL v2.1
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: page builder, editor, drag-and-drop, landing page, replace image, pagelaye
4
  Requires at least: 4.7
5
  Tested up to: 5.8
6
  Requires PHP: 5.5
7
- Stable tag: 1.5.4
8
  License: LGPL v2.1
9
  License URI: http://www.gnu.org/licenses/lgpl-2.1.html
10
 
@@ -12,6 +12,8 @@ The most advanced frontend drag & drop page builder. PageLayer is a light weight
12
 
13
  == Description ==
14
 
 
 
15
  Pagelayer is a WordPress page builder plugin. Its very easy to use and very light on the browser. Pagelayer works with any WordPress theme. Pagelayer is a real time editor and you can create beautiful web pages and web sites in a few minutes ! You dont need any programming knowledge when using Pagelayer. Pagelayer comes with top-notch features with a great UX and simple UI.
16
 
17
  [Home Page](https://pagelayer.com "PageLayer Homepage") | [Support](https://pagelayer.deskuss.com "PageLayer Support") | [Documents](http://pagelayer.com/docs "Documents")
@@ -109,6 +111,16 @@ Do you have questions related to PageLayer ? Use the following links :
109
 
110
  == Changelog ==
111
 
 
 
 
 
 
 
 
 
 
 
112
  = 1.5.4 (Aug 05, 2021) =
113
  * [Improvement] The Inline editor position has been further improved for the better user experience.
114
  * [Improvement] Added system fonts to Typography font list.
4
  Requires at least: 4.7
5
  Tested up to: 5.8
6
  Requires PHP: 5.5
7
+ Stable tag: 1.5.5
8
  License: LGPL v2.1
9
  License URI: http://www.gnu.org/licenses/lgpl-2.1.html
10
 
12
 
13
  == Description ==
14
 
15
+ https://www.youtube.com/watch?v=t8Iz-v-qce8
16
+
17
  Pagelayer is a WordPress page builder plugin. Its very easy to use and very light on the browser. Pagelayer works with any WordPress theme. Pagelayer is a real time editor and you can create beautiful web pages and web sites in a few minutes ! You dont need any programming knowledge when using Pagelayer. Pagelayer comes with top-notch features with a great UX and simple UI.
18
 
19
  [Home Page](https://pagelayer.com "PageLayer Homepage") | [Support](https://pagelayer.deskuss.com "PageLayer Support") | [Documents](http://pagelayer.com/docs "Documents")
111
 
112
  == Changelog ==
113
 
114
+ = 1.5.5 (Sep 16, 2021) =
115
+ * [Improvement] The Title Widget has been further improved. Now users can search for widgets with a slash (/) and replace the selected widget with the current widget and also added the plus icon near the bottom of all widgets to add widget after the current widget.
116
+ * [Improvement] Login widget has been further improved.
117
+ * [Improvement] Insert link option UI of our pen editor has been further improved.
118
+ * [Bug-Fix] In certain cases the Pagelayer pen heading and paragraph formatting was not working properly. This is fixed.
119
+ * [Bug-Fix] The Roboto font within the system section was not working. We have removed the system font option of Roboto and left the Google Font option. This is fixed.
120
+ * [Bug-Fix] In certain cases the background video was not working properly. This is fixed.
121
+ * [Bug-Fix] When the dropdown menu was set to in tablet or mobile mode, the full primary menu was shown when reloading the page. This is fixed.
122
+ * [Bug-Fix] In some cases, the pen editor's unlink option was not working properly. This is fixed.
123
+
124
  = 1.5.4 (Aug 05, 2021) =
125
  * [Improvement] The Inline editor position has been further improved for the better user experience.
126
  * [Improvement] Added system fonts to Typography font list.