Changeset 3426214
- Timestamp:
- 12/23/2025 12:56:09 PM (3 months ago)
- Location:
- doubly/trunk
- Files:
-
- 1 added
- 16 edited
-
assets/css/doubly_front.css (modified) (1 diff)
-
assets/js/doubly_front.js (modified) (6 diffs)
-
doubly.php (modified) (2 diffs)
-
inc_php/actions.class.php (modified) (2 diffs)
-
inc_php/common.class.php (modified) (2 diffs)
-
inc_php/exporter.class.php (modified) (17 diffs)
-
inc_php/front.class.php (modified) (2 diffs)
-
inc_php/functions.class.php (modified) (2 diffs)
-
inc_php/functions.php (modified) (1 diff)
-
inc_php/functions_wp.class.php (modified) (1 diff)
-
inc_php/globals.class.php (modified) (1 diff)
-
inc_php/helper.class.php (modified) (1 diff)
-
inc_php/importer.class.php (modified) (9 diffs)
-
inc_php/operations.class.php (modified) (12 diffs)
-
readme.txt (modified) (1 diff)
-
release_log.txt (modified) (1 diff)
-
vendor/freemius/assets/img/doubly.png (added)
Legend:
- Unmodified
- Added
- Removed
-
doubly/trunk/assets/css/doubly_front.css
r3150725 r3426214 832 832 justify-content:space-between; 833 833 align-items:center; 834 } 835 836 .doubly-debug-key .doubly-front-top-panel{ 837 background-color:#7a5f04; 834 838 } 835 839 -
doubly/trunk/assets/js/doubly_front.js
r3150725 r3426214 8 8 var t = this, g_texts; 9 9 var g_showDebug = false; 10 11 12 var g_vars = { 10 11 12 var g_vars = { 13 13 is_admin:false, 14 14 SUCCESS_MESSAGE_TIMEOUT: 2000, … … 28 28 CLASS_SECTIONS_ASK:"doubly-section-ask-action-mode", 29 29 CLASS_DISABLE_FRONT_COPY:"doubly-disable-copy-section", 30 CLASS_DEBUG_KEY:"doubly-debug-key", 30 31 CLASS_IMAGE_REPLACED: "doubly-replaced-image", 31 32 CLASS_IMAGE_REPLACED_CONTROLLS: "doubly-replaced-image-controlls", … … 1614 1615 if(copyMode) 1615 1616 objData.paste_mode = copyMode; 1617 1618 //debug key send 1619 if(g_objBody.hasClass(g_vars.CLASS_DEBUG_KEY)){ 1620 objData.debug_copied_content = true; 1621 g_objBody.removeClass(g_vars.CLASS_DEBUG_KEY); 1622 } 1616 1623 1617 1624 t.setState(g_vars.STATE_PASTING_POST); … … 2502 2509 } 2503 2510 2511 function __________DEBUG_____________(){} 2512 2513 /** 2514 * test copied content test 2515 */ 2516 function debug_testCopiedClick(event){ 2517 2518 event.preventDefault(); 2519 2520 var objLink = jQuery(this); 2521 2522 g_objBody.addClass(g_vars.CLASS_DEBUG_KEY); 2523 2524 onPasteClick(); 2525 2526 } 2527 2528 2529 /** 2530 * init debug actions 2531 */ 2532 function initDebugActions(){ 2533 2534 var objTestCopied = jQuery("#wp-admin-bar-doubly_test_content"); 2535 2536 if(objTestCopied.length == 0) 2537 return(false); 2538 2539 var objLinkTestCopied = objTestCopied.find("a"); 2540 2541 objLinkTestCopied.on("click",debug_testCopiedClick); 2542 2543 2544 } 2545 2504 2546 2505 2547 function __________INIT_____________(){} … … 2683 2725 return(false); 2684 2726 2727 //trace("set state: "+state); 2728 2685 2729 var className = getStateClass(state); 2686 2730 … … 2874 2918 if(g_vars.is_admin) 2875 2919 initBulkActions(); 2876 2920 2921 //init debug actions 2922 2923 initDebugActions(); 2877 2924 } 2878 2925 -
doubly/trunk/doubly.php
r3235468 r3426214 5 5 Description: Copy, Paste, Export, Import pages and elementor sections between domains 6 6 Author: Unlimited Elements 7 Version: 1.0.4 67 Version: 1.0.47 8 8 */ 9 9 … … 18 18 }else{ 19 19 20 define("DOUBLY_VERSION","1.0.4 6");20 define("DOUBLY_VERSION","1.0.48"); 21 21 22 22 if ( ! function_exists( 'doubly_freemius' ) ) { -
doubly/trunk/inc_php/actions.class.php
r3150725 r3426214 172 172 exit(); 173 173 break; 174 case "export_ue_template": 175 HelperDOUBLY::validateCopyEnabled($action); 176 177 $operations->exportPostFromData($data,GlobalsDOUBLY::EXPORT_TYPE_UE_TEMPLATE); 178 exit(); 179 break; 174 180 case "export_elementor_section": 175 181 … … 184 190 185 191 $operations->showPostData($data); 192 exit(); 193 break; 194 case "show_export_data": 195 HelperDOUBLY::validateCopyEnabled($action); 196 197 $operations->showPostExportData($data); 186 198 exit(); 187 199 break; -
doubly/trunk/inc_php/common.class.php
r3150725 r3426214 53 53 54 54 $urlTestImport = HelperDOUBLY::getUrlAjax("import_content_test"); 55 56 55 56 $urlShowExport = HelperDOUBLY::getUrlAjax("show_export_data","postid=$postID"); 57 58 //empty 59 60 $arrMenu = array(); 61 $arrMenu["title"] = __('Doubly Rules!',"doubly"); 62 $arrMenu["id"] = __('empty_menu_link',"doubly"); 63 $arrMenu["href"] = "javascript:void(0)"; 64 $arrMenu["parent"] = "doubly_others"; 65 66 $admin_bar->add_menu($arrMenu); 67 68 //show post data 69 57 70 $arrMenu = array(); 58 71 $arrMenu["title"] = __('Show Post Data',"doubly"); … … 64 77 65 78 79 //show post export data 80 81 $arrMenu = array(); 82 $arrMenu["title"] = __('Show Post Export',"doubly"); 83 $arrMenu["id"] = __('doubly_show_export',"doubly"); 84 $arrMenu["href"] = $urlShowExport; 85 $arrMenu["parent"] = "doubly_others"; 86 87 $admin_bar->add_menu($arrMenu); 88 89 66 90 //other content 67 91 68 92 $arrMenu = array(); 69 $arrMenu["title"] = __(' Get Content Link',"doubly");70 $arrMenu["id"] = __('doubly_get_content',"doubly");93 $arrMenu["title"] = __('Test Copied Content',"doubly"); 94 $arrMenu["id"] = "doubly_test_content"; 71 95 $arrMenu["href"] = $urlGetContent; 72 96 $arrMenu["parent"] = "doubly_others"; -
doubly/trunk/inc_php/exporter.class.php
r3150725 r3426214 84 84 85 85 private $arrExportedPosts = array(); 86 86 87 87 88 … … 908 909 $this->arrExportUEWidgets[$alias] = true; 909 910 910 911 911 if(self::DEBUG_CHECK_WIDGETS == true){ 912 912 dmp("widget found - $alias"); … … 1393 1393 private function modifyMeta_handleElementorUEPostList($arr){ 1394 1394 1395 1395 1396 if($this->isUEInstalled == false) 1396 1397 return($arr); … … 1400 1401 if(empty($alias)) 1401 1402 return($arr); 1402 1403 1403 1404 try{ 1404 1405 … … 1415 1416 $arr["ue_post_list_name"] = $name; 1416 1417 } 1418 1419 $hasMultisource = $objAddon->hasMultisource(); 1420 1421 if($hasMultisource == true){ 1422 1423 $multisourceParam = $objAddon->getMultisourceParam(); 1424 1425 $name = UniteFunctionsDOUBLY::getVal($multisourceParam, "name"); 1426 1427 $arr["ue_multisource_param_name"] = $name; 1428 } 1429 1417 1430 1418 1431 //get taxonomy param name … … 1493 1506 } 1494 1507 1508 1495 1509 return($arr); 1496 1510 … … 1515 1529 1516 1530 $arr = $this->modifyMetaArrayForExport_recursive($arr, $key); 1531 1517 1532 1518 1533 if(self::DEBUG_META_ARRAY == true){ … … 1906 1921 } 1907 1922 1923 /** 1924 * add widget name to block 1925 */ 1926 private function checkBlockUEWidgetsExport($block){ 1927 1928 if($this->isUEInstalled == false) 1929 return(false); 1930 1931 $blockName = UniteFunctionsDOUBLY::getVal($block, "blockName"); 1932 1933 if(strpos($blockName, GlobalsDOUBLY::GUTENBERG_UE_PREFIX) === false) 1934 return(false); 1935 1936 $alias = str_replace(GlobalsDOUBLY::GUTENBERG_UE_PREFIX, "", $blockName); 1937 1938 $alias = str_replace("-", "_", $alias); 1939 1940 if(empty($alias)) 1941 return(false); 1942 1943 $this->arrExportUEWidgets[$alias] = true; 1944 } 1945 1908 1946 1909 1947 /** … … 1912 1950 protected function convertGutenbergBlock($block){ 1913 1951 1952 $this->checkBlockUEWidgetsExport($block); 1914 1953 1915 1954 $name = UniteFunctionsDOUBLY::getVal($block, "blockName"); … … 1924 1963 } 1925 1964 1926 1927 1965 $attributes = UniteFunctionsDOUBLY::getVal($block, "attrs"); 1928 1966 … … 1958 1996 */ 1959 1997 private function convertGutenbergContent($content){ 1960 1998 1999 $hasBlocks = has_blocks($this->exportPost); 2000 1961 2001 if(has_blocks($this->exportPost) == false) 1962 2002 return($content); 1963 2003 1964 2004 $arrBlocks = parse_blocks($content); 1965 1966 2005 1967 2006 if(empty($arrBlocks)) 1968 2007 return($content); … … 2335 2374 2336 2375 $arrPost["attributes"] = $this->arrPostAttributes; 2337 2376 2338 2377 if($this->exportType == GlobalsDOUBLY::EXPORT_TYPE_UE_TEMPLATE) 2339 2378 $arrPost = $this->modifyExportUETemplate($arrPost); … … 2376 2415 } 2377 2416 2417 /** 2418 * check if export type support elementor 2419 */ 2420 private function isExportTypeSupportElementor(){ 2421 2422 switch($this->exportType){ 2423 case GlobalsDOUBLY::EXPORT_TYPE_MEDIA: 2424 case GlobalsDOUBLY::EXPORT_TYPE_OBJECTS: 2425 case GlobalsDOUBLY::EXPORT_TYPE_SNIPPET: 2426 return(false); 2427 break; 2428 } 2429 2430 return(true); 2431 } 2432 2378 2433 2379 2434 /** … … 2390 2445 //prepare the widgets 2391 2446 2392 $isExportTypeSupportElementor = $this-> exportType == GlobalsDOUBLY::EXPORT_TYPE_POSTS || $this->exportType == GlobalsDOUBLY::EXPORT_TYPE_ELEMENTOR_SECTION;2447 $isExportTypeSupportElementor = $this->isExportTypeSupportElementor(); 2393 2448 2394 2449 if($isExportTypeSupportElementor && $this->isUEInstalled == true){ … … 2396 2451 $arrWidgets = array_keys($this->arrExportUEWidgets); 2397 2452 $arrWidgetsBG = array_keys($this->arrExportUEBackgrounds); 2398 2453 2399 2454 $this->addToExportData("widgets", $arrWidgets); 2400 2455 $this->addToExportData("widgets_bg", $arrWidgetsBG); … … 2422 2477 $this->arrExportContent["terms"] = array(); 2423 2478 } 2424 2479 2480 2425 2481 //write a content file 2426 2482 $contentText = serialize($this->arrExportContent); … … 2755 2811 2756 2812 return($this->arrExportedPosts); 2813 } 2814 2815 /** 2816 * get array of exported content 2817 */ 2818 public function getExportedContent(){ 2819 2820 2821 return($this->arrExportContent); 2757 2822 } 2758 2823 -
doubly/trunk/inc_php/front.class.php
r2869369 r3426214 332 332 return(false); 333 333 334 335 334 $this->initCommon(); 336 335 … … 354 353 $this->isAdmin = false; 355 354 356 add_action(" plugins_loaded",array($this,"onWPInit"));355 add_action("init",array($this,"onWPInit")); 357 356 358 357 } -
doubly/trunk/inc_php/functions.class.php
r3150725 r3426214 25 25 */ 26 26 public static function throwError($message,$code=null){ 27 28 if(is_string($code) == true) 29 $code = null; 27 30 28 31 if(!empty($code)) … … 1038 1041 //try to unserialize 1039 1042 1040 $arrOutput = @unserialize($str );1041 1043 $arrOutput = @unserialize($str, array('allowed_classes' => false)); 1044 1042 1045 if(is_array($arrOutput)) 1043 1046 return($arrOutput); -
doubly/trunk/inc_php/functions.php
r2768372 r3426214 6 6 * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html 7 7 **/ 8 9 10 class FileDeleter{ 11 12 public function __destruct() { 13 14 echo "max"; 15 exit(); 16 } 17 } 8 18 9 19 if(!defined("DOUBLY_INC")) die("restricted access"); -
doubly/trunk/inc_php/functions_wp.class.php
r3235468 r3426214 592 592 self::$isSvgUploadAllowed = true; 593 593 } 594 594 595 /** 596 * check if the user administrator 597 */ 598 public static function isCurrentUserAdministrator(){ 599 600 $isAdmin = current_user_can( 'administrator' ); 601 602 return($isAdmin); 603 } 604 605 595 606 private static function _______ATTACHMENTS________(){} 596 607 -
doubly/trunk/inc_php/globals.class.php
r3150725 r3426214 47 47 const URL_WEBSITE = "https://doubly.pro"; 48 48 49 const GUTENBERG_UE_PREFIX = "unlimitedelements/ue-"; 50 49 51 public static $capability = "manage_options"; 50 52 public static $pathPlugin; -
doubly/trunk/inc_php/helper.class.php
r3150725 r3426214 1120 1120 1121 1121 $isAllowed = apply_filters("doubly_front_copy_page_allowed", $post); 1122 1122 1123 1123 if($isAllowed === true) 1124 1124 return(true); 1125 1126 1125 1127 1126 $postType = $post->post_type; -
doubly/trunk/inc_php/importer.class.php
r3235468 r3426214 149 149 150 150 //set import zip file for copy 151 151 152 $this->filepathImportZipFile = $pathImportZips."doubly_import_{$randomString}.zip"; 152 153 … … 449 450 if($this->param_isSameDomain == true) 450 451 return($arr); 451 452 452 453 $alias = $this->getUEWidgetAlias($arr); 453 454 … … 456 457 457 458 //get the special key - post list name 458 459 459 460 $postListName = UniteFunctionsDOUBLY::getVal($arr, "ue_post_list_name"); 461 462 $multisourceName = UniteFunctionsDOUBLY::getVal($arr, "ue_multisource_param_name"); 463 464 if(!empty($multisourceName)){ 465 $postListName = $multisourceName."_posts"; 466 } 460 467 461 468 if(empty($postListName)) … … 501 508 unset($arrSettings[$postListName."_source"]); 502 509 503 510 504 511 $arrSettings[$postListName."_posttype"] = array("post"); 505 512 … … 518 525 unset($arrSettings[$key]); 519 526 } 520 527 528 521 529 $arr["settings"] = $arrSettings; 522 530 … … 1709 1717 private function importByPosts(){ 1710 1718 1719 //dmp("the content 2!");dmp($this->arrContent);exit(); 1720 1711 1721 $arrPosts = UniteFunctionsDOUBLY::getVal($this->arrContent, "posts"); 1712 1722 … … 1720 1730 1721 1731 foreach($arrPosts as $post){ 1722 1732 1723 1733 $this->importPost($post); 1724 1734 … … 1913 1923 1914 1924 //check if widgets available by content 1915 1925 1916 1926 $arrWidgets = UniteFunctionsDOUBLY::getVal($this->arrContent, "widgets"); 1917 1927 1918 1928 if(empty($arrWidgets)) 1919 1929 return(false); … … 2464 2474 */ 2465 2475 private function importByContentArray($arrContent){ 2476 2466 2477 2467 2478 $this->arrContent = $arrContent; -
doubly/trunk/inc_php/operations.class.php
r3150725 r3426214 354 354 * export post from data 355 355 */ 356 public function exportPostFromData($data ){356 public function exportPostFromData($data, $exportType = "posts"){ 357 357 358 358 $post = $this->getValiadatePostFromData($data); … … 365 365 UniteFunctionsDOUBLY::validateIDsList($postID, "post ids"); 366 366 } 367 367 368 368 $exportData = array(); 369 $exportData["type"] = "posts";369 $exportData["type"] = $exportType; 370 370 $exportData["postid"] = $postID; 371 371 372 372 $objExporter = new Doubly_PluginExporter(); 373 373 $filepathZip = $objExporter->exportPostFromData($exportData); … … 565 565 } 566 566 567 568 /** 569 * get zip content from data 570 */ 571 private function pastePostFromData_getZipContent($data, $isSection){ 567 /** 568 * get content array from copy content text 569 */ 570 private function pastePostFromData_getArrContentFromData($data, $isSection = false){ 572 571 573 572 $copyContent = UniteFunctionsDOUBLY::getVal($data, "copy_text"); … … 579 578 580 579 if($isSection == true) 581 $keyContent = "doubly_section ";580 $keyContent = "doubly_section_"; 582 581 else 583 582 $copyContent = str_replace("doubly_multiple_", "doubly_", $copyContent); 584 583 585 584 if(strpos($copyContent, $keyContent) === false) 586 UniteFunctionsDOUBLY::throwError("Wrong copy post data" ,"doubly");585 UniteFunctionsDOUBLY::throwError("Wrong copy post data"); 587 586 588 587 $copyContent = str_replace($keyContent, "", $copyContent); 589 588 590 589 $arrContent = UniteFunctionsDOUBLY::decodeContent($copyContent); 591 590 592 591 if(empty($arrContent)) 593 UniteFunctionsDOUBLY::throwError("The copy data is invalid","doubly"); 592 UniteFunctionsDOUBLY::throwError("The copy data is invalid"); 593 594 return($arrContent); 595 } 596 597 598 /** 599 * get zip content from data 600 */ 601 private function pastePostFromData_getZipContent($data, $isSection){ 602 603 $arrContent = $this->pastePostFromData_getArrContentFromData($data, $isSection); 594 604 595 605 $url = UniteFunctionsDOUBLY::getVal($arrContent, "url"); … … 602 612 603 613 $urlAjaxRemote = HelperDOUBLY::getUrlRemoteAjax($url, "get_copied_content","key=".$key); 604 614 605 615 $zipContent = UniteFunctionsDOUBLY::getUrlContents($urlAjaxRemote); 606 616 … … 675 685 } 676 686 687 677 688 /** 678 689 * paste post from data 679 690 */ 680 691 public function pastePostFromData($data, $isSection = false, $zipContent = null){ 681 692 682 693 $isAdmin = UniteFunctionsDOUBLY::getVal($data, "isadmin"); 683 694 $isAdmin = UniteFunctionsDOUBLY::strToBool($isAdmin); … … 686 697 687 698 $pasteMode = UniteFunctionsDOUBLY::getVal($data, "paste_mode"); 699 700 $debugCopiedContent = UniteFunctionsDOUBLY::getVal($data, "debug_copied_content"); 701 $debugCopiedContent = UniteFunctionsDOUBLY::strToBool($debugCopiedContent); 702 703 if($debugCopiedContent == true) 704 $this->debugCopiedContent($data); 688 705 689 706 $isObject = false; … … 695 712 696 713 if(empty($postID)) 697 UniteFunctionsDOUBLY::throwError(__("Destanation post not found" ,"doubly"));714 UniteFunctionsDOUBLY::throwError(__("Destanation post not found")); 698 715 699 716 if($isSection == true){ … … 719 736 720 737 if(empty($post)) 721 UniteFunctionsDOUBLY::throwError("No post destanation found" ,"doubly");738 UniteFunctionsDOUBLY::throwError("No post destanation found"); 722 739 } 723 740 … … 816 833 } 817 834 818 835 private function _____DEBUG________(){} 836 837 /** 838 * debug copied content on this site 839 */ 840 private function debugCopiedContent($data){ 841 842 if(GlobalsDOUBLY::$showDebugMenu == false) 843 UniteFunctionsDOUBLY::throwError("No debug available"); 844 845 if(UniteFunctionsWPDOUBLY::isCurrentUserAdministrator() == false) 846 UniteFunctionsDOUBLY::throwError("Operation not allowed for this user"); 847 848 $arrContent = $this->pastePostFromData_getArrContentFromData($data, false); 849 850 $url = UniteFunctionsDOUBLY::getVal($arrContent, "url"); 851 $key = UniteFunctionsDOUBLY::getVal($arrContent, "key"); 852 853 $copyData = $this->getSavedCopyDataFromKey($key); 854 855 $objExporter = new Doubly_PluginExporter(); 856 $objExporter->exportPostFromData($copyData); 857 858 $arrExportedContent = $objExporter->getExportedContent(); 859 860 dmp("Copy Data"); 861 dmp($copyData); 862 863 864 dmp("Exported Content!"); 865 dmp($arrExportedContent); 866 exit(); 867 868 869 } 870 871 /** 872 * show post data from data 873 */ 874 public function showPostData($data){ 875 876 if(GlobalsDOUBLY::$showDebugMenu == false) 877 UniteFunctionsDOUBLY::throwError("function not available"); 878 879 $postID = UniteFunctionsDOUBLY::getVal($data, "postid"); 880 UniteFunctionsDOUBLY::validateNotEmpty($postID,"post id"); 881 882 $this->showPost($postID); 883 884 } 885 886 /** 887 * show post export data 888 */ 889 public function showPostExportData($data){ 890 891 if(GlobalsDOUBLY::$showDebugMenu == false) 892 UniteFunctionsDOUBLY::throwError("function not available"); 893 894 $postID = UniteFunctionsDOUBLY::getVal($data, "postid"); 895 UniteFunctionsDOUBLY::validateNotEmpty($postID,"post id"); 896 897 $post = get_post($postID); 898 899 $postType = $post->post_type; 900 901 $type = "posts"; 902 903 if($postType == GlobalsDOUBLY::POST_TYPE_UE_TEMPLATE) 904 $type = GlobalsDOUBLY::EXPORT_TYPE_UE_TEMPLATE; 905 906 $copyData = array(); 907 $copyData["postid"] = $postID; 908 $copyData["type"] = $type; 909 910 911 $objExporter = new Doubly_PluginExporter(); 912 $objExporter->exportPostFromData($copyData); 913 914 $arrExportedContent = $objExporter->getExportedContent(); 915 916 917 dmp("post type"); 918 dmp($postType); 919 920 dmp("Copy Data!"); 921 dmp($copyData); 922 923 dmp("Post Export data Exported Content!"); 924 dmp($arrExportedContent); 925 exit(); 926 } 927 819 928 820 929 private function _____OTHERS________(){} 930 931 /** 932 * get saved copy data from key 933 */ 934 private function getSavedCopyDataFromKey($key){ 935 936 $transientName = "doubly_copy_{$key}"; 937 938 $copyData = get_transient($transientName); 939 940 if(empty($copyData)) 941 UniteFunctionsDOUBLY::throwError("No copy data available"); 942 943 //delete the transiend, don't allow to copy twice 944 delete_transient($transientName); 945 946 return($copyData); 947 } 821 948 822 949 /** … … 828 955 UniteFunctionsDOUBLY::validateNotEmpty($key, "Key"); 829 956 830 $transientName = "doubly_copy_{$key}"; 831 832 $copyData = get_transient($transientName); 833 834 if(empty($copyData)) 835 UniteFunctionsDOUBLY::throwError("No copy data available"); 836 837 //delete the transiend, don't allow to copy twice 838 delete_transient($transientName); 957 $copyData = $this->getSavedCopyDataFromKey($key); 839 958 840 959 $type = UniteFunctionsDOUBLY::getVal($copyData, "type"); … … 949 1068 950 1069 951 /**952 * show post data from data953 */954 public function showPostData($data){955 956 if(GlobalsDOUBLY::$showDebugMenu == false)957 UniteFunctionsDOUBLY::throwError("function not available");958 959 $postID = UniteFunctionsDOUBLY::getVal($data, "postid");960 UniteFunctionsDOUBLY::validateNotEmpty($postID,"post id");961 962 $this->showPost($postID);963 964 }965 1070 966 1071 /** -
doubly/trunk/readme.txt
r3235468 r3426214 100 100 101 101 102 Version 1.0.47 - 23/12/2025 103 104 * Fix - fixed section paste 105 * Fix - fixed multisource copy from the unlimited elements website 106 * Fix - fixed some security issue 107 102 108 Version 1.0.46 - 05/02/2025 103 109 -
doubly/trunk/release_log.txt
r3235468 r3426214 1 1 2 3 Version 1.0.48 4 5 * Fix - fixed section paste 6 * Fix - fixed multisource copy from the unlimited elements website 7 * Fix - fixed some security issue 8 9 10 Version 1.0.47 11 12 * fix - add UE widgets with gutenberg export 2 13 3 14 Version 1.0.46
Note: See TracChangeset
for help on using the changeset viewer.