diff --git a/public/static/websiteFunctions/websiteFunctions.js b/public/static/websiteFunctions/websiteFunctions.js index 810267b6f..f6c5f9dcb 100644 --- a/public/static/websiteFunctions/websiteFunctions.js +++ b/public/static/websiteFunctions/websiteFunctions.js @@ -2,7 +2,26 @@ * Created by usman on 7/26/17. */ +// Ensure app is available (get existing module or create reference) +// This ensures compatibility with the global app variable from system-status.js +if (typeof app === 'undefined') { + // First try to get window.app (set by system-status.js) + if (typeof window !== 'undefined' && typeof window.app !== 'undefined') { + app = window.app; + } else { + // If window.app doesn't exist, get the existing CyberCP module + // This works because system-status.js should have already created it + app = angular.module('CyberCP'); + } +} +// Global function for deleting staging sites +function deleteStagingGlobal(stagingId) { + if (confirm("Are you sure you want to delete this staging site? This action cannot be undone.")) { + // Redirect to WordPress list with delete parameter + window.location.href = "/websites/ListWPSites?DeleteID=" + stagingId; + } +} function getCookie(name) { var cookieValue = null; var t = document.cookie; @@ -21,7 +40,5803 @@ function getCookie(name) { } +var arry = [] + +function selectpluginJs(val) { + $('#mysearch').hide() + arry.push(val) + + // console.log(arry) + document.getElementById('selJS').innerHTML = ""; + + for (var i = 0; i < arry.length; i++) { + $('#selJS').show() + var mlm = ' ' + arry[i] + '    ' + $('#selJS').append(mlm) + } + + +} + + +var DeletePluginURL; + +function DeletePluginBuucket(url) { + DeletePluginURL = url; +} + +function FinalDeletePluginBuucket() { + window.location.href = DeletePluginURL; +} + +var SPVal; + +app.controller('WPAddNewPlugin', function ($scope, $http, $timeout, $window, $compile) { + $scope.webSiteCreationLoading = true; + + $scope.SearchPluginName = function (val) { + $scope.webSiteCreationLoading = false; + SPVal = val; + url = "/websites/SearchOnkeyupPlugin"; + + var searchcontent = $scope.searchcontent; + + + var data = { + pluginname: searchcontent + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.webSiteCreationLoading = true; + + if (response.data.status === 1) { + if (SPVal == 'add') { + $('#mysearch').show() + document.getElementById('mysearch').innerHTML = ""; + var res = response.data.plugns.plugins + // console.log(res); + for (i = 0; i <= res.length; i++) { + // + var tml = '
'; + $('#mysearch').append(tml); + } + } else if (SPVal == 'eidt') { + $('#mysearch').show() + document.getElementById('mysearch').innerHTML = ""; + var res = response.data.plugns.plugins + // console.log(res); + for (i = 0; i <= res.length; i++) { + // + var tml = '
'; + var temp = $compile(tml)($scope) + angular.element(document.getElementById('mysearch')).append(temp); + } + + } + + + } else { + + // $scope.errorMessage = response.data.error_message; + alert("Status not = 1: Error..." + response.data.error_message) + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + } + + $scope.AddNewplugin = function () { + + url = "/websites/AddNewpluginAjax"; + + var bucketname = $scope.PluginbucketName + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + var data = { + config: arry, + Name: bucketname + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Bucket created.', + type: 'success' + }); + location.reload(); + } else { + + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + } + + $scope.deletesPlgin = function (val) { + + url = "/websites/deletesPlgin"; + + + var data = { + pluginname: val, + pluginbBucketID: $('#pluginbID').html() + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + location.reload(); + + } else { + + // $scope.errorMessage = response.data.error_message; + alert("Status not = 1: Error..." + response.data.error_message) + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + + } + + $scope.Addplugin = function (slug) { + $('#mysearch').hide() + + url = "/websites/Addplugineidt"; + + + var data = { + pluginname: slug, + pluginbBucketID: $('#pluginbID').html() + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + location.reload(); + + } else { + + // $scope.errorMessage = response.data.error_message; + alert("Status not = 1: Error..." + response.data.error_message) + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + + + } + +}); + +var domain_check = 0; + +function checkbox_function() { + + var checkBox = document.getElementById("myCheck"); + // Get the output text + + + // If the checkbox is checked, display the output text + if (checkBox.checked == true) { + domain_check = 0; + document.getElementById('Test_Domain').style.display = "block"; + document.getElementById('Own_Domain').style.display = "none"; + + } else { + document.getElementById('Test_Domain').style.display = "none"; + document.getElementById('Own_Domain').style.display = "block"; + domain_check = 1; + } + + // alert(domain_check); +} + +app.controller('createWordpress', function ($scope, $http, $timeout, $compile, $window) { + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + // Password generation function + $scope.randomPassword = function(length) { + var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+"; + var password = ""; + for (var i = 0; i < length; i++) { + password += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return password; + }; + + // Initialize showPassword + $scope.showPassword = false; + + var statusFile; + + $scope.createWordPresssite = function () { + + $scope.webSiteCreationLoading = false; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + + $scope.currentStatus = "Starting creation.."; + + var apacheBackend = 0; + + if ($scope.apacheBackend === true) { + apacheBackend = 1; + } else { + apacheBackend = 0 + } + + var package = $scope.packageForWebsite; + var websiteOwner = $scope.websiteOwner; + var WPtitle = $scope.WPtitle; + + // if (domain_check == 0) { + // var Part2_domainNameCreate = document.getElementById('Part2_domainNameCreate').value; + // var domainNameCreate = document.getElementById('TestDomainNameCreate').value + Part2_domainNameCreate; + // } + // if (domain_check == 1) { + // + // var domainNameCreate = $scope.own_domainNameCreate; + // } + + var domainNameCreate = $scope.domainNameCreate; + + + var WPUsername = $scope.WPUsername; + var adminEmail = $scope.adminEmail; + var WPPassword = $scope.WPPassword; + var WPVersions = $scope.WPVersions; + var pluginbucket = $scope.pluginbucket; + var autoupdates = $scope.autoupdates; + var pluginupdates = $scope.pluginupdates; + var themeupdates = $scope.themeupdates; + + if (domain_check == 0) { + + var path = ""; + + } + if (domain_check = 1) { + + var path = $scope.installPath; + + } + + + var home = "1"; + + if (typeof path != 'undefined') { + home = "0"; + } + + //alert(domainNameCreate); + var data = { + + title: WPtitle, + domain: domainNameCreate, + WPVersion: WPVersions, + pluginbucket: pluginbucket, + adminUser: WPUsername, + Email: adminEmail, + PasswordByPass: WPPassword, + AutomaticUpdates: autoupdates, + Plugins: pluginupdates, + Themes: themeupdates, + websiteOwner: websiteOwner, + package: package, + home: home, + path: path, + apacheBackend: apacheBackend + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + var url = "/websites/submitWorpressCreation"; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.webSiteCreationLoading = true; + if (response.data.status === 1) { + statusFile = response.data.tempStatusPath; + getCreationStatus(); + + } else { + $scope.goBackDisable = false; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + + }; + $scope.goBack = function () { + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; + + function getCreationStatus() { + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.abort === 1) { + + if (response.data.installStatus === 1) { + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $("#installProgress").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + } else { + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + } + + } else { + $scope.webSiteCreationLoading = false; + $("#installProgress").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + $timeout(getCreationStatus, 1000); + } + + } + + function cantLoadInitialDatas(response) { + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + } + + +}); + + +//........... delete wp list +var FurlDeleteWP; + +function DeleteWPNow(url) { + FurlDeleteWP = url; +} + +function FinalDeleteWPNow() { + window.location.href = FurlDeleteWP; +} + +var DeploytoProductionID; + +function DeployToProductionInitial(vall) { + DeploytoProductionID = vall; +} + +// Simplified staging domain input - checkbox functionality removed + +app.controller('WPsiteHome', function ($scope, $http, $timeout, $compile, $window) { + var CheckBoxpasssword = 0; + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.searchIndex = 0; + + $(document).ready(function () { + var checkstatus = document.getElementById("wordpresshome"); + if (checkstatus !== null) { + $scope.LoadWPdata(); + } + }); + + $scope.LoadWPdata = function () { + $scope.wordpresshomeloading = false; + $('#wordpresshomeloading').show(); + + var url = "/websites/FetchWPdata"; + + var data = { + WPid: $('#WPid').html(), + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(function(response) { + $scope.wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + $('#WPVersion').text(response.data.ret_data.version); + if (response.data.ret_data.lscache === 1) { + $('#lscache').prop('checked', true); + } + if (response.data.ret_data.debugging === 1) { + $('#debugging').prop('checked', true); + } + + // Set search index state + $scope.searchIndex = response.data.ret_data.searchIndex; + + if (response.data.ret_data.maintenanceMode === 1) { + $('#maintenanceMode').prop('checked', true); + } + if (response.data.ret_data.wpcron === 1) { + $('#wpcron').prop('checked', true); + } + if (response.data.ret_data.passwordprotection == 1) { + var dc = ''; + var mp = $compile(dc)($scope); + angular.element(document.getElementById('prsswdprodata')).append(mp); + CheckBoxpasssword = 1; + } else { + var dc = ''; + $('#prsswdprodata').append(dc); + CheckBoxpasssword = 0; + } + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + }, function(error) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + console.error('Failed to load WP data:', error); + }); + }; + + $scope.UpdateWPSettings = function (setting) { + $scope.wordpresshomeloading = false; + $('#wordpresshomeloading').show(); + + var url = "/websites/UpdateWPSettings"; + var data; + + if (setting === "PasswordProtection") { + data = { + WPid: $('#WPid').html(), + setting: setting, + PPUsername: CheckBoxpasssword == 0 ? $scope.PPUsername : '', + PPPassword: CheckBoxpasssword == 0 ? $scope.PPPassword : '' + }; + } else { + var settingValue; + if (setting === 'searchIndex') { + $scope.searchIndex = $scope.searchIndex === 1 ? 0 : 1; + settingValue = $scope.searchIndex; + } else { + settingValue = $('#' + setting).is(":checked") ? 1 : 0; + } + data = { + WPid: $('#WPid').html(), + setting: setting, + settingValue: settingValue + }; + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(function(response) { + $scope.wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Updated!', + type: 'success' + }); + if (setting === "PasswordProtection") { + location.reload(); + } + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + // Revert the change on error + if (setting === 'searchIndex') { + $scope.searchIndex = $scope.searchIndex === 1 ? 0 : 1; + } + if (setting === "PasswordProtection") { + location.reload(); + } + } + }, function(error) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + // Revert the change on error + if (setting === 'searchIndex') { + $scope.searchIndex = $scope.searchIndex === 1 ? 0 : 1; + } + console.error('Failed to update setting:', error); + }); + }; + + $scope.GetCurrentPlugins = function () { + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + + var url = "/websites/GetCurrentPlugins"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + $('#PluginBody').html(''); + var plugins = JSON.parse(response.data.plugins); + plugins.forEach(AddPlugins); + + } else { + alert("Error:" + response.data.error_message) + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + }; + + $scope.GetCurrentThemes = function () { + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + + var url = "/websites/GetCurrentThemes"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + + $('#ThemeBody').html(''); + var themes = JSON.parse(response.data.themes); + themes.forEach(AddThemes); + + } else { + alert("Error:" + response.data.error_message) + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + }; + + $scope.UpdatePlugins = function (plugin) { + $('#wordpresshomeloading').show(); + var data = { + plugin: plugin, + pluginarray: PluginsList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/UpdatePlugins"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Updating Plugins in Background!.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + + }; + + $scope.DeletePlugins = function (plugin) { + $('#wordpresshomeloading').show(); + var data = { + plugin: plugin, + pluginarray: PluginsList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/DeletePlugins"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Deleting Plugin in Background!', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + } + + $scope.ChangeStatus = function (plugin) { + $('#wordpresshomeloading').show(); + var data = { + plugin: plugin, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/ChangeStatus"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Changed Plugin state Successfully !.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + } + + function AddPlugins(value, index, array) { + var FinalMarkup = '' + FinalMarkup = FinalMarkup + ''; + for (let x in value) { + if (x === 'status') { + if (value[x] === 'inactive') { + FinalMarkup = FinalMarkup + '
'; + } else { + FinalMarkup = FinalMarkup + '
'; + } + } else if (x === 'update') { + if (value[x] === 'none') { + FinalMarkup = FinalMarkup + 'Upto Date'; + } else { + FinalMarkup = FinalMarkup + ''; + } + } else { + FinalMarkup = FinalMarkup + '' + value[x] + ""; + } + } + FinalMarkup = FinalMarkup + '' + FinalMarkup = FinalMarkup + '' + var temp = $compile(FinalMarkup)($scope) + AppendToTable('#PluginBody', temp) + } + + $scope.UpdateThemes = function (theme) { + $('#wordpresshomeloading').show(); + var data = { + Theme: theme, + Themearray: ThemesList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/UpdateThemes"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Updating Theme in background !.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + + }; + + $scope.DeleteThemes = function (theme) { + $('#wordpresshomeloading').show(); + var data = { + Theme: theme, + Themearray: ThemesList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/DeleteThemes"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Deleting Theme in Background!.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + }; + + $scope.ChangeStatusThemes = function (theme) { + $('#wordpresshomeloading').show(); + var data = { + theme: theme, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/StatusThemes"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Change Theme state in Bsckground!.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + }; + + function AddThemes(value, index, array) { + var FinalMarkup = '' + FinalMarkup = FinalMarkup + ''; + for (let x in value) { + if (x === 'status') { + if (value[x] === 'inactive') { + FinalMarkup = FinalMarkup + '
'; + } else { + FinalMarkup = FinalMarkup + '
'; + } + } else if (x === 'update') { + if (value[x] === 'none') { + FinalMarkup = FinalMarkup + 'Upto Date'; + } else { + FinalMarkup = FinalMarkup + ''; + } + } else { + FinalMarkup = FinalMarkup + '' + value[x] + ""; + } + } + FinalMarkup = FinalMarkup + '' + FinalMarkup = FinalMarkup + '' + var temp = $compile(FinalMarkup)($scope) + AppendToTable('#ThemeBody', temp) + } + + var statusFile; // Declare statusFile at controller scope + + $scope.CreateStagingNow = function () { + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + $scope.currentStatus = "Starting creation Staging.."; + + // Get staging name + var stagingName = $('#stagingName').val(); + if (!stagingName) { + new PNotify({ + title: 'Error!', + text: 'Please enter a staging name', + type: 'error' + }); + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + return; + } + + // Get staging domain from the simplified input + var domainNameCreate = $('#stagingDomainName').val() || $scope.stagingDomainName; + if (!domainNameCreate) { + new PNotify({ + title: 'Error!', + text: 'Please enter a staging domain', + type: 'error' + }); + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + return; + } + + var data = { + StagingName: stagingName, + StagingDomain: domainNameCreate, + WPid: $('#WPid').html(), + } + var url = "/websites/CreateStagingNow"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + if (response.data.status === 1) { + statusFile = response.data.tempStatusPath; + getCreationStatus(); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + }; + + function getCreationStatus() { + $('#wordpresshomeloading').show(); + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + //$('#wordpresshomeloading').hide(); + + if (response.data.abort === 1) { + if (response.data.installStatus === 1) { + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + + $("#installProgress").css("width", "100%"); + $("#installProgressbackup").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + + } else { + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $("#installProgressbackup").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + + } + + } else { + + $("#installProgress").css("width", response.data.installationProgress + "%"); + $("#installProgressbackup").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + $timeout(getCreationStatus, 1000); + + } + + } + + function cantLoadInitialDatas(response) { + //$('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + } + + $scope.goBack = function () { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; + + $scope.fetchstaging = function () { + + // Ensure DOM is ready + $timeout(function() { + // Check if the staging table exists + if ($('#StagingBody').length === 0) { + console.error('StagingBody table not found in DOM'); + return; + } + + $('#wordpresshomeloading').show(); + $scope.wordpresshomeloading = false; + + var url = "/websites/fetchstaging"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + + // $('#ThemeBody').html(''); + // var themes = JSON.parse(response.data.themes); + // themes.forEach(AddThemes); + + $('#StagingBody').html(''); + console.log('Staging response:', response.data); + + try { + var staging = JSON.parse(response.data.wpsites); + console.log('Parsed staging data:', staging); + + if (staging && staging.length > 0) { + staging.forEach(function(site, index) { + console.log('Processing staging site ' + index + ':', site); + AddStagings(site, index, staging); + }); + } else { + $('#StagingBody').html('No staging sites found'); + } + } catch (e) { + console.error('Error parsing staging data:', e); + $('#StagingBody').html('Error loading staging sites'); + } + + } else { + console.error("Error from server:", response.data.error_message); + $('#StagingBody').html('Error: ' + response.data.error_message + ''); + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + console.error("Request failed:", response); + $('#StagingBody').html('Failed to load staging sites'); + } + }, 100); // Small delay to ensure DOM is ready + + }; + + $scope.fetchDatabase = function () { + + $('#wordpresshomeloading').show(); + $scope.wordpresshomeloading = false; + + var url = "/websites/fetchDatabase"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + $('#DB_Name').html(response.data.DataBaseName); + $('#DB_User').html(response.data.DataBaseUser); + $('#tableprefix').html(response.data.tableprefix); + } else { + alert("Error data.error_message:" + response.data.error_message) + + } + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + alert("Error" + response) + + } + + }; + + $scope.SaveUpdateConfig = function () { + $('#wordpresshomeloading').show(); + var data = { + AutomaticUpdates: $('#AutomaticUpdates').find(":selected").text(), + Plugins: $('#Plugins').find(":selected").text(), + Themes: $('#Themes').find(":selected").text(), + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/SaveUpdateConfig"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Update Configurations Sucessfully!.', + type: 'success' + }); + $("#autoUpdateConfig").modal('hide'); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: response, + type: 'error' + }); + + } + }; + + function AddStagings(value, index, array) { + console.log('Adding staging site:', value); + + // Ensure all required properties exist + if (!value || !value.id) { + console.error('Invalid staging site data:', value); + return; + } + + // Check if table exists + if ($('#StagingBody').length === 0) { + console.error('StagingBody table not found'); + return; + } + + var FinalMarkup = ''; + + // Add columns in correct order: Name, Domain, Path, Actions + FinalMarkup += '' + (value.name || 'Unnamed') + ''; + FinalMarkup += '' + (value.Domain || '') + ''; + FinalMarkup += '' + (value.path || '') + ''; + FinalMarkup += '' + + '' + + '' + + ''; + + FinalMarkup += ''; + + console.log('Appending markup to table:', FinalMarkup); + AppendToTable('#StagingBody', FinalMarkup); + console.log('Table content after append:', $('#StagingBody').html()); + } + + $scope.FinalDeployToProduction = function () { + + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + var data = { + WPid: $('#WPid').html(), + StagingID: DeploytoProductionID + } + + var url = "/websites/DeploytoProduction"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + + $('#wordpresshomeloading').hide(); + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Deploy To Production start!.', + type: 'success' + }); + statusFile = response.data.tempStatusPath; + getCreationStatus(); + + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: response, + type: 'error' + }); + + } + + }; + + + $scope.CreateBackup = function () { + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.currentStatus = "Starting creation Backups.."; + var data = { + WPid: $('#WPid').html(), + Backuptype: $('#backuptype').val() + } + var url = "/websites/WPCreateBackup"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Creating Backups!.', + type: 'success' + }); + statusFile = response.data.tempStatusPath; + getCreationStatus(); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + alert(response) + + } + + }; + + function getCreationStatus() { + $('#wordpresshomeloading').show(); + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + if (response.data.abort === 1) { + $('#wordpresshomeloading').hide(); + + if (response.data.installStatus === 1) { + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $("#installProgress").css("width", "100%"); + $("#installProgressbackup").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + // Re-enable buttons + $('#createbackupbutton').prop('disabled', false).html(' Create Backup'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + + // For backup operations, refresh the backup list + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(' Backup created successfully!'); + // Clear status after 5 seconds + setTimeout(function() { + $('#backupStatus').text(''); + }, 5000); + } + // For staging operations, refresh the staging list + else { + $('#stagingStatus').html(' Staging site created successfully!'); + $scope.fetchstaging(); + // Clear status after 5 seconds + setTimeout(function() { + $('#stagingStatus').text(''); + }, 5000); + } + + } else { + $('#wordpresshomeloading').hide(); + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $("#installProgressbackup").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + // Re-enable buttons on error + $('#createbackupbutton').prop('disabled', false).html(' Create Backup'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + + // Show error status + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(' ' + response.data.error_message + ''); + } else { + $('#stagingStatus').html(' ' + response.data.error_message + ''); + } + + } + + } else { + + $("#installProgress").css("width", response.data.installationProgress + "%"); + $("#installProgressbackup").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + + // Update status displays with progress + var statusHtml = ' ' + response.data.currentStatus; + if (response.data.installationProgress) { + statusHtml += ' (' + response.data.installationProgress + '%)'; + } + + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(statusHtml); + } else { + $('#stagingStatus').html(statusHtml); + } + + $timeout(getCreationStatus, 1000); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#createBackupBtn').prop('disabled', false).html(' Create Backup'); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + } + + $scope.installwpcore = function () { + + $('#wordpresshomeloading').show(); + $('#wordpresshomeloadingsec').show(); + var data = { + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/installwpcore"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Results fetched..', + type: 'success' + }); + $('#SecurityResult').html(response.data.result); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + }; + + $scope.dataintegrity = function () { + + $('#wordpresshomeloading').show(); + $('#wordpresshomeloadingsec').show(); + var data = { + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/dataintegrity"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Results fetched', + type: 'success' + }); + $('#SecurityResult').html(response.data.result); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + }; + + $scope.updateSetting = function(site, setting) { + var settingMap = { + 'search-indexing': 'searchIndex', + 'debugging': 'debugging', + 'password-protection': 'passwordProtection', + 'maintenance-mode': 'maintenanceMode' + }; + + // Toggle the state before sending request + site[settingMap[setting]] = site[settingMap[setting]] === 1 ? 0 : 1; + + var data = { + siteId: site.id, + setting: setting, + value: site[settingMap[setting]] + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Setting updated successfully.', + type: 'success' + }); + if (setting === 'password-protection' && site[settingMap[setting]] === 1) { + // Show password protection modal if enabling + site.PPUsername = ""; + site.PPPassword = ""; + $scope.currentWP = site; + $('#passwordProtectionModal').modal('show'); + } + } else { + // Revert the change if update failed + site[settingMap[setting]] = site[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: response.data.error_message || 'Failed to update setting.', + type: 'error' + }); + } + }).catch(function(error) { + // Revert the change on error + site[settingMap[setting]] = site[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: 'Connection failed while updating setting.', + type: 'error' + }); + }); + }; + + $scope.submitPasswordProtection = function() { + console.log('submitPasswordProtection called'); + console.log('Current WP:', $scope.currentWP); + + if (!$scope.currentWP) { + console.error('No WordPress site selected'); + new PNotify({ + title: 'Error!', + text: 'No WordPress site selected.', + type: 'error' + }); + return; + } + + if (!$scope.currentWP.PPUsername || !$scope.currentWP.PPPassword) { + console.error('Missing username or password'); + new PNotify({ + title: 'Error!', + text: 'Please provide both username and password', + type: 'error' + }); + return; + } + + var data = { + siteId: $scope.currentWP.id, + setting: 'password-protection', + value: 1, + username: $scope.currentWP.PPUsername, + password: $scope.currentWP.PPPassword + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + console.log('Sending request with data:', data); + $('#passwordProtectionModal').modal('hide'); + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + console.log('Received response:', response); + if (response.data.status) { + new PNotify({ + title: 'Success!', + text: 'Password protection enabled successfully!', + type: 'success' + }); + } else { + $scope.currentWP.passwordProtection = false; + new PNotify({ + title: 'Error!', + text: response.data.error_message || 'Failed to enable password protection', + type: 'error' + }); + } + }).catch(function(error) { + console.error('Request failed:', error); + $scope.currentWP.passwordProtection = false; + new PNotify({ + title: 'Error!', + text: 'Could not connect to server', + type: 'error' + }); + }); + }; + +}); + + +var PluginsList = []; + + +function AddPluginToArray(cBox, name) { + if (cBox.checked) { + PluginsList.push(name); + // alert(PluginsList); + } else { + const index = PluginsList.indexOf(name); + if (index > -1) { + PluginsList.splice(index, 1); + } + // alert(PluginsList); + } +} + +var ThemesList = []; + +function AddThemeToArray(cBox, name) { + if (cBox.checked) { + ThemesList.push(name); + // alert(ThemesList); + } else { + const index = ThemesList.indexOf(name); + if (index > -1) { + ThemesList.splice(index, 1); + } + // alert(ThemesList); + } +} + + +function AppendToTable(table, markup) { + try { + if ($(table).length === 0) { + console.error('Table element not found:', table); + return false; + } + + console.log('Appending to table:', table); + console.log('Markup:', markup); + + $(table).append(markup); + + console.log('Successfully appended. Table now has', $(table).find('tr').length, 'rows'); + return true; + } catch (e) { + console.error('Error appending to table:', e); + return false; + } +} + + +//..................Restore Backup Home + + +app.controller('RestoreWPBackup', function ($scope, $http, $timeout, $window) { + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + + $scope.checkmethode = function () { + var val = $('#RestoreMethode').children("option:selected").val(); + if (val == 1) { + $('#Newsitediv').show(); + $('#exinstingsitediv').hide(); + } else if (val == 0) { + $('#exinstingsitediv').show(); + $('#Newsitediv').hide(); + } else { + + } + }; + + + $scope.RestoreWPbackupNow = function () { + $('#wordpresshomeloading').show(); + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.currentStatus = "Start Restoring WordPress.."; + + var Domain = $('#wprestoresubdirdomain').val() + var path = $('#wprestoresubdirpath').val(); + var home = "1"; + + if (typeof path != 'undefined' || path != '') { + home = "0"; + } + if (typeof path == 'undefined') { + path = ""; + } + + + var backuptype = $('#backuptype').html(); + var data; + if (backuptype == "DataBase Backup") { + data = { + backupid: $('#backupid').html(), + DesSite: $('#DesSite').children("option:selected").val(), + Domain: '', + path: path, + home: home, + } + } else { + data = { + backupid: $('#backupid').html(), + DesSite: $('#DesSite').children("option:selected").val(), + Domain: Domain, + path: path, + home: home, + } + + } + + var url = "/websites/RestoreWPbackupNow"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + // console.log(data) + + var d = $('#DesSite').children("option:selected").val(); + var c = $("input[name=Newdomain]").val(); + // if (d == -1 || c == "") { + // alert("Please Select Method of Backup Restore"); + // } else { + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + // } + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Restoring process starts!.', + type: 'success' + }); + statusFile = response.data.tempStatusPath; + getCreationStatus(); + + } else { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + } + + function getCreationStatus() { + $('#wordpresshomeloading').show(); + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + if (response.data.abort === 1) { + $('#wordpresshomeloading').hide(); + + if (response.data.installStatus === 1) { + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $("#installProgress").css("width", "100%"); + $("#installProgressbackup").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + // Re-enable buttons + $('#createbackupbutton').prop('disabled', false).html(' Create Backup'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + + // For backup operations, refresh the backup list + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(' Backup created successfully!'); + if (typeof window.fetchBackupList === 'function') { + window.fetchBackupList(); + } + // Clear status after 5 seconds + setTimeout(function() { + $('#backupStatus').text(''); + }, 5000); + } + // For staging operations, refresh the staging list + else { + $('#stagingStatus').html(' Staging site created successfully!'); + $scope.fetchstaging(); + // Clear status after 5 seconds + setTimeout(function() { + $('#stagingStatus').text(''); + }, 5000); + } + + + } else { + $('#wordpresshomeloading').hide(); + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $("#installProgressbackup").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + // Re-enable buttons on error + $('#createbackupbutton').prop('disabled', false).html(' Create Backup'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + + // Show error status + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(' ' + response.data.error_message + ''); + } else { + $('#stagingStatus').html(' ' + response.data.error_message + ''); + } + + + } + + } else { + + $("#installProgress").css("width", response.data.installationProgress + "%"); + $("#installProgressbackup").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + + // Update status displays with progress + var statusHtml = ' ' + response.data.currentStatus; + if (response.data.installationProgress) { + statusHtml += ' (' + response.data.installationProgress + '%)'; + } + + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(statusHtml); + } else { + $('#stagingStatus').html(statusHtml); + } + + $timeout(getCreationStatus, 1000); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#createBackupBtn').prop('disabled', false).html(' Create Backup'); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + } + + $scope.goBack = function () { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; +}); + + +//.......................................Remote Backup + +//........... delete DeleteBackupConfigNow + +function DeleteBackupConfigNow(url) { + window.location.href = url; +} + +function DeleteRemoteBackupsiteNow(url) { + window.location.href = url; +} + +function DeleteBackupfileConfigNow(url) { + window.location.href = url; +} + + +app.controller('RemoteBackupConfig', function ($scope, $http, $timeout, $window) { + $scope.RemoteBackupLoading = true; + $scope.SFTPBackUpdiv = true; + + $scope.EndpointURLdiv = true; + $scope.Selectprovider = true; + $scope.S3keyNamediv = true; + $scope.Accesskeydiv = true; + $scope.SecretKeydiv = true; + $scope.SelectRemoteBackuptype = function () { + var val = $scope.RemoteBackuptype; + if (val == "SFTP") { + $scope.SFTPBackUpdiv = false; + $scope.EndpointURLdiv = true; + $scope.Selectprovider = true; + $scope.S3keyNamediv = true; + $scope.Accesskeydiv = true; + $scope.SecretKeydiv = true; + } else if (val == "S3") { + $scope.EndpointURLdiv = true; + $scope.Selectprovider = false; + $scope.S3keyNamediv = false; + $scope.Accesskeydiv = false; + $scope.SecretKeydiv = false; + $scope.SFTPBackUpdiv = true; + } else { + $scope.RemoteBackupLoading = true; + $scope.SFTPBackUpdiv = true; + + $scope.EndpointURLdiv = true; + $scope.Selectprovider = true; + $scope.S3keyNamediv = true; + $scope.Accesskeydiv = true; + $scope.SecretKeydiv = true; + } + } + + $scope.SelectProvidertype = function () { + $scope.EndpointURLdiv = true; + var provider = $scope.Providervalue + if (provider == 'Backblaze') { + $scope.EndpointURLdiv = false; + } else { + $scope.EndpointURLdiv = true; + } + } + + $scope.SaveBackupConfig = function () { + $scope.RemoteBackupLoading = false; + var Hname = $scope.Hostname; + var Uname = $scope.Username; + var Passwd = $scope.Password; + var path = $scope.path; + var type = $scope.RemoteBackuptype; + var Providervalue = $scope.Providervalue; + var data; + if (type == "SFTP") { + + data = { + Hname: Hname, + Uname: Uname, + Passwd: Passwd, + path: path, + type: type + } + } else if (type == "S3") { + if (Providervalue == "Backblaze") { + data = { + S3keyname: $scope.S3keyName, + Provider: Providervalue, + AccessKey: $scope.Accesskey, + SecertKey: $scope.SecretKey, + EndUrl: $scope.EndpointURL, + type: type + } + } else { + data = { + S3keyname: $scope.S3keyName, + Provider: Providervalue, + AccessKey: $scope.Accesskey, + SecertKey: $scope.SecretKey, + type: type + } + + } + + } + var url = "/websites/SaveBackupConfig"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + } + +}); + +var UpdatescheduleID; +app.controller('BackupSchedule', function ($scope, $http, $timeout, $window) { + $scope.BackupScheduleLoading = true; + $scope.SaveBackupSchedule = function () { + $scope.RemoteBackupLoading = false; + var FileRetention = $scope.Fretention; + var Backfrequency = $scope.Bfrequency; + + + var data = { + FileRetention: FileRetention, + Backfrequency: Backfrequency, + ScheduleName: $scope.ScheduleName, + RemoteConfigID: $('#RemoteConfigID').html(), + BackupType: $scope.BackupType + } + var url = "/websites/SaveBackupSchedule"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + }; + + + $scope.getupdateid = function (ID) { + UpdatescheduleID = ID; + } + + $scope.UpdateRemoteschedules = function () { + $scope.RemoteBackupLoading = false; + var Frequency = $scope.RemoteFrequency; + var fretention = $scope.RemoteFileretention; + + var data = { + ScheduleID: UpdatescheduleID, + Frequency: Frequency, + FileRetention: fretention + } + var url = "/websites/UpdateRemoteschedules"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Updated!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + }; + + $scope.AddWPsiteforRemoteBackup = function () { + $scope.RemoteBackupLoading = false; + + + var data = { + WpsiteID: $('#Wpsite').val(), + RemoteScheduleID: $('#RemoteScheduleID').html() + } + var url = "/websites/AddWPsiteforRemoteBackup"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + }; +}); /* Java script code to create account */ + +var website_create_domain_check = 0; + +function website_create_checkbox_function() { + + var checkBox = document.getElementById("myCheck"); + // Get the output text + + + // If the checkbox is checked, display the output text + if (checkBox.checked == true) { + website_create_domain_check = 0; + document.getElementById('Website_Create_Test_Domain').style.display = "block"; + document.getElementById('Website_Create_Own_Domain').style.display = "none"; + + } else { + document.getElementById('Website_Create_Test_Domain').style.display = "none"; + document.getElementById('Website_Create_Own_Domain').style.display = "block"; + website_create_domain_check = 1; + } + + // alert(domain_check); +} + + +/* Java script code to create account ends here */ + +/* Java script code to list accounts */ + +$("#listFail").hide(); + + +app.controller('listWebsites', function ($scope, $http, $window) { + $scope.web = {}; + $scope.WebSitesList = []; + $scope.loading = true; // Add loading state + $scope.expandedSites = {}; // Track which sites are expanded + + $scope.currentPage = 1; + $scope.recordsToShow = 10; + + // Function to toggle site expansion + $scope.toggleSite = function(site) { + if (!$scope.expandedSites[site.domain]) { + $scope.expandedSites[site.domain] = true; + site.loading = true; + // You can add any data fetching logic here if needed + setTimeout(function() { + site.loading = false; + $scope.$apply(); + }, 500); + } else { + $scope.expandedSites[site.domain] = false; + } + }; + + // Function to check if site is expanded + $scope.isExpanded = function(siteId) { + return $scope.expandedSites[siteId]; + }; + + // Function to check if site data is loaded + $scope.isDataLoaded = function(site) { + return site.version !== undefined; + }; + + // Function to get SSL tooltip text + $scope.getSslTooltip = function(web) { + if (!web.ssl) return ''; + + var tooltip = ''; + if (web.ssl.issuer && web.ssl.issuer !== '') { + tooltip += 'Issuer: ' + web.ssl.issuer; + } + + if (web.ssl.days !== undefined) { + if (tooltip) tooltip += ' | '; + if (web.ssl.days < 0) { + tooltip += 'Expired ' + Math.abs(web.ssl.days) + ' days ago'; + } else { + tooltip += 'Valid for ' + web.ssl.days + ' days'; + } + } + + if (web.ssl.is_wildcard) { + if (tooltip) tooltip += ' | '; + tooltip += 'Wildcard Certificate'; + } + + if (web.ssl.status === 'none') { + tooltip = 'No SSL certificate installed. Click "Issue SSL" to secure this site.'; + } else if (web.ssl.status === 'self-signed') { + tooltip = 'Self-signed certificate detected. Not trusted by browsers.'; + } + + return tooltip; + }; + + // Initial fetch of websites + $scope.getFurtherWebsitesFromDB = function () { + $scope.loading = true; // Set loading to true when starting fetch + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + page: $scope.currentPage, + recordsToShow: $scope.recordsToShow + }; + + var dataurl = "/websites/fetchWebsitesList"; + + $http.post(dataurl, data, config).then(function(response) { + if (response.data.listWebSiteStatus === 1) { + $scope.WebSitesList = JSON.parse(response.data.data); + $scope.pagination = response.data.pagination; + $("#listFail").hide(); + // Expand the first site by default + if ($scope.WebSitesList.length > 0) { + $scope.expandedSites[$scope.WebSitesList[0].domain] = true; + } + } else { + $("#listFail").fadeIn(); + $scope.errorMessage = response.data.error_message; + } + $scope.loading = false; // Set loading to false when done + }).catch(function(error) { + $("#listFail").fadeIn(); + $scope.errorMessage = error.message || 'An error occurred while fetching websites'; + $scope.loading = false; // Set loading to false on error + }); + }; + + // Call it immediately + $scope.getFurtherWebsitesFromDB(); + + $scope.showWPSites = function(domain) { + console.log('showWPSites called for domain:', domain); + + // Make sure domain is defined + if (!domain) { + console.error('Domain is undefined'); + return; + } + + // Find the website in the list + var site = $scope.WebSitesList.find(function(website) { + return website.domain === domain; + }); + + if (!site) { + console.error('Website not found:', domain); + return; + } + + // Set loading state + site.loadingWPSites = true; + + // Toggle visibility + site.showWPSites = !site.showWPSites; + + // If we're hiding, just return + if (!site.showWPSites) { + site.loadingWPSites = false; + return; + } + + var config = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = $.param({ + domain: domain + }); + + $http.post('/websites/fetchWPDetails', data, config) + .then(function(response) { + console.log('Response received:', response); + if (response.data.status === 1 && response.data.fetchStatus === 1) { + site.wp_sites = response.data.sites || []; + // Initialize loading states for each WP site + site.wp_sites.forEach(function(wp) { + wp.loading = false; + wp.loadingPlugins = false; + wp.loadingTheme = false; + }); + $("#listFail").hide(); + } else { + $("#listFail").fadeIn(); + site.showWPSites = false; + $scope.errorMessage = response.data.error_message || 'Failed to fetch WordPress sites'; + console.error('Error in response:', response.data.error_message); + new PNotify({ + title: 'Error!', + text: response.data.error_message || 'Failed to fetch WordPress sites', + type: 'error' + }); + } + }) + .catch(function(error) { + console.error('Request failed:', error); + site.showWPSites = false; + $("#listFail").fadeIn(); + $scope.errorMessage = error.message || 'An error occurred while fetching WordPress sites'; + new PNotify({ + title: 'Error!', + text: error.message || 'Could not connect to server', + type: 'error' + }); + }) + .finally(function() { + site.loadingWPSites = false; + }); + }; + + $scope.visitSite = function(wp) { + var url = wp.url || wp.domain; + if (!url) return; + if (!url.startsWith('http://') && !url.startsWith('https://')) { + url = 'https://' + url; + } + window.open(url, '_blank'); + }; + + $scope.wpLogin = function(wpId) { + window.open('/websites/AutoLogin?id=' + wpId, '_blank'); + }; + + $scope.manageWP = function(wpId) { + window.location.href = '/websites/WPHome?ID=' + wpId; + }; + + $scope.deleteWPSite = function(wp) { + if (confirm('Are you sure you want to delete this WordPress site? This action cannot be undone.')) { + window.location.href = '/websites/ListWPSites?DeleteID=' + wp.id; + } + }; + + $scope.getFullUrl = function(url) { + console.log('getFullUrl called with:', url); + if (!url) { + // If no URL is provided, try to use the domain + if (this.wp && this.wp.domain) { + url = this.wp.domain; + } else { + return ''; + } + } + if (url.startsWith('http://') || url.startsWith('https://')) { + return url; + } + return 'https://' + url; + }; + + + $scope.updateSetting = function(wp, setting) { + var settingMap = { + 'search-indexing': 'searchIndex', + 'debugging': 'debugging', + 'password-protection': 'passwordProtection', + 'maintenance-mode': 'maintenanceMode' + }; + + // Toggle the state before sending request + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + + var data = { + siteId: wp.id, + setting: setting, + value: wp[settingMap[setting]] + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Setting updated successfully.', + type: 'success' + }); + if (setting === 'password-protection' && wp[settingMap[setting]] === 1) { + // Show password protection modal if enabling + wp.PPUsername = ""; + wp.PPPassword = ""; + $scope.currentWP = wp; + $('#passwordProtectionModal').modal('show'); + } + } else { + // Revert the change if update failed + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: response.data.error_message || 'Failed to update setting.', + type: 'error' + }); + } + }).catch(function(error) { + // Revert the change on error + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: 'Connection failed while updating setting.', + type: 'error' + }); + }); + }; + + $scope.UpdateWPSettings = function(wp) { + $('#wordpresshomeloading').show(); + + var url = "/websites/UpdateWPSettings"; + var data = {}; + + if (wp.setting === "PasswordProtection") { + data = { + wpID: wp.id, + setting: wp.setting, + PPUsername: wp.PPUsername, + PPPassword: wp.PPPassword + }; + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken'), + 'Content-Type': 'application/x-www-form-urlencoded' + }, + transformRequest: function(obj) { + var str = []; + for(var p in obj) + str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); + return str.join("&"); + } + }; + + $http.post(url, data, config).then(function(response) { + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Updated!', + type: 'success' + }); + if (wp.setting === "PasswordProtection") { + location.reload(); + } + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + if (wp.setting === "PasswordProtection") { + location.reload(); + } + } + }, function(error) { + $('#wordpresshomeloading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + }); + }; + + $scope.togglePasswordProtection = function(wp) { + console.log('togglePasswordProtection called for:', wp); + console.log('Current password protection state:', wp.passwordProtection); + + if (wp.passwordProtection) { + // Show modal for credentials + console.log('Showing modal for credentials'); + wp.PPUsername = ""; + wp.PPPassword = ""; + $scope.currentWP = wp; + console.log('Current WP set to:', $scope.currentWP); + $('#passwordProtectionModal').modal('show'); + } else { + // Disable password protection + console.log('Disabling password protection'); + var data = { + siteId: wp.id, + setting: 'password-protection', + value: 0 + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + console.log('Sending request with data:', data); + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + console.log('Received response:', response); + if (!response.data.status) { + wp.passwordProtection = !wp.passwordProtection; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message || 'Failed to disable password protection', + type: 'error' + }); + } else { + new PNotify({ + title: 'Success!', + text: 'Password protection disabled successfully.', + type: 'success' + }); + } + }).catch(function(error) { + console.error('Request failed:', error); + wp.passwordProtection = !wp.passwordProtection; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server.', + type: 'error' + }); + }); + } + }; + + $scope.submitPasswordProtection = function() { + console.log('submitPasswordProtection called'); + console.log('Current WP:', $scope.currentWP); + + if (!$scope.currentWP) { + console.error('No WordPress site selected'); + new PNotify({ + title: 'Error!', + text: 'No WordPress site selected.', + type: 'error' + }); + return; + } + + if (!$scope.currentWP.PPUsername || !$scope.currentWP.PPPassword) { + console.error('Missing username or password'); + new PNotify({ + title: 'Error!', + text: 'Please provide both username and password', + type: 'error' + }); + return; + } + + var data = { + siteId: $scope.currentWP.id, + setting: 'password-protection', + value: 1, + username: $scope.currentWP.PPUsername, + password: $scope.currentWP.PPPassword + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + console.log('Sending request with data:', data); + $('#passwordProtectionModal').modal('hide'); + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + console.log('Received response:', response); + if (response.data.status) { + new PNotify({ + title: 'Success!', + text: 'Password protection enabled successfully!', + type: 'success' + }); + } else { + $scope.currentWP.passwordProtection = false; + new PNotify({ + title: 'Error!', + text: response.data.error_message || 'Failed to enable password protection', + type: 'error' + }); + } + }).catch(function(error) { + console.error('Request failed:', error); + $scope.currentWP.passwordProtection = false; + new PNotify({ + title: 'Error!', + text: 'Could not connect to server', + type: 'error' + }); + }); + }; + + $scope.cyberPanelLoading = true; + + $scope.issueSSL = function (virtualHost) { + $scope.cyberPanelLoading = false; + + var url = "/manageSSL/issueSSL"; + + + var data = { + virtualHost: virtualHost + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.SSL === 1) { + new PNotify({ + title: 'Success!', + text: 'SSL successfully issued.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + + }; + + $scope.cyberPanelLoading = true; + + $scope.searchWebsites = function () { + $scope.loading = true; // Set loading to true when starting search + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + patternAdded: $scope.patternAdded + }; + + dataurl = "/websites/searchWebsites"; + + $http.post(dataurl, data, config).then(function(response) { + if (response.data.listWebSiteStatus === 1) { + var finalData = JSON.parse(response.data.data); + $scope.WebSitesList = finalData; + $("#listFail").hide(); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + $scope.loading = false; // Set loading to false when done + }).catch(function(error) { + new PNotify({ + title: 'Operation Failed!', + text: 'Connect disrupted, refresh the page.', + type: 'error' + }); + $scope.loading = false; // Set loading to false on error + }); + }; + + $scope.ScanWordpressSite = function () { + + $('#cyberPanelLoading').show(); + + + var url = "/websites/ScanWordpressSite"; + + var data = {} + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + $('#cyberPanelLoading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#cyberPanelLoading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + }; + + $scope.goToManage = function($event, domain) { + $event.stopPropagation(); + window.location = '/websites/' + domain; + }; + + $scope.goToFileManager = function($event, domain) { + $event.stopPropagation(); + window.location = '/filemanager/' + domain; + }; + +}); + +/** + * Created by usman on 7/26/17. + */ +function getCookie(name) { + var cookieValue = null; + var t = document.cookie; + if (document.cookie && document.cookie !== '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) === (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; +} + + +var arry = [] + +function selectpluginJs(val) { + $('#mysearch').hide() + arry.push(val) + + // console.log(arry) + document.getElementById('selJS').innerHTML = ""; + + for (var i = 0; i < arry.length; i++) { + $('#selJS').show() + var mlm = ' ' + arry[i] + '    ' + $('#selJS').append(mlm) + } + + +} + + +var DeletePluginURL; + +function DeletePluginBuucket(url) { + DeletePluginURL = url; +} + +function FinalDeletePluginBuucket() { + window.location.href = DeletePluginURL; +} + +var SPVal; + +app.controller('WPAddNewPlugin', function ($scope, $http, $timeout, $window, $compile) { + $scope.webSiteCreationLoading = true; + + $scope.SearchPluginName = function (val) { + $scope.webSiteCreationLoading = false; + SPVal = val; + url = "/websites/SearchOnkeyupPlugin"; + + var searchcontent = $scope.searchcontent; + + + var data = { + pluginname: searchcontent + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.webSiteCreationLoading = true; + + if (response.data.status === 1) { + if (SPVal == 'add') { + $('#mysearch').show() + document.getElementById('mysearch').innerHTML = ""; + var res = response.data.plugns.plugins + // console.log(res); + for (i = 0; i <= res.length; i++) { + // + var tml = '
'; + $('#mysearch').append(tml); + } + } else if (SPVal == 'eidt') { + $('#mysearch').show() + document.getElementById('mysearch').innerHTML = ""; + var res = response.data.plugns.plugins + // console.log(res); + for (i = 0; i <= res.length; i++) { + // + var tml = '
'; + var temp = $compile(tml)($scope) + angular.element(document.getElementById('mysearch')).append(temp); + } + + } + + + } else { + + // $scope.errorMessage = response.data.error_message; + alert("Status not = 1: Error..." + response.data.error_message) + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + } + + $scope.AddNewplugin = function () { + + url = "/websites/AddNewpluginAjax"; + + var bucketname = $scope.PluginbucketName + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + var data = { + config: arry, + Name: bucketname + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Bucket created.', + type: 'success' + }); + location.reload(); + } else { + + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + } + + $scope.deletesPlgin = function (val) { + + url = "/websites/deletesPlgin"; + + + var data = { + pluginname: val, + pluginbBucketID: $('#pluginbID').html() + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + location.reload(); + + } else { + + // $scope.errorMessage = response.data.error_message; + alert("Status not = 1: Error..." + response.data.error_message) + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + + } + + $scope.Addplugin = function (slug) { + $('#mysearch').hide() + + url = "/websites/Addplugineidt"; + + + var data = { + pluginname: slug, + pluginbBucketID: $('#pluginbID').html() + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + location.reload(); + + } else { + + // $scope.errorMessage = response.data.error_message; + alert("Status not = 1: Error..." + response.data.error_message) + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + + + } + +}); + +var domain_check = 0; + +function checkbox_function() { + + var checkBox = document.getElementById("myCheck"); + // Get the output text + + + // If the checkbox is checked, display the output text + if (checkBox.checked == true) { + domain_check = 0; + document.getElementById('Test_Domain').style.display = "block"; + document.getElementById('Own_Domain').style.display = "none"; + + } else { + document.getElementById('Test_Domain').style.display = "none"; + document.getElementById('Own_Domain').style.display = "block"; + domain_check = 1; + } + + // alert(domain_check); +} + +app.controller('createWordpress', function ($scope, $http, $timeout, $compile, $window) { + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + // Password generation function + $scope.randomPassword = function(length) { + var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+"; + var password = ""; + for (var i = 0; i < length; i++) { + password += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return password; + }; + + // Initialize showPassword + $scope.showPassword = false; + + var statusFile; + + $scope.createWordPresssite = function () { + + $scope.webSiteCreationLoading = false; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + + $scope.currentStatus = "Starting creation.."; + + var apacheBackend = 0; + + if ($scope.apacheBackend === true) { + apacheBackend = 1; + } else { + apacheBackend = 0 + } + + var package = $scope.packageForWebsite; + var websiteOwner = $scope.websiteOwner; + var WPtitle = $scope.WPtitle; + + // if (domain_check == 0) { + // var Part2_domainNameCreate = document.getElementById('Part2_domainNameCreate').value; + // var domainNameCreate = document.getElementById('TestDomainNameCreate').value + Part2_domainNameCreate; + // } + // if (domain_check == 1) { + // + // var domainNameCreate = $scope.own_domainNameCreate; + // } + + var domainNameCreate = $scope.domainNameCreate; + + + var WPUsername = $scope.WPUsername; + var adminEmail = $scope.adminEmail; + var WPPassword = $scope.WPPassword; + var WPVersions = $scope.WPVersions; + var pluginbucket = $scope.pluginbucket; + var autoupdates = $scope.autoupdates; + var pluginupdates = $scope.pluginupdates; + var themeupdates = $scope.themeupdates; + + if (domain_check == 0) { + + var path = ""; + + } + if (domain_check = 1) { + + var path = $scope.installPath; + + } + + + var home = "1"; + + if (typeof path != 'undefined') { + home = "0"; + } + + //alert(domainNameCreate); + var data = { + + title: WPtitle, + domain: domainNameCreate, + WPVersion: WPVersions, + pluginbucket: pluginbucket, + adminUser: WPUsername, + Email: adminEmail, + PasswordByPass: WPPassword, + AutomaticUpdates: autoupdates, + Plugins: pluginupdates, + Themes: themeupdates, + websiteOwner: websiteOwner, + package: package, + home: home, + path: path, + apacheBackend: apacheBackend + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + var url = "/websites/submitWorpressCreation"; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.webSiteCreationLoading = true; + if (response.data.status === 1) { + statusFile = response.data.tempStatusPath; + getCreationStatus(); + + } else { + $scope.goBackDisable = false; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + + }; + $scope.goBack = function () { + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; + + function getCreationStatus() { + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.abort === 1) { + + if (response.data.installStatus === 1) { + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $("#installProgress").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + } else { + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + } + + } else { + $scope.webSiteCreationLoading = false; + $("#installProgress").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + $timeout(getCreationStatus, 1000); + } + + } + + function cantLoadInitialDatas(response) { + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + } + + +}); + + +//........... delete wp list +var FurlDeleteWP; + +function DeleteWPNow(url) { + FurlDeleteWP = url; +} + +function FinalDeleteWPNow() { + window.location.href = FurlDeleteWP; +} + +var DeploytoProductionID; + +function DeployToProductionInitial(vall) { + DeploytoProductionID = vall; +} + +// Simplified staging domain input - checkbox functionality removed + +app.controller('WPsiteHome', function ($scope, $http, $timeout, $compile, $window) { + var CheckBoxpasssword = 0; + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.searchIndex = 0; + + $(document).ready(function () { + var checkstatus = document.getElementById("wordpresshome"); + if (checkstatus !== null) { + $scope.LoadWPdata(); + } + }); + + $scope.LoadWPdata = function () { + $scope.wordpresshomeloading = false; + $('#wordpresshomeloading').show(); + + var url = "/websites/FetchWPdata"; + + var data = { + WPid: $('#WPid').html(), + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(function(response) { + $scope.wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + $('#WPVersion').text(response.data.ret_data.version); + if (response.data.ret_data.lscache === 1) { + $('#lscache').prop('checked', true); + } + if (response.data.ret_data.debugging === 1) { + $('#debugging').prop('checked', true); + } + + // Set search index state + $scope.searchIndex = response.data.ret_data.searchIndex; + + if (response.data.ret_data.maintenanceMode === 1) { + $('#maintenanceMode').prop('checked', true); + } + if (response.data.ret_data.wpcron === 1) { + $('#wpcron').prop('checked', true); + } + if (response.data.ret_data.passwordprotection == 1) { + var dc = ''; + var mp = $compile(dc)($scope); + angular.element(document.getElementById('prsswdprodata')).append(mp); + CheckBoxpasssword = 1; + } else { + var dc = ''; + $('#prsswdprodata').append(dc); + CheckBoxpasssword = 0; + } + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + }, function(error) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + console.error('Failed to load WP data:', error); + }); + }; + + $scope.UpdateWPSettings = function (setting) { + $scope.wordpresshomeloading = false; + $('#wordpresshomeloading').show(); + + var url = "/websites/UpdateWPSettings"; + var data; + + if (setting === "PasswordProtection") { + data = { + WPid: $('#WPid').html(), + setting: setting, + PPUsername: CheckBoxpasssword == 0 ? $scope.PPUsername : '', + PPPassword: CheckBoxpasssword == 0 ? $scope.PPPassword : '' + }; + } else { + var settingValue; + if (setting === 'searchIndex') { + $scope.searchIndex = $scope.searchIndex === 1 ? 0 : 1; + settingValue = $scope.searchIndex; + } else { + settingValue = $('#' + setting).is(":checked") ? 1 : 0; + } + data = { + WPid: $('#WPid').html(), + setting: setting, + settingValue: settingValue + }; + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(function(response) { + $scope.wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Updated!', + type: 'success' + }); + if (setting === "PasswordProtection") { + location.reload(); + } + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + // Revert the change on error + if (setting === 'searchIndex') { + $scope.searchIndex = $scope.searchIndex === 1 ? 0 : 1; + } + if (setting === "PasswordProtection") { + location.reload(); + } + } + }, function(error) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + // Revert the change on error + if (setting === 'searchIndex') { + $scope.searchIndex = $scope.searchIndex === 1 ? 0 : 1; + } + console.error('Failed to update setting:', error); + }); + }; + + $scope.GetCurrentPlugins = function () { + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + + var url = "/websites/GetCurrentPlugins"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + $('#PluginBody').html(''); + var plugins = JSON.parse(response.data.plugins); + plugins.forEach(AddPlugins); + + } else { + alert("Error:" + response.data.error_message) + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + }; + + $scope.GetCurrentThemes = function () { + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + + var url = "/websites/GetCurrentThemes"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + + $('#ThemeBody').html(''); + var themes = JSON.parse(response.data.themes); + themes.forEach(AddThemes); + + } else { + alert("Error:" + response.data.error_message) + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + }; + + $scope.UpdatePlugins = function (plugin) { + $('#wordpresshomeloading').show(); + var data = { + plugin: plugin, + pluginarray: PluginsList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/UpdatePlugins"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Updating Plugins in Background!.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + + }; + + $scope.DeletePlugins = function (plugin) { + $('#wordpresshomeloading').show(); + var data = { + plugin: plugin, + pluginarray: PluginsList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/DeletePlugins"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Deleting Plugin in Background!', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + } + + $scope.ChangeStatus = function (plugin) { + $('#wordpresshomeloading').show(); + var data = { + plugin: plugin, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/ChangeStatus"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Changed Plugin state Successfully !.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + } + + function AddPlugins(value, index, array) { + var FinalMarkup = '' + FinalMarkup = FinalMarkup + ''; + for (let x in value) { + if (x === 'status') { + if (value[x] === 'inactive') { + FinalMarkup = FinalMarkup + '
'; + } else { + FinalMarkup = FinalMarkup + '
'; + } + } else if (x === 'update') { + if (value[x] === 'none') { + FinalMarkup = FinalMarkup + 'Upto Date'; + } else { + FinalMarkup = FinalMarkup + ''; + } + } else { + FinalMarkup = FinalMarkup + '' + value[x] + ""; + } + } + FinalMarkup = FinalMarkup + '' + FinalMarkup = FinalMarkup + '' + var temp = $compile(FinalMarkup)($scope) + AppendToTable('#PluginBody', temp) + } + + $scope.UpdateThemes = function (theme) { + $('#wordpresshomeloading').show(); + var data = { + Theme: theme, + Themearray: ThemesList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/UpdateThemes"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Updating Theme in background !.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + + }; + + $scope.DeleteThemes = function (theme) { + $('#wordpresshomeloading').show(); + var data = { + Theme: theme, + Themearray: ThemesList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/DeleteThemes"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Deleting Theme in Background!.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + }; + + $scope.ChangeStatusThemes = function (theme) { + $('#wordpresshomeloading').show(); + var data = { + theme: theme, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/StatusThemes"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Change Theme state in Bsckground!.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + }; + + function AddThemes(value, index, array) { + var FinalMarkup = '' + FinalMarkup = FinalMarkup + ''; + for (let x in value) { + if (x === 'status') { + if (value[x] === 'inactive') { + FinalMarkup = FinalMarkup + '
'; + } else { + FinalMarkup = FinalMarkup + '
'; + } + } else if (x === 'update') { + if (value[x] === 'none') { + FinalMarkup = FinalMarkup + 'Upto Date'; + } else { + FinalMarkup = FinalMarkup + ''; + } + } else { + FinalMarkup = FinalMarkup + '' + value[x] + ""; + } + } + FinalMarkup = FinalMarkup + '' + FinalMarkup = FinalMarkup + '' + var temp = $compile(FinalMarkup)($scope) + AppendToTable('#ThemeBody', temp) + } + + $scope.CreateStagingNow = function () { + $('#wordpresshomeloading').show(); + $('#stagingStatus').html(' Starting staging site creation...'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', true).html(' Creating Staging Site...'); + + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + + $scope.currentStatus = "Starting creation Staging.."; + + // Get the staging domain from the simplified input + var domainNameCreate = $('#stagingDomainName').val() || $scope.stagingDomainName; + var data = { + StagingName: $('#stagingName').val(), + StagingDomain: domainNameCreate, + WPid: $('#WPid').html(), + } + var url = "/websites/CreateStagingNow"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + if (response.data.status === 1) { + statusFile = response.data.tempStatusPath; + getCreationStatus(); + } else { + $('#stagingStatus').html(' ' + response.data.error_message + ''); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#stagingStatus').html(' Could not connect to server'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + $scope.wordpresshomeloading = true; + alert(response) + + } + }; + + function getCreationStatus() { + $('#wordpresshomeloading').show(); + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + //$('#wordpresshomeloading').hide(); + + if (response.data.abort === 1) { + if (response.data.installStatus === 1) { + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + + $("#installProgress").css("width", "100%"); + $("#installProgressbackup").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + + } else { + $('#wordpresshomeloading').hide(); + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $("#installProgressbackup").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + // Re-enable buttons on error + $('#createbackupbutton').prop('disabled', false).html(' Create Backup'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + + // Show error status + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(' ' + response.data.error_message + ''); + } else { + $('#stagingStatus').html(' ' + response.data.error_message + ''); + } + + + } + + } else { + + $("#installProgress").css("width", response.data.installationProgress + "%"); + $("#installProgressbackup").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + + // Update status displays with progress + var statusHtml = ' ' + response.data.currentStatus; + if (response.data.installationProgress) { + statusHtml += ' (' + response.data.installationProgress + '%)'; + } + + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(statusHtml); + } else { + $('#stagingStatus').html(statusHtml); + } + + $timeout(getCreationStatus, 1000); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#createBackupBtn').prop('disabled', false).html(' Create Backup'); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + } + + $scope.goBack = function () { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; + + $scope.fetchstaging = function () { + + // Ensure DOM is ready + $timeout(function() { + // Check if the staging table exists + if ($('#StagingBody').length === 0) { + console.error('StagingBody table not found in DOM'); + return; + } + + $('#wordpresshomeloading').show(); + $scope.wordpresshomeloading = false; + + var url = "/websites/fetchstaging"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + + // $('#ThemeBody').html(''); + // var themes = JSON.parse(response.data.themes); + // themes.forEach(AddThemes); + + $('#StagingBody').html(''); + console.log('Staging response:', response.data); + + try { + var staging = JSON.parse(response.data.wpsites); + console.log('Parsed staging data:', staging); + + if (staging && staging.length > 0) { + staging.forEach(function(site, index) { + console.log('Processing staging site ' + index + ':', site); + AddStagings(site, index, staging); + }); + } else { + $('#StagingBody').html('No staging sites found'); + } + } catch (e) { + console.error('Error parsing staging data:', e); + $('#StagingBody').html('Error loading staging sites'); + } + + } else { + console.error("Error from server:", response.data.error_message); + $('#StagingBody').html('Error: ' + response.data.error_message + ''); + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + console.error("Request failed:", response); + $('#StagingBody').html('Failed to load staging sites'); + } + }, 100); // Small delay to ensure DOM is ready + + }; + + $scope.fetchDatabase = function () { + + $('#wordpresshomeloading').show(); + $scope.wordpresshomeloading = false; + + var url = "/websites/fetchDatabase"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + $('#DB_Name').html(response.data.DataBaseName); + $('#DB_User').html(response.data.DataBaseUser); + $('#tableprefix').html(response.data.tableprefix); + } else { + alert("Error data.error_message:" + response.data.error_message) + + } + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + alert("Error" + response) + + } + + }; + + $scope.SaveUpdateConfig = function () { + $('#wordpresshomeloading').show(); + var data = { + AutomaticUpdates: $('#AutomaticUpdates').find(":selected").text(), + Plugins: $('#Plugins').find(":selected").text(), + Themes: $('#Themes').find(":selected").text(), + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/SaveUpdateConfig"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Update Configurations Sucessfully!.', + type: 'success' + }); + $("#autoUpdateConfig").modal('hide'); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: response, + type: 'error' + }); + + } + }; + + function AddStagings(value, index, array) { + console.log('AddStagings function called with:', value); + + // Check if table element exists + if ($('#stagingListBody').length === 0) { + console.error('stagingListBody not found! Looking for StagingBody...'); + if ($('#StagingBody').length > 0) { + console.log('Found StagingBody, using that instead'); + var tableSelector = '#StagingBody'; + } else { + console.error('Neither stagingListBody nor StagingBody found!'); + console.log('Available table bodies:', $('tbody').map(function() { return this.id; }).get()); + return; + } + } else { + var tableSelector = '#stagingListBody'; + } + + var stagingUrl = 'http://' + value.Domain; + var createdDate = new Date().toLocaleDateString(); + + var FinalMarkup = ''; + FinalMarkup += '' + value.name + ''; + FinalMarkup += '' + stagingUrl + ''; + FinalMarkup += '' + createdDate + ''; + FinalMarkup += ''; + FinalMarkup += ' '; + FinalMarkup += ''; + FinalMarkup += ''; + FinalMarkup += ''; + + console.log('Appending to:', tableSelector); + $(tableSelector).append(FinalMarkup); + console.log('Rows in table after append:', $(tableSelector).find('tr').length); + } + + $scope.FinalDeployToProduction = function () { + + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + var data = { + WPid: $('#WPid').html(), + StagingID: DeploytoProductionID + } + + var url = "/websites/DeploytoProduction"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + + $('#wordpresshomeloading').hide(); + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Deploy To Production start!.', + type: 'success' + }); + statusFile = response.data.tempStatusPath; + getCreationStatus(); + + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: response, + type: 'error' + }); + + } + + }; + + + $scope.CreateBackup = function () { + $('#wordpresshomeloading').show(); + $('#createbackupbutton').prop('disabled', true).html(' Creating Backup...'); + + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.currentStatus = "Starting creation Backups.."; + var data = { + WPid: $('#WPid').html(), + Backuptype: $('#backuptype').val() + } + var url = "/websites/WPCreateBackup"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Creating Backups!.', + type: 'success' + }); + statusFile = response.data.tempStatusPath; + getCreationStatus(); + } else { + $('#createBackupBtn').prop('disabled', false).html(' Create Backup'); + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#createBackupBtn').prop('disabled', false).html(' Create Backup'); + alert(response) + + } + + }; + + + $scope.installwpcore = function () { + + $('#wordpresshomeloading').show(); + $('#wordpresshomeloadingsec').show(); + var data = { + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/installwpcore"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Results fetched..', + type: 'success' + }); + $('#SecurityResult').html(response.data.result); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + }; + + $scope.dataintegrity = function () { + + $('#wordpresshomeloading').show(); + $('#wordpresshomeloadingsec').show(); + var data = { + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/dataintegrity"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Results fetched', + type: 'success' + }); + $('#SecurityResult').html(response.data.result); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + }; + +}); + + +var PluginsList = []; + + +function AddPluginToArray(cBox, name) { + if (cBox.checked) { + PluginsList.push(name); + // alert(PluginsList); + } else { + const index = PluginsList.indexOf(name); + if (index > -1) { + PluginsList.splice(index, 1); + } + // alert(PluginsList); + } +} + +var ThemesList = []; + +function AddThemeToArray(cBox, name) { + if (cBox.checked) { + ThemesList.push(name); + // alert(ThemesList); + } else { + const index = ThemesList.indexOf(name); + if (index > -1) { + ThemesList.splice(index, 1); + } + // alert(ThemesList); + } +} + + +function AppendToTable(table, markup) { + $(table).append(markup); +} + + +//..................Restore Backup Home + + +app.controller('RestoreWPBackup', function ($scope, $http, $timeout, $window) { + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + + $scope.checkmethode = function () { + var val = $('#RestoreMethode').children("option:selected").val(); + if (val == 1) { + $('#Newsitediv').show(); + $('#exinstingsitediv').hide(); + } else if (val == 0) { + $('#exinstingsitediv').show(); + $('#Newsitediv').hide(); + } else { + + } + }; + + + $scope.RestoreWPbackupNow = function () { + $('#wordpresshomeloading').show(); + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.currentStatus = "Start Restoring WordPress.."; + + var Domain = $('#wprestoresubdirdomain').val() + var path = $('#wprestoresubdirpath').val(); + var home = "1"; + + if (typeof path != 'undefined' || path != '') { + home = "0"; + } + if (typeof path == 'undefined') { + path = ""; + } + + + var backuptype = $('#backuptype').html(); + var data; + if (backuptype == "DataBase Backup") { + data = { + backupid: $('#backupid').html(), + DesSite: $('#DesSite').children("option:selected").val(), + Domain: '', + path: path, + home: home, + } + } else { + data = { + backupid: $('#backupid').html(), + DesSite: $('#DesSite').children("option:selected").val(), + Domain: Domain, + path: path, + home: home, + } + + } + + var url = "/websites/RestoreWPbackupNow"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + // console.log(data) + + var d = $('#DesSite').children("option:selected").val(); + var c = $("input[name=Newdomain]").val(); + // if (d == -1 || c == "") { + // alert("Please Select Method of Backup Restore"); + // } else { + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + // } + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Restoring process starts!.', + type: 'success' + }); + statusFile = response.data.tempStatusPath; + getCreationStatus(); + + } else { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + } + + function getCreationStatus() { + $('#wordpresshomeloading').show(); + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + if (response.data.abort === 1) { + $('#wordpresshomeloading').hide(); + + if (response.data.installStatus === 1) { + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $("#installProgress").css("width", "100%"); + $("#installProgressbackup").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + // Re-enable buttons + $('#createbackupbutton').prop('disabled', false).html(' Create Backup'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + + // For backup operations, refresh the backup list + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(' Backup created successfully!'); + if (typeof window.fetchBackupList === 'function') { + window.fetchBackupList(); + } + // Clear status after 5 seconds + setTimeout(function() { + $('#backupStatus').text(''); + }, 5000); + } + // For staging operations, refresh the staging list + else { + $('#stagingStatus').html(' Staging site created successfully!'); + $scope.fetchstaging(); + // Clear status after 5 seconds + setTimeout(function() { + $('#stagingStatus').text(''); + }, 5000); + } + + + } else { + $('#wordpresshomeloading').hide(); + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $("#installProgressbackup").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + // Re-enable buttons on error + $('#createbackupbutton').prop('disabled', false).html(' Create Backup'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + + // Show error status + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(' ' + response.data.error_message + ''); + } else { + $('#stagingStatus').html(' ' + response.data.error_message + ''); + } + + + } + + } else { + + $("#installProgress").css("width", response.data.installationProgress + "%"); + $("#installProgressbackup").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + + // Update status displays with progress + var statusHtml = ' ' + response.data.currentStatus; + if (response.data.installationProgress) { + statusHtml += ' (' + response.data.installationProgress + '%)'; + } + + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(statusHtml); + } else { + $('#stagingStatus').html(statusHtml); + } + + $timeout(getCreationStatus, 1000); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#createBackupBtn').prop('disabled', false).html(' Create Backup'); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + } + + $scope.goBack = function () { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; +}); + + +//.......................................Remote Backup + +//........... delete DeleteBackupConfigNow + +function DeleteBackupConfigNow(url) { + window.location.href = url; +} + +function DeleteRemoteBackupsiteNow(url) { + window.location.href = url; +} + +function DeleteBackupfileConfigNow(url) { + window.location.href = url; +} + + +app.controller('RemoteBackupConfig', function ($scope, $http, $timeout, $window) { + $scope.RemoteBackupLoading = true; + $scope.SFTPBackUpdiv = true; + + $scope.EndpointURLdiv = true; + $scope.Selectprovider = true; + $scope.S3keyNamediv = true; + $scope.Accesskeydiv = true; + $scope.SecretKeydiv = true; + $scope.SelectRemoteBackuptype = function () { + var val = $scope.RemoteBackuptype; + if (val == "SFTP") { + $scope.SFTPBackUpdiv = false; + $scope.EndpointURLdiv = true; + $scope.Selectprovider = true; + $scope.S3keyNamediv = true; + $scope.Accesskeydiv = true; + $scope.SecretKeydiv = true; + } else if (val == "S3") { + $scope.EndpointURLdiv = true; + $scope.Selectprovider = false; + $scope.S3keyNamediv = false; + $scope.Accesskeydiv = false; + $scope.SecretKeydiv = false; + $scope.SFTPBackUpdiv = true; + } else { + $scope.RemoteBackupLoading = true; + $scope.SFTPBackUpdiv = true; + + $scope.EndpointURLdiv = true; + $scope.Selectprovider = true; + $scope.S3keyNamediv = true; + $scope.Accesskeydiv = true; + $scope.SecretKeydiv = true; + } + } + + $scope.SelectProvidertype = function () { + $scope.EndpointURLdiv = true; + var provider = $scope.Providervalue + if (provider == 'Backblaze') { + $scope.EndpointURLdiv = false; + } else { + $scope.EndpointURLdiv = true; + } + } + + $scope.SaveBackupConfig = function () { + $scope.RemoteBackupLoading = false; + var Hname = $scope.Hostname; + var Uname = $scope.Username; + var Passwd = $scope.Password; + var path = $scope.path; + var type = $scope.RemoteBackuptype; + var Providervalue = $scope.Providervalue; + var data; + if (type == "SFTP") { + + data = { + Hname: Hname, + Uname: Uname, + Passwd: Passwd, + path: path, + type: type + } + } else if (type == "S3") { + if (Providervalue == "Backblaze") { + data = { + S3keyname: $scope.S3keyName, + Provider: Providervalue, + AccessKey: $scope.Accesskey, + SecertKey: $scope.SecretKey, + EndUrl: $scope.EndpointURL, + type: type + } + } else { + data = { + S3keyname: $scope.S3keyName, + Provider: Providervalue, + AccessKey: $scope.Accesskey, + SecertKey: $scope.SecretKey, + type: type + } + + } + + } + var url = "/websites/SaveBackupConfig"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + } + +}); + +var UpdatescheduleID; +app.controller('BackupSchedule', function ($scope, $http, $timeout, $window) { + $scope.BackupScheduleLoading = true; + $scope.SaveBackupSchedule = function () { + $scope.RemoteBackupLoading = false; + var FileRetention = $scope.Fretention; + var Backfrequency = $scope.Bfrequency; + + + var data = { + FileRetention: FileRetention, + Backfrequency: Backfrequency, + ScheduleName: $scope.ScheduleName, + RemoteConfigID: $('#RemoteConfigID').html(), + BackupType: $scope.BackupType + } + var url = "/websites/SaveBackupSchedule"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + }; + + + $scope.getupdateid = function (ID) { + UpdatescheduleID = ID; + } + + $scope.UpdateRemoteschedules = function () { + $scope.RemoteBackupLoading = false; + var Frequency = $scope.RemoteFrequency; + var fretention = $scope.RemoteFileretention; + + var data = { + ScheduleID: UpdatescheduleID, + Frequency: Frequency, + FileRetention: fretention + } + var url = "/websites/UpdateRemoteschedules"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Updated!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + }; + + $scope.AddWPsiteforRemoteBackup = function () { + $scope.RemoteBackupLoading = false; + + + var data = { + WpsiteID: $('#Wpsite').val(), + RemoteScheduleID: $('#RemoteScheduleID').html() + } + var url = "/websites/AddWPsiteforRemoteBackup"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + }; +}); +/* Java script code to create account */ + +var website_create_domain_check = 0; + +function website_create_checkbox_function() { + + var checkBox = document.getElementById("myCheck"); + // Get the output text + + + // If the checkbox is checked, display the output text + if (checkBox.checked == true) { + website_create_domain_check = 0; + document.getElementById('Website_Create_Test_Domain').style.display = "block"; + document.getElementById('Website_Create_Own_Domain').style.display = "none"; + + } else { + document.getElementById('Website_Create_Test_Domain').style.display = "none"; + document.getElementById('Website_Create_Own_Domain').style.display = "block"; + website_create_domain_check = 1; + } + + // alert(domain_check); +} + app.controller('createWebsite', function ($scope, $http, $timeout, $window) { $scope.webSiteCreationLoading = true; @@ -46,7 +5861,7 @@ app.controller('createWebsite', function ($scope, $http, $timeout, $window) { $scope.currentStatus = "Starting creation.."; - var ssl, dkimCheck, openBasedir, mailDomain; + var ssl, dkimCheck, openBasedir, mailDomain, apacheBackend; if ($scope.sslCheck === true) { ssl = 1; @@ -54,6 +5869,12 @@ app.controller('createWebsite', function ($scope, $http, $timeout, $window) { ssl = 0 } + if ($scope.apacheBackend === true) { + apacheBackend = 1; + } else { + apacheBackend = 0 + } + if ($scope.dkimCheck === true) { dkimCheck = 1; } else { @@ -72,11 +5893,19 @@ app.controller('createWebsite', function ($scope, $http, $timeout, $window) { mailDomain = 0 } - url = "/websites/submitWebsiteCreation"; var package = $scope.packageForWebsite; + + // if (website_create_domain_check == 0) { + // var Part2_domainNameCreate = document.getElementById('Part2_domainNameCreate').value; + // var domainName = document.getElementById('TestDomainNameCreate').value + Part2_domainNameCreate; + // } + // if (website_create_domain_check == 1) { + // var domainName = $scope.domainNameCreate; + // } var domainName = $scope.domainNameCreate; + var adminEmail = $scope.adminEmail; var phpSelection = $scope.phpSelection; var websiteOwner = $scope.websiteOwner; @@ -91,9 +5920,11 @@ app.controller('createWebsite', function ($scope, $http, $timeout, $window) { websiteOwner: websiteOwner, dkimCheck: dkimCheck, openBasedir: openBasedir, - mailDomain: mailDomain + mailDomain: mailDomain, + apacheBackend: apacheBackend }; + var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') @@ -238,13 +6069,74 @@ $("#listFail").hide(); app.controller('listWebsites', function ($scope, $http, $window) { - + $scope.web = {}; + $scope.WebSitesList = []; + $scope.loading = true; // Add loading state + $scope.expandedSites = {}; // Track which sites are expanded $scope.currentPage = 1; $scope.recordsToShow = 10; - $scope.getFurtherWebsitesFromDB = function () { + // Function to toggle site expansion + $scope.toggleSite = function(site) { + if (!$scope.expandedSites[site.domain]) { + $scope.expandedSites[site.domain] = true; + site.loading = true; + // You can add any data fetching logic here if needed + setTimeout(function() { + site.loading = false; + $scope.$apply(); + }, 500); + } else { + $scope.expandedSites[site.domain] = false; + } + }; + // Function to check if site is expanded + $scope.isExpanded = function(siteId) { + return $scope.expandedSites[siteId]; + }; + + // Function to check if site data is loaded + $scope.isDataLoaded = function(site) { + return site.version !== undefined; + }; + + // Function to get SSL tooltip text + $scope.getSslTooltip = function(web) { + if (!web.ssl) return ''; + + var tooltip = ''; + if (web.ssl.issuer && web.ssl.issuer !== '') { + tooltip += 'Issuer: ' + web.ssl.issuer; + } + + if (web.ssl.days !== undefined) { + if (tooltip) tooltip += ' | '; + if (web.ssl.days < 0) { + tooltip += 'Expired ' + Math.abs(web.ssl.days) + ' days ago'; + } else { + tooltip += 'Valid for ' + web.ssl.days + ' days'; + } + } + + if (web.ssl.is_wildcard) { + if (tooltip) tooltip += ' | '; + tooltip += 'Wildcard Certificate'; + } + + if (web.ssl.status === 'none') { + tooltip = 'No SSL certificate installed. Click "Issue SSL" to secure this site.'; + } else if (web.ssl.status === 'self-signed') { + tooltip = 'Self-signed certificate detected. Not trusted by browsers.'; + } + + return tooltip; + }; + + // Initial fetch of websites + $scope.getFurtherWebsitesFromDB = function () { + $scope.loading = true; // Set loading to true when starting fetch var config = { headers: { 'X-CSRFToken': getCookie('csrftoken') @@ -256,32 +6148,395 @@ app.controller('listWebsites', function ($scope, $http, $window) { recordsToShow: $scope.recordsToShow }; + var dataurl = "/websites/fetchWebsitesList"; - dataurl = "/websites/fetchWebsitesList"; - - $http.post(dataurl, data, config).then(ListInitialData, cantLoadInitialData); - - - function ListInitialData(response) { + $http.post(dataurl, data, config).then(function(response) { if (response.data.listWebSiteStatus === 1) { - $scope.WebSitesList = JSON.parse(response.data.data); $scope.pagination = response.data.pagination; - $scope.clients = JSON.parse(response.data.data); $("#listFail").hide(); + // Expand the first site by default + if ($scope.WebSitesList.length > 0) { + $scope.expandedSites[$scope.WebSitesList[0].domain] = true; + } } else { $("#listFail").fadeIn(); $scope.errorMessage = response.data.error_message; + } + $scope.loading = false; // Set loading to false when done + }).catch(function(error) { + $("#listFail").fadeIn(); + $scope.errorMessage = error.message || 'An error occurred while fetching websites'; + $scope.loading = false; // Set loading to false on error + }); + }; + // Call it immediately + $scope.getFurtherWebsitesFromDB(); + + $scope.showWPSites = function(domain) { + console.log('showWPSites called for domain:', domain); + + // Make sure domain is defined + if (!domain) { + console.error('Domain is undefined'); + return; + } + + // Find the website in the list + var site = $scope.WebSitesList.find(function(website) { + return website.domain === domain; + }); + + if (!site) { + console.error('Website not found:', domain); + return; + } + + // Set loading state + site.loadingWPSites = true; + + // Toggle visibility + site.showWPSites = !site.showWPSites; + + // If we're hiding, just return + if (!site.showWPSites) { + site.loadingWPSites = false; + return; + } + + var config = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = $.param({ + domain: domain + }); + + $http.post('/websites/fetchWPDetails', data, config) + .then(function(response) { + console.log('Response received:', response); + if (response.data.status === 1 && response.data.fetchStatus === 1) { + site.wp_sites = response.data.sites || []; + // Initialize loading states for each WP site + site.wp_sites.forEach(function(wp) { + wp.loading = false; + wp.loadingPlugins = false; + wp.loadingTheme = false; + }); + $("#listFail").hide(); + } else { + $("#listFail").fadeIn(); + site.showWPSites = false; + $scope.errorMessage = response.data.error_message || 'Failed to fetch WordPress sites'; + console.error('Error in response:', response.data.error_message); + new PNotify({ + title: 'Error!', + text: response.data.error_message || 'Failed to fetch WordPress sites', + type: 'error' + }); + } + }) + .catch(function(error) { + console.error('Request failed:', error); + site.showWPSites = false; + $("#listFail").fadeIn(); + $scope.errorMessage = error.message || 'An error occurred while fetching WordPress sites'; + new PNotify({ + title: 'Error!', + text: error.message || 'Could not connect to server', + type: 'error' + }); + }) + .finally(function() { + site.loadingWPSites = false; + }); + }; + + $scope.visitSite = function(wp) { + var url = wp.url || wp.domain; + if (!url) return; + if (!url.startsWith('http://') && !url.startsWith('https://')) { + url = 'https://' + url; + } + window.open(url, '_blank'); + }; + + $scope.wpLogin = function(wpId) { + window.open('/websites/wpLogin?wpID=' + wpId, '_blank'); + }; + + $scope.manageWP = function(wpId) { + window.location.href = '/websites/WPHome?ID=' + wpId; + }; + + $scope.deleteWPSite = function(wp) { + if (confirm('Are you sure you want to delete this WordPress site? This action cannot be undone.')) { + window.location.href = '/websites/ListWPSites?DeleteID=' + wp.id; + } + }; + + $scope.getFullUrl = function(url) { + console.log('getFullUrl called with:', url); + if (!url) { + // If no URL is provided, try to use the domain + if (this.wp && this.wp.domain) { + url = this.wp.domain; + } else { + return ''; } } + if (url.startsWith('http://') || url.startsWith('https://')) { + return url; + } + return 'https://' + url; + }; - function cantLoadInitialData(response) { + + + $scope.updateSetting = function(wp, setting) { + var settingMap = { + 'search-indexing': 'searchIndex', + 'debugging': 'debugging', + 'password-protection': 'passwordProtection', + 'maintenance-mode': 'maintenanceMode' + }; + + // Toggle the state before sending request + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + + var data = { + siteId: wp.id, + setting: setting, + value: wp[settingMap[setting]] + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Setting updated successfully.', + type: 'success' + }); + if (setting === 'password-protection' && wp[settingMap[setting]] === 1) { + // Show password protection modal if enabling + wp.PPUsername = ""; + wp.PPPassword = ""; + $scope.currentWP = wp; + $('#passwordProtectionModal').modal('show'); + } + } else { + // Revert the change if update failed + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: response.data.error_message || 'Failed to update setting.', + type: 'error' + }); + } + }).catch(function(error) { + // Revert the change on error + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: 'Connection failed while updating setting.', + type: 'error' + }); + }); + }; + + $scope.UpdateWPSettings = function(wp) { + $('#wordpresshomeloading').show(); + + var url = "/websites/UpdateWPSettings"; + var data = {}; + + if (wp.setting === "PasswordProtection") { + data = { + wpID: wp.id, + setting: wp.setting, + PPUsername: wp.PPUsername, + PPPassword: wp.PPPassword + }; } + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken'), + 'Content-Type': 'application/x-www-form-urlencoded' + }, + transformRequest: function(obj) { + var str = []; + for(var p in obj) + str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); + return str.join("&"); + } + }; + $http.post(url, data, config).then(function(response) { + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Updated!', + type: 'success' + }); + if (wp.setting === "PasswordProtection") { + location.reload(); + } + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + if (wp.setting === "PasswordProtection") { + location.reload(); + } + } + }, function(error) { + $('#wordpresshomeloading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + }); + }; + + $scope.togglePasswordProtection = function(wp) { + console.log('togglePasswordProtection called for:', wp); + console.log('Current password protection state:', wp.passwordProtection); + + if (wp.passwordProtection) { + // Show modal for credentials + console.log('Showing modal for credentials'); + wp.PPUsername = ""; + wp.PPPassword = ""; + $scope.currentWP = wp; + console.log('Current WP set to:', $scope.currentWP); + $('#passwordProtectionModal').modal('show'); + } else { + // Disable password protection + console.log('Disabling password protection'); + var data = { + siteId: wp.id, + setting: 'password-protection', + value: 0 + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + console.log('Sending request with data:', data); + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + console.log('Received response:', response); + if (!response.data.status) { + wp.passwordProtection = !wp.passwordProtection; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message || 'Failed to disable password protection', + type: 'error' + }); + } else { + new PNotify({ + title: 'Success!', + text: 'Password protection disabled successfully.', + type: 'success' + }); + } + }).catch(function(error) { + console.error('Request failed:', error); + wp.passwordProtection = !wp.passwordProtection; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server.', + type: 'error' + }); + }); + } + }; + + $scope.submitPasswordProtection = function() { + console.log('submitPasswordProtection called'); + console.log('Current WP:', $scope.currentWP); + + if (!$scope.currentWP) { + console.error('No WordPress site selected'); + new PNotify({ + title: 'Error!', + text: 'No WordPress site selected.', + type: 'error' + }); + return; + } + + if (!$scope.currentWP.PPUsername || !$scope.currentWP.PPPassword) { + console.error('Missing username or password'); + new PNotify({ + title: 'Error!', + text: 'Please provide both username and password', + type: 'error' + }); + return; + } + + var data = { + siteId: $scope.currentWP.id, + setting: 'password-protection', + value: 1, + username: $scope.currentWP.PPUsername, + password: $scope.currentWP.PPPassword + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + console.log('Sending request with data:', data); + $('#passwordProtectionModal').modal('hide'); + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + console.log('Received response:', response); + if (response.data.status) { + new PNotify({ + title: 'Success!', + text: 'Password protection enabled successfully!', + type: 'success' + }); + } else { + $scope.currentWP.passwordProtection = false; + new PNotify({ + title: 'Error!', + text: response.data.error_message || 'Failed to enable password protection', + type: 'error' + }); + } + }).catch(function(error) { + console.error('Request failed:', error); + $scope.currentWP.passwordProtection = false; + new PNotify({ + title: 'Error!', + text: 'Could not connect to server', + type: 'error' + }); + }); }; - $scope.getFurtherWebsitesFromDB(); $scope.cyberPanelLoading = true; @@ -337,8 +6592,7 @@ app.controller('listWebsites', function ($scope, $http, $window) { $scope.cyberPanelLoading = true; $scope.searchWebsites = function () { - - $scope.cyberPanelLoading = false; + $scope.loading = true; // Set loading to true when starting search var config = { headers: { @@ -352,13 +6606,8 @@ app.controller('listWebsites', function ($scope, $http, $window) { dataurl = "/websites/searchWebsites"; - $http.post(dataurl, data, config).then(ListInitialData, cantLoadInitialData); - - - function ListInitialData(response) { - $scope.cyberPanelLoading = true; + $http.post(dataurl, data, config).then(function(response) { if (response.data.listWebSiteStatus === 1) { - var finalData = JSON.parse(response.data.data); $scope.WebSitesList = finalData; $("#listFail").hide(); @@ -368,161 +6617,27 @@ app.controller('listWebsites', function ($scope, $http, $window) { text: response.data.error_message, type: 'error' }); - } - } - - function cantLoadInitialData(response) { - $scope.cyberPanelLoading = true; + $scope.loading = false; // Set loading to false when done + }).catch(function(error) { new PNotify({ title: 'Operation Failed!', text: 'Connect disrupted, refresh the page.', type: 'error' }); - } - - - }; - - $scope.getFullUrl = function(url) { - console.log('getFullUrl called with:', url); - if (!url) { - // If no URL is provided, try to use the domain - if (this.wp && this.wp.domain) { - url = this.wp.domain; - } else { - return ''; - } - } - if (url.startsWith('http://') || url.startsWith('https://')) { - return url; - } - return 'https://' + url; - }; - - $scope.showWPSites = function(domain) { - var site = $scope.WebSitesList.find(function(site) { - return site.domain === domain; + $scope.loading = false; // Set loading to false on error }); - if (site) { - site.showWPSites = !site.showWPSites; - if (site.showWPSites && (!site.wp_sites || !site.wp_sites.length)) { - // Fetch WordPress sites if not already loaded - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - var data = { domain: domain }; - site.loadingWPSites = true; - $http.post('/websites/getWordPressSites', data, config).then( - function(response) { - site.loadingWPSites = false; - if (response.data.status === 1) { - site.wp_sites = response.data.sites; - site.wp_sites.forEach(function(wp) { - // Ensure each WP site has a URL - if (!wp.url) { - wp.url = wp.domain || domain; - } - fetchWPSiteData(wp); - }); - } else { - new PNotify({ - title: 'Error!', - text: response.data.error_message || 'Could not fetch WordPress sites', - type: 'error' - }); - } - }, - function(response) { - site.loadingWPSites = false; - new PNotify({ - title: 'Error!', - text: 'Could not connect to server', - type: 'error' - }); - } - ); - } - } }; - function fetchWPSiteData(wp) { - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - var data = { WPid: wp.id }; - - // Fetch site data - $http.post('/websites/FetchWPdata', data, config).then( - function(response) { - if (response.data.status === 1) { - var data = response.data.ret_data; - wp.version = data.version; - wp.phpVersion = data.phpVersion || 'PHP 7.4'; - wp.searchIndex = data.searchIndex === 1; - wp.debugging = data.debugging === 1; - wp.passwordProtection = data.passwordprotection === 1; - wp.maintenanceMode = data.maintenanceMode === 1; - fetchPluginData(wp); - fetchThemeData(wp); - } - } - ); - } + $scope.ScanWordpressSite = function () { - function fetchPluginData(wp) { - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - var data = { WPid: wp.id }; - $http.post('/websites/GetCurrentPlugins', data, config).then( - function(response) { - if (response.data.status === 1) { - var plugins = JSON.parse(response.data.plugins); - wp.activePlugins = plugins.filter(function(p) { return p.status === 'active'; }).length; - wp.totalPlugins = plugins.length; - } - } - ); - } + $('#cyberPanelLoading').show(); - function fetchThemeData(wp) { - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - var data = { WPid: wp.id }; - $http.post('/websites/GetCurrentThemes', data, config).then( - function(response) { - if (response.data.status === 1) { - var themes = JSON.parse(response.data.themes); - wp.theme = themes.find(function(t) { return t.status === 'active'; }).name; - wp.totalThemes = themes.length; - } - } - ); - } - $scope.updateSetting = function(wp, setting) { - var settingMap = { - 'search-indexing': 'searchIndex', - 'debugging': 'debugging', - 'password-protection': 'passwordProtection', - 'maintenance-mode': 'maintenanceMode' - }; + var url = "/websites/ScanWordpressSite"; + + var data = {} - var data = { - siteId: wp.id, - setting: setting, - value: wp[settingMap[setting]] ? 1 : 0 - }; var config = { headers: { @@ -530,97 +6645,45 @@ app.controller('listWebsites', function ($scope, $http, $window) { } }; - $http.post('/websites/UpdateWPSettings', data, config).then( - function(response) { - if (!response.data.status) { - wp[settingMap[setting]] = !wp[settingMap[setting]]; - new PNotify({ - title: 'Operation Failed!', - text: response.data.error_message || 'Unknown error', - type: 'error' - }); - } else { - new PNotify({ - title: 'Success!', - text: 'Setting updated successfully.', - type: 'success' - }); - } - }, - function(response) { - wp[settingMap[setting]] = !wp[settingMap[setting]]; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + $('#cyberPanelLoading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + } else { new PNotify({ title: 'Operation Failed!', - text: 'Could not connect to server, please try again.', + text: response.data.error_message, type: 'error' }); + } - ); - }; - $scope.wpLogin = function(wpId) { - window.open('/websites/AutoLogin?id=' + wpId, '_blank'); - }; - - $scope.manageWP = function(wpId) { - window.location.href = '/websites/WPHome?ID=' + wpId; - }; - - $scope.deleteWPSite = function(wp) { - if (confirm('Are you sure you want to delete this WordPress site? This action cannot be undone.')) { - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - var data = { - wpid: wp.id, - domain: wp.domain - }; - - $http.post('/websites/deleteWordPressSite', data, config).then( - function(response) { - if (response.data.status === 1) { - // Remove the WP site from the list - var site = $scope.WebSitesList.find(function(site) { - return site.domain === wp.domain; - }); - if (site && site.wp_sites) { - site.wp_sites = site.wp_sites.filter(function(wpSite) { - return wpSite.id !== wp.id; - }); - } - new PNotify({ - title: 'Success!', - text: 'WordPress site deleted successfully.', - type: 'success' - }); - } else { - new PNotify({ - title: 'Error!', - text: response.data.error_message || 'Could not delete WordPress site', - type: 'error' - }); - } - }, - function(response) { - new PNotify({ - title: 'Error!', - text: 'Could not connect to server', - type: 'error' - }); - } - ); } - }; - $scope.visitSite = function(wp) { - var url = wp.url || wp.domain; - if (!url) return ''; - if (url.startsWith('http://') || url.startsWith('https://')) { - return url; + function cantLoadInitialDatas(response) { + $('#cyberPanelLoading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } - return 'https://' + url; + + }; }); @@ -938,8 +7001,3606 @@ app.controller('listChildDomainsMain', function ($scope, $http, $timeout) { } + var DeleteDomain; - $scope.deleteDomainInit = function (childDomainForDeletion){ + $scope.DeleteDocRoot = false; + $scope.deleteDomainInit = function (childDomainForDeletion) { + DeleteDomain = childDomainForDeletion; + $scope.DeleteDocRoot = false; + }; + + $scope.deleteChildDomain = function () { + console.log("Delete child domain called for:", DeleteDomain); + console.log("Delete doc root:", $scope.DeleteDocRoot); + + $scope.cyberPanelLoading = false; + url = "/websites/submitDomainDeletion"; + + var data = { + websiteName: DeleteDomain, + DeleteDocRoot: $scope.DeleteDocRoot + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + console.log("Sending delete request with data:", data); + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + console.log("Delete response received:", response.data); + $scope.cyberPanelLoading = true; + if (response.data.websiteDeleteStatus === 1) { + console.log("Delete successful"); + new PNotify({ + title: 'Success!', + text: 'Child Domain successfully deleted.', + type: 'success' + }); + $('#DeleteChild').modal('hide'); + $('.modal-backdrop').remove(); + $scope.DeleteDocRoot = false; + $scope.getFurtherWebsitesFromDB(); + } else { + console.log("Delete failed:", response.data.error_message); + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + console.log("Delete request failed:", response); + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + + } + + }; + +}); + +/* Java script code to list accounts ends here */ + + +/* Java script code to delete Website */ + + +$("#websiteDeleteFailure").hide(); +$("#websiteDeleteSuccess").hide(); + +$("#deleteWebsiteButton").hide(); +$("#deleteLoading").hide(); + +app.controller('deleteWebsiteControl', function ($scope, $http) { + + + $scope.deleteWebsite = function () { + + $("#deleteWebsiteButton").fadeIn(); + + + }; + + $scope.deleteWebsiteFinal = function () { + + $("#deleteLoading").show(); + + var websiteName = $scope.websiteToBeDeleted; + + + url = "/websites/submitWebsiteDeletion"; + + var data = { + websiteName: websiteName + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.websiteDeleteStatus === 0) { + $scope.errorMessage = response.data.error_message; + $("#websiteDeleteFailure").fadeIn(); + $("#websiteDeleteSuccess").hide(); + $("#deleteWebsiteButton").hide(); + + + $("#deleteLoading").hide(); + + } else { + $("#websiteDeleteFailure").hide(); + $("#websiteDeleteSuccess").fadeIn(); + $("#deleteWebsiteButton").hide(); + $scope.deletedWebsite = websiteName; + $("#deleteLoading").hide(); + + } + + + } + + function cantLoadInitialDatas(response) { + } + + + }; + +}); + + +/** + * Created by usman on 7/26/17. + */ +function getCookie(name) { + var cookieValue = null; + var t = document.cookie; + if (document.cookie && document.cookie !== '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) === (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; +} + + +var arry = [] + +function selectpluginJs(val) { + $('#mysearch').hide() + arry.push(val) + + // console.log(arry) + document.getElementById('selJS').innerHTML = ""; + + for (var i = 0; i < arry.length; i++) { + $('#selJS').show() + var mlm = ' ' + arry[i] + '    ' + $('#selJS').append(mlm) + } + + +} + + +var DeletePluginURL; + +function DeletePluginBuucket(url) { + DeletePluginURL = url; +} + +function FinalDeletePluginBuucket() { + window.location.href = DeletePluginURL; +} + +var SPVal; + +app.controller('WPAddNewPlugin', function ($scope, $http, $timeout, $window, $compile) { + $scope.webSiteCreationLoading = true; + + $scope.SearchPluginName = function (val) { + $scope.webSiteCreationLoading = false; + SPVal = val; + url = "/websites/SearchOnkeyupPlugin"; + + var searchcontent = $scope.searchcontent; + + + var data = { + pluginname: searchcontent + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.webSiteCreationLoading = true; + + if (response.data.status === 1) { + if (SPVal == 'add') { + $('#mysearch').show() + document.getElementById('mysearch').innerHTML = ""; + var res = response.data.plugns.plugins + // console.log(res); + for (i = 0; i <= res.length; i++) { + // + var tml = '
'; + $('#mysearch').append(tml); + } + } else if (SPVal == 'eidt') { + $('#mysearch').show() + document.getElementById('mysearch').innerHTML = ""; + var res = response.data.plugns.plugins + // console.log(res); + for (i = 0; i <= res.length; i++) { + // + var tml = '
'; + var temp = $compile(tml)($scope) + angular.element(document.getElementById('mysearch')).append(temp); + } + + } + + + } else { + + // $scope.errorMessage = response.data.error_message; + alert("Status not = 1: Error..." + response.data.error_message) + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + } + + $scope.AddNewplugin = function () { + + url = "/websites/AddNewpluginAjax"; + + var bucketname = $scope.PluginbucketName + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + var data = { + config: arry, + Name: bucketname + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Bucket created.', + type: 'success' + }); + location.reload(); + } else { + + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + } + + $scope.deletesPlgin = function (val) { + + url = "/websites/deletesPlgin"; + + + var data = { + pluginname: val, + pluginbBucketID: $('#pluginbID').html() + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + location.reload(); + + } else { + + // $scope.errorMessage = response.data.error_message; + alert("Status not = 1: Error..." + response.data.error_message) + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + + } + + $scope.Addplugin = function (slug) { + $('#mysearch').hide() + + url = "/websites/Addplugineidt"; + + + var data = { + pluginname: slug, + pluginbBucketID: $('#pluginbID').html() + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.status === 1) { + location.reload(); + + } else { + + // $scope.errorMessage = response.data.error_message; + alert("Status not = 1: Error..." + response.data.error_message) + } + + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + + + } + +}); + +var domain_check = 0; + +function checkbox_function() { + + var checkBox = document.getElementById("myCheck"); + // Get the output text + + + // If the checkbox is checked, display the output text + if (checkBox.checked == true) { + domain_check = 0; + document.getElementById('Test_Domain').style.display = "block"; + document.getElementById('Own_Domain').style.display = "none"; + + } else { + document.getElementById('Test_Domain').style.display = "none"; + document.getElementById('Own_Domain').style.display = "block"; + domain_check = 1; + } + + // alert(domain_check); +} + +app.controller('createWordpress', function ($scope, $http, $timeout, $compile, $window) { + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + // Password generation function + $scope.randomPassword = function(length) { + var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+"; + var password = ""; + for (var i = 0; i < length; i++) { + password += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return password; + }; + + // Initialize showPassword + $scope.showPassword = false; + + var statusFile; + + $scope.createWordPresssite = function () { + + $scope.webSiteCreationLoading = false; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + + $scope.currentStatus = "Starting creation.."; + + var apacheBackend = 0; + + if ($scope.apacheBackend === true) { + apacheBackend = 1; + } else { + apacheBackend = 0 + } + + var package = $scope.packageForWebsite; + var websiteOwner = $scope.websiteOwner; + var WPtitle = $scope.WPtitle; + + // if (domain_check == 0) { + // var Part2_domainNameCreate = document.getElementById('Part2_domainNameCreate').value; + // var domainNameCreate = document.getElementById('TestDomainNameCreate').value + Part2_domainNameCreate; + // } + // if (domain_check == 1) { + // + // var domainNameCreate = $scope.own_domainNameCreate; + // } + + var domainNameCreate = $scope.domainNameCreate; + + + var WPUsername = $scope.WPUsername; + var adminEmail = $scope.adminEmail; + var WPPassword = $scope.WPPassword; + var WPVersions = $scope.WPVersions; + var pluginbucket = $scope.pluginbucket; + var autoupdates = $scope.autoupdates; + var pluginupdates = $scope.pluginupdates; + var themeupdates = $scope.themeupdates; + + if (domain_check == 0) { + + var path = ""; + + } + if (domain_check = 1) { + + var path = $scope.installPath; + + } + + + var home = "1"; + + if (typeof path != 'undefined') { + home = "0"; + } + + //alert(domainNameCreate); + var data = { + + title: WPtitle, + domain: domainNameCreate, + WPVersion: WPVersions, + pluginbucket: pluginbucket, + adminUser: WPUsername, + Email: adminEmail, + PasswordByPass: WPPassword, + AutomaticUpdates: autoupdates, + Plugins: pluginupdates, + Themes: themeupdates, + websiteOwner: websiteOwner, + package: package, + home: home, + path: path, + apacheBackend: apacheBackend + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + var url = "/websites/submitWorpressCreation"; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.webSiteCreationLoading = true; + if (response.data.status === 1) { + statusFile = response.data.tempStatusPath; + getCreationStatus(); + + } else { + $scope.goBackDisable = false; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + + alert("Error..." + response) + + } + + }; + $scope.goBack = function () { + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; + + function getCreationStatus() { + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.abort === 1) { + + if (response.data.installStatus === 1) { + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $("#installProgress").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + } else { + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + } + + } else { + $scope.webSiteCreationLoading = false; + $("#installProgress").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + $timeout(getCreationStatus, 1000); + } + + } + + function cantLoadInitialDatas(response) { + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + } + + +}); + + +//........... delete wp list +var FurlDeleteWP; + +function DeleteWPNow(url) { + FurlDeleteWP = url; +} + +function FinalDeleteWPNow() { + window.location.href = FurlDeleteWP; +} + +var DeploytoProductionID; + +function DeployToProductionInitial(vall) { + DeploytoProductionID = vall; +} + +// Simplified staging domain input - checkbox functionality removed + +app.controller('WPsiteHome', function ($scope, $http, $timeout, $compile, $window) { + var CheckBoxpasssword = 0; + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.searchIndex = 0; + + $(document).ready(function () { + var checkstatus = document.getElementById("wordpresshome"); + if (checkstatus !== null) { + $scope.LoadWPdata(); + } + }); + + $scope.LoadWPdata = function () { + $scope.wordpresshomeloading = false; + $('#wordpresshomeloading').show(); + + var url = "/websites/FetchWPdata"; + + var data = { + WPid: $('#WPid').html(), + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(function(response) { + $scope.wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + $('#WPVersion').text(response.data.ret_data.version); + if (response.data.ret_data.lscache === 1) { + $('#lscache').prop('checked', true); + } + if (response.data.ret_data.debugging === 1) { + $('#debugging').prop('checked', true); + } + + // Set search index state + $scope.searchIndex = response.data.ret_data.searchIndex; + + if (response.data.ret_data.maintenanceMode === 1) { + $('#maintenanceMode').prop('checked', true); + } + if (response.data.ret_data.wpcron === 1) { + $('#wpcron').prop('checked', true); + } + if (response.data.ret_data.passwordprotection == 1) { + var dc = ''; + var mp = $compile(dc)($scope); + angular.element(document.getElementById('prsswdprodata')).append(mp); + CheckBoxpasssword = 1; + } else { + var dc = ''; + $('#prsswdprodata').append(dc); + CheckBoxpasssword = 0; + } + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + }, function(error) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + console.error('Failed to load WP data:', error); + }); + }; + + $scope.UpdateWPSettings = function (setting) { + $scope.wordpresshomeloading = false; + $('#wordpresshomeloading').show(); + + var url = "/websites/UpdateWPSettings"; + var data; + + if (setting === "PasswordProtection") { + data = { + WPid: $('#WPid').html(), + setting: setting, + PPUsername: CheckBoxpasssword == 0 ? $scope.PPUsername : '', + PPPassword: CheckBoxpasssword == 0 ? $scope.PPPassword : '' + }; + } else { + var settingValue; + if (setting === 'searchIndex') { + $scope.searchIndex = $scope.searchIndex === 1 ? 0 : 1; + settingValue = $scope.searchIndex; + } else { + settingValue = $('#' + setting).is(":checked") ? 1 : 0; + } + data = { + WPid: $('#WPid').html(), + setting: setting, + settingValue: settingValue + }; + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(function(response) { + $scope.wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Updated!', + type: 'success' + }); + if (setting === "PasswordProtection") { + location.reload(); + } + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + // Revert the change on error + if (setting === 'searchIndex') { + $scope.searchIndex = $scope.searchIndex === 1 ? 0 : 1; + } + if (setting === "PasswordProtection") { + location.reload(); + } + } + }, function(error) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + // Revert the change on error + if (setting === 'searchIndex') { + $scope.searchIndex = $scope.searchIndex === 1 ? 0 : 1; + } + console.error('Failed to update setting:', error); + }); + }; + + $scope.GetCurrentPlugins = function () { + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + + var url = "/websites/GetCurrentPlugins"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + $('#PluginBody').html(''); + var plugins = JSON.parse(response.data.plugins); + plugins.forEach(AddPlugins); + + } else { + alert("Error:" + response.data.error_message) + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + }; + + $scope.GetCurrentThemes = function () { + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + + var url = "/websites/GetCurrentThemes"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + + $('#ThemeBody').html(''); + var themes = JSON.parse(response.data.themes); + themes.forEach(AddThemes); + + } else { + alert("Error:" + response.data.error_message) + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.webSiteCreationLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + }; + + $scope.UpdatePlugins = function (plugin) { + $('#wordpresshomeloading').show(); + var data = { + plugin: plugin, + pluginarray: PluginsList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/UpdatePlugins"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Updating Plugins in Background!.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + + }; + + $scope.DeletePlugins = function (plugin) { + $('#wordpresshomeloading').show(); + var data = { + plugin: plugin, + pluginarray: PluginsList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/DeletePlugins"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Deleting Plugin in Background!', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + } + + $scope.ChangeStatus = function (plugin) { + $('#wordpresshomeloading').show(); + var data = { + plugin: plugin, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/ChangeStatus"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Changed Plugin state Successfully !.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + } + + function AddPlugins(value, index, array) { + var FinalMarkup = '' + FinalMarkup = FinalMarkup + ''; + for (let x in value) { + if (x === 'status') { + if (value[x] === 'inactive') { + FinalMarkup = FinalMarkup + '
'; + } else { + FinalMarkup = FinalMarkup + '
'; + } + } else if (x === 'update') { + if (value[x] === 'none') { + FinalMarkup = FinalMarkup + 'Upto Date'; + } else { + FinalMarkup = FinalMarkup + ''; + } + } else { + FinalMarkup = FinalMarkup + '' + value[x] + ""; + } + } + FinalMarkup = FinalMarkup + '' + FinalMarkup = FinalMarkup + '' + var temp = $compile(FinalMarkup)($scope) + AppendToTable('#PluginBody', temp) + } + + $scope.UpdateThemes = function (theme) { + $('#wordpresshomeloading').show(); + var data = { + Theme: theme, + Themearray: ThemesList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/UpdateThemes"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Updating Theme in background !.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + + }; + + $scope.DeleteThemes = function (theme) { + $('#wordpresshomeloading').show(); + var data = { + Theme: theme, + Themearray: ThemesList, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/DeleteThemes"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Deleting Theme in Background!.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + }; + + $scope.ChangeStatusThemes = function (theme) { + $('#wordpresshomeloading').show(); + var data = { + theme: theme, + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/StatusThemes"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Change Theme state in Bsckground!.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + }; + + function AddThemes(value, index, array) { + var FinalMarkup = '' + FinalMarkup = FinalMarkup + ''; + for (let x in value) { + if (x === 'status') { + if (value[x] === 'inactive') { + FinalMarkup = FinalMarkup + '
'; + } else { + FinalMarkup = FinalMarkup + '
'; + } + } else if (x === 'update') { + if (value[x] === 'none') { + FinalMarkup = FinalMarkup + 'Upto Date'; + } else { + FinalMarkup = FinalMarkup + ''; + } + } else { + FinalMarkup = FinalMarkup + '' + value[x] + ""; + } + } + FinalMarkup = FinalMarkup + '' + FinalMarkup = FinalMarkup + '' + var temp = $compile(FinalMarkup)($scope) + AppendToTable('#ThemeBody', temp) + } + + $scope.CreateStagingNow = function () { + $('#wordpresshomeloading').show(); + $('#stagingStatus').html(' Starting staging site creation...'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', true).html(' Creating Staging Site...'); + + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + + $scope.currentStatus = "Starting creation Staging.."; + + // Get the staging domain from the simplified input + var domainNameCreate = $('#stagingDomainName').val() || $scope.stagingDomainName; + var data = { + StagingName: $('#stagingName').val(), + StagingDomain: domainNameCreate, + WPid: $('#WPid').html(), + } + var url = "/websites/CreateStagingNow"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + if (response.data.status === 1) { + statusFile = response.data.tempStatusPath; + getCreationStatus(); + } else { + $('#stagingStatus').html(' ' + response.data.error_message + ''); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#stagingStatus').html(' Could not connect to server'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + $scope.wordpresshomeloading = true; + alert(response) + + } + }; + + function getCreationStatus() { + $('#wordpresshomeloading').show(); + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + //$('#wordpresshomeloading').hide(); + + if (response.data.abort === 1) { + if (response.data.installStatus === 1) { + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + + $("#installProgress").css("width", "100%"); + $("#installProgressbackup").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + + } else { + $('#wordpresshomeloading').hide(); + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $("#installProgressbackup").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + // Re-enable buttons on error + $('#createbackupbutton').prop('disabled', false).html(' Create Backup'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + + // Show error status + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(' ' + response.data.error_message + ''); + } else { + $('#stagingStatus').html(' ' + response.data.error_message + ''); + } + + + } + + } else { + + $("#installProgress").css("width", response.data.installationProgress + "%"); + $("#installProgressbackup").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + + // Update status displays with progress + var statusHtml = ' ' + response.data.currentStatus; + if (response.data.installationProgress) { + statusHtml += ' (' + response.data.installationProgress + '%)'; + } + + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(statusHtml); + } else { + $('#stagingStatus').html(statusHtml); + } + + $timeout(getCreationStatus, 1000); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#createBackupBtn').prop('disabled', false).html(' Create Backup'); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + } + + $scope.goBack = function () { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; + + $scope.fetchstaging = function () { + + // Ensure DOM is ready + $timeout(function() { + // Check if the staging table exists + if ($('#StagingBody').length === 0) { + console.error('StagingBody table not found in DOM'); + return; + } + + $('#wordpresshomeloading').show(); + $scope.wordpresshomeloading = false; + + var url = "/websites/fetchstaging"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + + // $('#ThemeBody').html(''); + // var themes = JSON.parse(response.data.themes); + // themes.forEach(AddThemes); + + $('#StagingBody').html(''); + console.log('Staging response:', response.data); + + try { + var staging = JSON.parse(response.data.wpsites); + console.log('Parsed staging data:', staging); + + if (staging && staging.length > 0) { + staging.forEach(function(site, index) { + console.log('Processing staging site ' + index + ':', site); + AddStagings(site, index, staging); + }); + } else { + $('#StagingBody').html('No staging sites found'); + } + } catch (e) { + console.error('Error parsing staging data:', e); + $('#StagingBody').html('Error loading staging sites'); + } + + } else { + console.error("Error from server:", response.data.error_message); + $('#StagingBody').html('Error: ' + response.data.error_message + ''); + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + console.error("Request failed:", response); + $('#StagingBody').html('Failed to load staging sites'); + } + }, 100); // Small delay to ensure DOM is ready + + }; + + $scope.fetchDatabase = function () { + + $('#wordpresshomeloading').show(); + $scope.wordpresshomeloading = false; + + var url = "/websites/fetchDatabase"; + + var data = { + WPid: $('#WPid').html(), + } + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + $('#DB_Name').html(response.data.DataBaseName); + $('#DB_User').html(response.data.DataBaseUser); + $('#tableprefix').html(response.data.tableprefix); + } else { + alert("Error data.error_message:" + response.data.error_message) + + } + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + alert("Error" + response) + + } + + }; + + $scope.SaveUpdateConfig = function () { + $('#wordpresshomeloading').show(); + var data = { + AutomaticUpdates: $('#AutomaticUpdates').find(":selected").text(), + Plugins: $('#Plugins').find(":selected").text(), + Themes: $('#Themes').find(":selected").text(), + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/SaveUpdateConfig"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Update Configurations Sucessfully!.', + type: 'success' + }); + $("#autoUpdateConfig").modal('hide'); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: response, + type: 'error' + }); + + } + }; + + function AddStagings(value, index, array) { + var stagingUrl = 'http://' + value.Domain; + var createdDate = new Date().toLocaleDateString(); + + var FinalMarkup = ''; + FinalMarkup += '' + value.name + ''; + FinalMarkup += '' + stagingUrl + ''; + FinalMarkup += '' + createdDate + ''; + FinalMarkup += ''; + FinalMarkup += ' '; + FinalMarkup += ''; + FinalMarkup += ''; + FinalMarkup += ''; + + console.log('Appending to #stagingListBody'); + if ($('#stagingListBody').length === 0) { + console.error('stagingListBody not found! Looking for StagingBody...'); + if ($('#StagingBody').length > 0) { + console.log('Found StagingBody, using that instead'); + $('#StagingBody').append(FinalMarkup); + } else { + console.error('Neither stagingListBody nor StagingBody found!'); + console.log('Available table bodies:', $('tbody').map(function() { return this.id; }).get()); + } + } else { + $('#stagingListBody').append(FinalMarkup); + } + console.log('Rows in table after append:', $('#stagingListBody').find('tr').length + ' in stagingListBody, ' + $('#StagingBody').find('tr').length + ' in StagingBody'); + } + + $scope.FinalDeployToProduction = function () { + + $('#wordpresshomeloading').show(); + + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + var data = { + WPid: $('#WPid').html(), + StagingID: DeploytoProductionID + } + + var url = "/websites/DeploytoProduction"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + + $('#wordpresshomeloading').hide(); + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Deploy To Production start!.', + type: 'success' + }); + statusFile = response.data.tempStatusPath; + getCreationStatus(); + + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: response, + type: 'error' + }); + + } + + }; + + + $scope.CreateBackup = function () { + $('#wordpresshomeloading').show(); + $('#createbackupbutton').prop('disabled', true).html(' Creating Backup...'); + + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.currentStatus = "Starting creation Backups.."; + var data = { + WPid: $('#WPid').html(), + Backuptype: $('#backuptype').val() + } + var url = "/websites/WPCreateBackup"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Creating Backups!.', + type: 'success' + }); + statusFile = response.data.tempStatusPath; + getCreationStatus(); + } else { + $('#createBackupBtn').prop('disabled', false).html(' Create Backup'); + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#createBackupBtn').prop('disabled', false).html(' Create Backup'); + alert(response) + + } + + }; + + + $scope.installwpcore = function () { + + $('#wordpresshomeloading').show(); + $('#wordpresshomeloadingsec').show(); + var data = { + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/installwpcore"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Results fetched..', + type: 'success' + }); + $('#SecurityResult').html(response.data.result); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + + }; + + $scope.dataintegrity = function () { + + $('#wordpresshomeloading').show(); + $('#wordpresshomeloadingsec').show(); + var data = { + WPid: $('#WPid').html(), + } + + $scope.wordpresshomeloading = false; + + var url = "/websites/dataintegrity"; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Results fetched', + type: 'success' + }); + $('#SecurityResult').html(response.data.result); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#wordpresshomeloadingsec').hide(); + $scope.wordpresshomeloading = true; + alert(response) + + } + }; + + $scope.updateSetting = function(site, setting) { + var settingMap = { + 'search-indexing': 'searchIndex', + 'debugging': 'debugging', + 'password-protection': 'passwordProtection', + 'maintenance-mode': 'maintenanceMode' + }; + + // Toggle the state before sending request + site[settingMap[setting]] = site[settingMap[setting]] === 1 ? 0 : 1; + + var data = { + siteId: site.id, + setting: setting, + value: site[settingMap[setting]] + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Setting updated successfully.', + type: 'success' + }); + if (setting === 'password-protection' && site[settingMap[setting]] === 1) { + // Show password protection modal if enabling + site.PPUsername = ""; + site.PPPassword = ""; + $scope.currentWP = site; + $('#passwordProtectionModal').modal('show'); + } + } else { + // Revert the change if update failed + site[settingMap[setting]] = site[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: response.data.error_message || 'Failed to update setting.', + type: 'error' + }); + } + }).catch(function(error) { + // Revert the change on error + site[settingMap[setting]] = site[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: 'Connection failed while updating setting.', + type: 'error' + }); + }); + }; + + $scope.submitPasswordProtection = function() { + console.log('submitPasswordProtection called'); + console.log('Current WP:', $scope.currentWP); + + if (!$scope.currentWP) { + console.error('No WordPress site selected'); + new PNotify({ + title: 'Error!', + text: 'No WordPress site selected.', + type: 'error' + }); + return; + } + + if (!$scope.currentWP.PPUsername || !$scope.currentWP.PPPassword) { + console.error('Missing username or password'); + new PNotify({ + title: 'Error!', + text: 'Please provide both username and password', + type: 'error' + }); + return; + } + + var data = { + siteId: $scope.currentWP.id, + setting: 'password-protection', + value: 1, + username: $scope.currentWP.PPUsername, + password: $scope.currentWP.PPPassword + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + console.log('Sending request with data:', data); + $('#passwordProtectionModal').modal('hide'); + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + console.log('Received response:', response); + if (response.data.status) { + new PNotify({ + title: 'Success!', + text: 'Password protection enabled successfully!', + type: 'success' + }); + } else { + $scope.currentWP.passwordProtection = false; + new PNotify({ + title: 'Error!', + text: response.data.error_message || 'Failed to enable password protection', + type: 'error' + }); + } + }).catch(function(error) { + console.error('Request failed:', error); + $scope.currentWP.passwordProtection = false; + new PNotify({ + title: 'Error!', + text: 'Could not connect to server', + type: 'error' + }); + }); + }; + +}); + + +var PluginsList = []; + + +function AddPluginToArray(cBox, name) { + if (cBox.checked) { + PluginsList.push(name); + // alert(PluginsList); + } else { + const index = PluginsList.indexOf(name); + if (index > -1) { + PluginsList.splice(index, 1); + } + // alert(PluginsList); + } +} + +var ThemesList = []; + +function AddThemeToArray(cBox, name) { + if (cBox.checked) { + ThemesList.push(name); + // alert(ThemesList); + } else { + const index = ThemesList.indexOf(name); + if (index > -1) { + ThemesList.splice(index, 1); + } + // alert(ThemesList); + } +} + + +function AppendToTable(table, markup) { + $(table).append(markup); +} + + +//..................Restore Backup Home + + +app.controller('RestoreWPBackup', function ($scope, $http, $timeout, $window) { + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + + $scope.checkmethode = function () { + var val = $('#RestoreMethode').children("option:selected").val(); + if (val == 1) { + $('#Newsitediv').show(); + $('#exinstingsitediv').hide(); + } else if (val == 0) { + $('#exinstingsitediv').show(); + $('#Newsitediv').hide(); + } else { + + } + }; + + + $scope.RestoreWPbackupNow = function () { + $('#wordpresshomeloading').show(); + $scope.wordpresshomeloading = false; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.currentStatus = "Start Restoring WordPress.."; + + var Domain = $('#wprestoresubdirdomain').val() + var path = $('#wprestoresubdirpath').val(); + var home = "1"; + + if (typeof path != 'undefined' || path != '') { + home = "0"; + } + if (typeof path == 'undefined') { + path = ""; + } + + + var backuptype = $('#backuptype').html(); + var data; + if (backuptype == "DataBase Backup") { + data = { + backupid: $('#backupid').html(), + DesSite: $('#DesSite').children("option:selected").val(), + Domain: '', + path: path, + home: home, + } + } else { + data = { + backupid: $('#backupid').html(), + DesSite: $('#DesSite').children("option:selected").val(), + Domain: Domain, + path: path, + home: home, + } + + } + + var url = "/websites/RestoreWPbackupNow"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + // console.log(data) + + var d = $('#DesSite').children("option:selected").val(); + var c = $("input[name=Newdomain]").val(); + // if (d == -1 || c == "") { + // alert("Please Select Method of Backup Restore"); + // } else { + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + // } + + + function ListInitialDatas(response) { + wordpresshomeloading = true; + $('#wordpresshomeloading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Restoring process starts!.', + type: 'success' + }); + statusFile = response.data.tempStatusPath; + getCreationStatus(); + + } else { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + } + + function getCreationStatus() { + $('#wordpresshomeloading').show(); + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + if (response.data.abort === 1) { + $('#wordpresshomeloading').hide(); + + if (response.data.installStatus === 1) { + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $("#installProgress").css("width", "100%"); + $("#installProgressbackup").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + // Re-enable buttons + $('#createbackupbutton').prop('disabled', false).html(' Create Backup'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + + // For backup operations, refresh the backup list + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(' Backup created successfully!'); + if (typeof window.fetchBackupList === 'function') { + window.fetchBackupList(); + } + // Clear status after 5 seconds + setTimeout(function() { + $('#backupStatus').text(''); + }, 5000); + } + // For staging operations, refresh the staging list + else { + $('#stagingStatus').html(' Staging site created successfully!'); + $scope.fetchstaging(); + // Clear status after 5 seconds + setTimeout(function() { + $('#stagingStatus').text(''); + }, 5000); + } + + + } else { + $('#wordpresshomeloading').hide(); + + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $("#installProgressbackup").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + // Re-enable buttons on error + $('#createbackupbutton').prop('disabled', false).html(' Create Backup'); + $('button[ng-click="CreateStagingNow()"]').prop('disabled', false).html(' Create Staging Site'); + + // Show error status + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(' ' + response.data.error_message + ''); + } else { + $('#stagingStatus').html(' ' + response.data.error_message + ''); + } + + + } + + } else { + + $("#installProgress").css("width", response.data.installationProgress + "%"); + $("#installProgressbackup").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + + // Update status displays with progress + var statusHtml = ' ' + response.data.currentStatus; + if (response.data.installationProgress) { + statusHtml += ' (' + response.data.installationProgress + '%)'; + } + + if (statusFile && statusFile.includes('backup')) { + $('#backupStatus').html(statusHtml); + } else { + $('#stagingStatus').html(statusHtml); + } + + $timeout(getCreationStatus, 1000); + + } + + } + + function cantLoadInitialDatas(response) { + $('#wordpresshomeloading').hide(); + $('#createBackupBtn').prop('disabled', false).html(' Create Backup'); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + } + + $scope.goBack = function () { + $('#wordpresshomeloading').hide(); + $scope.wordpresshomeloading = true; + $scope.stagingDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; +}); + + +//.......................................Remote Backup + +//........... delete DeleteBackupConfigNow + +function DeleteBackupConfigNow(url) { + window.location.href = url; +} + +function DeleteRemoteBackupsiteNow(url) { + window.location.href = url; +} + +function DeleteBackupfileConfigNow(url) { + window.location.href = url; +} + + +app.controller('RemoteBackupConfig', function ($scope, $http, $timeout, $window) { + $scope.RemoteBackupLoading = true; + $scope.SFTPBackUpdiv = true; + + $scope.EndpointURLdiv = true; + $scope.Selectprovider = true; + $scope.S3keyNamediv = true; + $scope.Accesskeydiv = true; + $scope.SecretKeydiv = true; + $scope.SelectRemoteBackuptype = function () { + var val = $scope.RemoteBackuptype; + if (val == "SFTP") { + $scope.SFTPBackUpdiv = false; + $scope.EndpointURLdiv = true; + $scope.Selectprovider = true; + $scope.S3keyNamediv = true; + $scope.Accesskeydiv = true; + $scope.SecretKeydiv = true; + } else if (val == "S3") { + $scope.EndpointURLdiv = true; + $scope.Selectprovider = false; + $scope.S3keyNamediv = false; + $scope.Accesskeydiv = false; + $scope.SecretKeydiv = false; + $scope.SFTPBackUpdiv = true; + } else { + $scope.RemoteBackupLoading = true; + $scope.SFTPBackUpdiv = true; + + $scope.EndpointURLdiv = true; + $scope.Selectprovider = true; + $scope.S3keyNamediv = true; + $scope.Accesskeydiv = true; + $scope.SecretKeydiv = true; + } + } + + $scope.SelectProvidertype = function () { + $scope.EndpointURLdiv = true; + var provider = $scope.Providervalue + if (provider == 'Backblaze') { + $scope.EndpointURLdiv = false; + } else { + $scope.EndpointURLdiv = true; + } + } + + $scope.SaveBackupConfig = function () { + $scope.RemoteBackupLoading = false; + var Hname = $scope.Hostname; + var Uname = $scope.Username; + var Passwd = $scope.Password; + var path = $scope.path; + var type = $scope.RemoteBackuptype; + var Providervalue = $scope.Providervalue; + var data; + if (type == "SFTP") { + + data = { + Hname: Hname, + Uname: Uname, + Passwd: Passwd, + path: path, + type: type + } + } else if (type == "S3") { + if (Providervalue == "Backblaze") { + data = { + S3keyname: $scope.S3keyName, + Provider: Providervalue, + AccessKey: $scope.Accesskey, + SecertKey: $scope.SecretKey, + EndUrl: $scope.EndpointURL, + type: type + } + } else { + data = { + S3keyname: $scope.S3keyName, + Provider: Providervalue, + AccessKey: $scope.Accesskey, + SecertKey: $scope.SecretKey, + type: type + } + + } + + } + var url = "/websites/SaveBackupConfig"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + } + +}); + +var UpdatescheduleID; +app.controller('BackupSchedule', function ($scope, $http, $timeout, $window) { + $scope.BackupScheduleLoading = true; + $scope.SaveBackupSchedule = function () { + $scope.RemoteBackupLoading = false; + var FileRetention = $scope.Fretention; + var Backfrequency = $scope.Bfrequency; + + + var data = { + FileRetention: FileRetention, + Backfrequency: Backfrequency, + ScheduleName: $scope.ScheduleName, + RemoteConfigID: $('#RemoteConfigID').html(), + BackupType: $scope.BackupType + } + var url = "/websites/SaveBackupSchedule"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + }; + + + $scope.getupdateid = function (ID) { + UpdatescheduleID = ID; + } + + $scope.UpdateRemoteschedules = function () { + $scope.RemoteBackupLoading = false; + var Frequency = $scope.RemoteFrequency; + var fretention = $scope.RemoteFileretention; + + var data = { + ScheduleID: UpdatescheduleID, + Frequency: Frequency, + FileRetention: fretention + } + var url = "/websites/UpdateRemoteschedules"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Updated!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + }; + + $scope.AddWPsiteforRemoteBackup = function () { + $scope.RemoteBackupLoading = false; + + + var data = { + WpsiteID: $('#Wpsite').val(), + RemoteScheduleID: $('#RemoteScheduleID').html() + } + var url = "/websites/AddWPsiteforRemoteBackup"; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.RemoteBackupLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + + } else { + new PNotify({ + title: 'Error!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.RemoteBackupLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + }; +}); +/* Java script code to create account */ + +var website_create_domain_check = 0; + +function website_create_checkbox_function() { + + var checkBox = document.getElementById("myCheck"); + // Get the output text + + + // If the checkbox is checked, display the output text + if (checkBox.checked == true) { + website_create_domain_check = 0; + document.getElementById('Website_Create_Test_Domain').style.display = "block"; + document.getElementById('Website_Create_Own_Domain').style.display = "none"; + + } else { + document.getElementById('Website_Create_Test_Domain').style.display = "none"; + document.getElementById('Website_Create_Own_Domain').style.display = "block"; + website_create_domain_check = 1; + } + + // alert(domain_check); +} + + +/* Java script code to create account ends here */ + +/* Java script code to list accounts */ + +$("#listFail").hide(); + + +app.controller('listWebsites', function ($scope, $http, $window) { + $scope.web = {}; + $scope.WebSitesList = []; + $scope.loading = true; // Add loading state + $scope.expandedSites = {}; // Track which sites are expanded + + $scope.currentPage = 1; + $scope.recordsToShow = 10; + + // Function to toggle site expansion + $scope.toggleSite = function(site) { + if (!$scope.expandedSites[site.domain]) { + $scope.expandedSites[site.domain] = true; + site.loading = true; + // You can add any data fetching logic here if needed + setTimeout(function() { + site.loading = false; + $scope.$apply(); + }, 500); + } else { + $scope.expandedSites[site.domain] = false; + } + }; + + // Function to check if site is expanded + $scope.isExpanded = function(siteId) { + return $scope.expandedSites[siteId]; + }; + + // Function to check if site data is loaded + $scope.isDataLoaded = function(site) { + return site.version !== undefined; + }; + + // Function to get SSL tooltip text + $scope.getSslTooltip = function(web) { + if (!web.ssl) return ''; + + var tooltip = ''; + if (web.ssl.issuer && web.ssl.issuer !== '') { + tooltip += 'Issuer: ' + web.ssl.issuer; + } + + if (web.ssl.days !== undefined) { + if (tooltip) tooltip += ' | '; + if (web.ssl.days < 0) { + tooltip += 'Expired ' + Math.abs(web.ssl.days) + ' days ago'; + } else { + tooltip += 'Valid for ' + web.ssl.days + ' days'; + } + } + + if (web.ssl.is_wildcard) { + if (tooltip) tooltip += ' | '; + tooltip += 'Wildcard Certificate'; + } + + if (web.ssl.status === 'none') { + tooltip = 'No SSL certificate installed. Click "Issue SSL" to secure this site.'; + } else if (web.ssl.status === 'self-signed') { + tooltip = 'Self-signed certificate detected. Not trusted by browsers.'; + } + + return tooltip; + }; + + // Initial fetch of websites + $scope.getFurtherWebsitesFromDB = function () { + $scope.loading = true; // Set loading to true when starting fetch + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + page: $scope.currentPage, + recordsToShow: $scope.recordsToShow + }; + + var dataurl = "/websites/fetchWebsitesList"; + + $http.post(dataurl, data, config).then(function(response) { + if (response.data.listWebSiteStatus === 1) { + $scope.WebSitesList = JSON.parse(response.data.data); + $scope.pagination = response.data.pagination; + $("#listFail").hide(); + // Expand the first site by default + if ($scope.WebSitesList.length > 0) { + $scope.expandedSites[$scope.WebSitesList[0].domain] = true; + } + } else { + $("#listFail").fadeIn(); + $scope.errorMessage = response.data.error_message; + } + $scope.loading = false; // Set loading to false when done + }).catch(function(error) { + $("#listFail").fadeIn(); + $scope.errorMessage = error.message || 'An error occurred while fetching websites'; + $scope.loading = false; // Set loading to false on error + }); + }; + + // Call it immediately + $scope.getFurtherWebsitesFromDB(); + + $scope.showWPSites = function(domain) { + console.log('showWPSites called for domain:', domain); + + // Make sure domain is defined + if (!domain) { + console.error('Domain is undefined'); + return; + } + + // Find the website in the list + var site = $scope.WebSitesList.find(function(website) { + return website.domain === domain; + }); + + if (!site) { + console.error('Website not found:', domain); + return; + } + + // Set loading state + site.loadingWPSites = true; + + // Toggle visibility + site.showWPSites = !site.showWPSites; + + // If we're hiding, just return + if (!site.showWPSites) { + site.loadingWPSites = false; + return; + } + + var config = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = $.param({ + domain: domain + }); + + $http.post('/websites/fetchWPDetails', data, config) + .then(function(response) { + console.log('Response received:', response); + if (response.data.status === 1 && response.data.fetchStatus === 1) { + site.wp_sites = response.data.sites || []; + // Initialize loading states for each WP site + site.wp_sites.forEach(function(wp) { + wp.loading = false; + wp.loadingPlugins = false; + wp.loadingTheme = false; + }); + $("#listFail").hide(); + } else { + $("#listFail").fadeIn(); + site.showWPSites = false; + $scope.errorMessage = response.data.error_message || 'Failed to fetch WordPress sites'; + console.error('Error in response:', response.data.error_message); + new PNotify({ + title: 'Error!', + text: response.data.error_message || 'Failed to fetch WordPress sites', + type: 'error' + }); + } + }) + .catch(function(error) { + console.error('Request failed:', error); + site.showWPSites = false; + $("#listFail").fadeIn(); + $scope.errorMessage = error.message || 'An error occurred while fetching WordPress sites'; + new PNotify({ + title: 'Error!', + text: error.message || 'Could not connect to server', + type: 'error' + }); + }) + .finally(function() { + site.loadingWPSites = false; + }); + }; + + $scope.visitSite = function(wp) { + var url = wp.url || wp.domain; + if (!url) return; + if (!url.startsWith('http://') && !url.startsWith('https://')) { + url = 'https://' + url; + } + window.open(url, '_blank'); + }; + + $scope.wpLogin = function(wpId) { + window.open('/websites/wpLogin?wpID=' + wpId, '_blank'); + }; + + $scope.manageWP = function(wpId) { + window.location.href = '/websites/WPHome?ID=' + wpId; + }; + + $scope.updateSetting = function(wp, setting) { + var settingMap = { + 'search-indexing': 'searchIndex', + 'debugging': 'debugging', + 'password-protection': 'passwordProtection', + 'maintenance-mode': 'maintenanceMode' + }; + + // Toggle the state before sending request + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + + var data = { + siteId: wp.id, + setting: setting, + value: wp[settingMap[setting]] + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Setting updated successfully.', + type: 'success' + }); + if (setting === 'password-protection' && wp[settingMap[setting]] === 1) { + // Show password protection modal if enabling + wp.PPUsername = ""; + wp.PPPassword = ""; + $scope.currentWP = wp; + $('#passwordProtectionModal').modal('show'); + } + } else { + // Revert the change if update failed + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: response.data.error_message || 'Failed to update setting.', + type: 'error' + }); + } + }).catch(function(error) { + // Revert the change on error + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: 'Connection failed while updating setting.', + type: 'error' + }); + }); + }; + + $scope.cyberPanelLoading = true; + + $scope.issueSSL = function (virtualHost) { + $scope.cyberPanelLoading = false; + + var url = "/manageSSL/issueSSL"; + + + var data = { + virtualHost: virtualHost + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.SSL === 1) { + new PNotify({ + title: 'Success!', + text: 'SSL successfully issued.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + + }; + + $scope.cyberPanelLoading = true; + + $scope.searchWebsites = function () { + $scope.loading = true; // Set loading to true when starting search + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + patternAdded: $scope.patternAdded + }; + + dataurl = "/websites/searchWebsites"; + + $http.post(dataurl, data, config).then(function(response) { + if (response.data.listWebSiteStatus === 1) { + var finalData = JSON.parse(response.data.data); + $scope.WebSitesList = finalData; + $("#listFail").hide(); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + $scope.loading = false; // Set loading to false when done + }).catch(function(error) { + new PNotify({ + title: 'Operation Failed!', + text: 'Connect disrupted, refresh the page.', + type: 'error' + }); + $scope.loading = false; // Set loading to false on error + }); + }; + + $scope.ScanWordpressSite = function () { + + $('#cyberPanelLoading').show(); + + + var url = "/websites/ScanWordpressSite"; + + var data = {} + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + $('#cyberPanelLoading').hide(); + + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Successfully Saved!.', + type: 'success' + }); + location.reload(); + + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + + } + + function cantLoadInitialDatas(response) { + $('#cyberPanelLoading').hide(); + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + + } + + + }; + + $scope.deleteWPSite = function(wp) { + if (confirm('Are you sure you want to delete this WordPress site? This action cannot be undone.')) { + window.location.href = '/websites/ListWPSites?DeleteID=' + wp.id; + } + }; + + $scope.togglePasswordProtection = function(wp) { + console.log('togglePasswordProtection called for:', wp); + console.log('Current password protection state:', wp.passwordProtection); + + if (wp.passwordProtection) { + // Show modal for credentials + console.log('Showing modal for credentials'); + wp.PPUsername = ""; + wp.PPPassword = ""; + $scope.currentWP = wp; + console.log('Current WP set to:', $scope.currentWP); + $('#passwordProtectionModal').modal('show'); + } else { + // Disable password protection + console.log('Disabling password protection'); + var data = { + siteId: wp.id, + setting: 'password-protection', + value: 0 + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + console.log('Sending request with data:', data); + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + console.log('Received response:', response); + if (!response.data.status) { + wp.passwordProtection = !wp.passwordProtection; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message || 'Failed to disable password protection', + type: 'error' + }); + } else { + new PNotify({ + title: 'Success!', + text: 'Password protection disabled successfully.', + type: 'success' + }); + } + }).catch(function(error) { + console.error('Request failed:', error); + wp.passwordProtection = !wp.passwordProtection; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server.', + type: 'error' + }); + }); + } + }; + + $scope.submitPasswordProtection = function() { + console.log('submitPasswordProtection called'); + console.log('Current WP:', $scope.currentWP); + + if (!$scope.currentWP) { + console.error('No WordPress site selected'); + new PNotify({ + title: 'Error!', + text: 'No WordPress site selected.', + type: 'error' + }); + return; + } + + if (!$scope.currentWP.PPUsername || !$scope.currentWP.PPPassword) { + console.error('Missing username or password'); + new PNotify({ + title: 'Error!', + text: 'Please provide both username and password', + type: 'error' + }); + return; + } + + var data = { + siteId: $scope.currentWP.id, + setting: 'password-protection', + value: 1, + username: $scope.currentWP.PPUsername, + password: $scope.currentWP.PPPassword + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + console.log('Sending request with data:', data); + $('#passwordProtectionModal').modal('hide'); + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + console.log('Received response:', response); + if (response.data.status) { + new PNotify({ + title: 'Success!', + text: 'Password protection enabled successfully!', + type: 'success' + }); + } else { + $scope.currentWP.passwordProtection = false; + new PNotify({ + title: 'Error!', + text: response.data.error_message || 'Failed to enable password protection', + type: 'error' + }); + } + }).catch(function(error) { + console.error('Request failed:', error); + $scope.currentWP.passwordProtection = false; + new PNotify({ + title: 'Error!', + text: 'Could not connect to server', + type: 'error' + }); + }); + }; + + $scope.goToManage = function($event, domain) { + $event.stopPropagation(); + window.location = '/websites/' + domain; + }; + + $scope.goToFileManager = function($event, domain) { + $event.stopPropagation(); + window.location = '/filemanager/' + domain; + }; + +}); + +app.controller('listChildDomainsMain', function ($scope, $http, $timeout) { + + $scope.currentPage = 1; + $scope.recordsToShow = 10; + + $scope.getFurtherWebsitesFromDB = function () { + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + page: $scope.currentPage, + recordsToShow: $scope.recordsToShow + }; + + + dataurl = "/websites/fetchChildDomainsMain"; + + $http.post(dataurl, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + if (response.data.listWebSiteStatus === 1) { + + $scope.WebSitesList = JSON.parse(response.data.data); + $scope.pagination = response.data.pagination; + $scope.clients = JSON.parse(response.data.data); + $("#listFail").hide(); + } else { + $("#listFail").fadeIn(); + $scope.errorMessage = response.data.error_message; + + } + } + + function cantLoadInitialData(response) { + } + + + }; + $scope.getFurtherWebsitesFromDB(); + + $scope.cyberPanelLoading = true; + + $scope.issueSSL = function (virtualHost) { + $scope.cyberPanelLoading = false; + + var url = "/manageSSL/issueSSL"; + + + var data = { + virtualHost: virtualHost + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + $scope.cyberPanelLoading = true; + if (response.data.SSL === 1) { + new PNotify({ + title: 'Success!', + text: 'SSL successfully issued.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + } + + + }; + + $scope.cyberPanelLoading = true; + + $scope.searchWebsites = function () { + + $scope.cyberPanelLoading = false; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + patternAdded: $scope.patternAdded + }; + + dataurl = "/websites/searchChilds"; + + $http.post(dataurl, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.cyberPanelLoading = true; + if (response.data.listWebSiteStatus === 1) { + + var finalData = JSON.parse(response.data.data); + $scope.WebSitesList = finalData; + $("#listFail").hide(); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + } + + function cantLoadInitialData(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Connect disrupted, refresh the page.', + type: 'error' + }); + } + + + }; + + $scope.initConvert = function (virtualHost) { + $scope.domainName = virtualHost; + }; + + var statusFile; + + $scope.installationProgress = true; + + $scope.convert = function () { + + $scope.cyberPanelLoading = false; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.goBackDisable = true; + + $scope.currentStatus = "Starting creation.."; + + var ssl, dkimCheck, openBasedir; + + if ($scope.sslCheck === true) { + ssl = 1; + } else { + ssl = 0 + } + + if ($scope.dkimCheck === true) { + dkimCheck = 1; + } else { + dkimCheck = 0 + } + + if ($scope.openBasedir === true) { + openBasedir = 1; + } else { + openBasedir = 0 + } + + url = "/websites/convertDomainToSite"; + + + var data = { + package: $scope.packageForWebsite, + domainName: $scope.domainName, + adminEmail: $scope.adminEmail, + phpSelection: $scope.phpSelection, + websiteOwner: $scope.websiteOwner, + ssl: ssl, + dkimCheck: dkimCheck, + openBasedir: openBasedir + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.createWebSiteStatus === 1) { + statusFile = response.data.tempStatusPath; + getCreationStatus(); + } else { + + $scope.cyberPanelLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.goBackDisable = false; + + $scope.currentStatus = response.data.error_message; + } + + + } + + function cantLoadInitialDatas(response) { + + $scope.cyberPanelLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.goBackDisable = false; + + } + + + }; + $scope.goBack = function () { + $scope.cyberPanelLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; + + function getCreationStatus() { + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.abort === 1) { + + if (response.data.installStatus === 1) { + + $scope.cyberPanelLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.goBackDisable = false; + + $("#installProgress").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + } else { + + $scope.cyberPanelLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.goBackDisable = false; + + $scope.currentStatus = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + } + + } else { + $("#installProgress").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + $timeout(getCreationStatus, 1000); + } + + } + + function cantLoadInitialDatas(response) { + + $scope.cyberPanelLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.goBackDisable = false; + + } + + + } + + var DeleteDomain; + $scope.deleteDomainInit = function (childDomainForDeletion) { DeleteDomain = childDomainForDeletion; }; @@ -1082,6 +10743,39 @@ $("#modifyWebsiteLoading").hide(); $("#modifyWebsiteButton").hide(); app.controller('modifyWebsitesController', function ($scope, $http) { + + // Initialize home directory variables + $scope.homeDirectories = []; + $scope.selectedHomeDirectory = ''; + $scope.selectedHomeDirectoryInfo = null; + $scope.currentHomeDirectory = ''; + + // Load home directories on page load + $scope.loadHomeDirectories = function() { + $http.post('/userManagement/getUserHomeDirectories/', {}) + .then(function(response) { + if (response.data.status === 1) { + $scope.homeDirectories = response.data.directories; + } + }) + .catch(function(error) { + console.error('Error loading home directories:', error); + }); + }; + + // Update home directory info when selection changes + $scope.updateHomeDirectoryInfo = function() { + if ($scope.selectedHomeDirectory) { + $scope.selectedHomeDirectoryInfo = $scope.homeDirectories.find(function(dir) { + return dir.id == $scope.selectedHomeDirectory; + }); + } else { + $scope.selectedHomeDirectoryInfo = null; + } + }; + + // Initialize home directories + $scope.loadHomeDirectories(); $scope.fetchWebsites = function () { @@ -1126,6 +10820,7 @@ app.controller('modifyWebsitesController', function ($scope, $http) { $scope.webpacks = JSON.parse(response.data.packages); $scope.adminNames = JSON.parse(response.data.adminNames); $scope.currentAdmin = response.data.currentAdmin; + $scope.currentHomeDirectory = response.data.currentHomeDirectory || 'Default'; $("#webSiteDetailsToBeModified").fadeIn(); $("#websiteModifySuccess").fadeIn(); @@ -1153,6 +10848,7 @@ app.controller('modifyWebsitesController', function ($scope, $http) { var email = $scope.adminEmail; var phpVersion = $scope.phpSelection; var admin = $scope.selectedAdmin; + var homeDirectory = $scope.selectedHomeDirectory; $("#websiteModifyFailure").hide(); @@ -1169,7 +10865,8 @@ app.controller('modifyWebsitesController', function ($scope, $http) { packForWeb: packForWeb, email: email, phpVersion: phpVersion, - admin: admin + admin: admin, + homeDirectory: homeDirectory }; var config = { @@ -1224,9 +10921,125 @@ app.controller('modifyWebsitesController', function ($scope, $http) { /* Java script code to create account */ +var website_child_domain_check = 0; + +function website_child_domain_checkbox_function() { + + var checkBox = document.getElementById("myCheck"); + // Get the output text + + + // If the checkbox is checked, display the output text + if (checkBox.checked == true) { + website_child_domain_check = 0; + document.getElementById('Website_Create_Test_Domain').style.display = "block"; + document.getElementById('Website_Create_Own_Domain').style.display = "none"; + + } else { + document.getElementById('Website_Create_Test_Domain').style.display = "none"; + document.getElementById('Website_Create_Own_Domain').style.display = "block"; + website_child_domain_check = 1; + } + + // alert(domain_check); +} app.controller('websitePages', function ($scope, $http, $timeout, $window) { + $scope.openWebTerminal = function() { + console.log('[DEBUG] openWebTerminal called'); + $('#web-terminal-modal').modal('show'); + console.log('[DEBUG] Modal should now be visible'); + + if ($scope.term) { + console.log('[DEBUG] Disposing previous terminal instance'); + $scope.term.dispose(); + } + var term = new Terminal({ + cursorBlink: true, + fontFamily: 'monospace', + fontSize: 14, + theme: { background: '#000' } + }); + $scope.term = term; + term.open(document.getElementById('xterm-container')); + term.focus(); + console.log('[DEBUG] Terminal initialized and opened'); + + // Fetch JWT from backend with CSRF token + var domain = $("#domainNamePage").text(); + var csrftoken = getCookie('csrftoken'); + console.log('[DEBUG] Fetching JWT for domain:', domain); + $http.post('/websites/getTerminalJWT', { domain: domain }, { + headers: { 'X-CSRFToken': csrftoken } + }) + .then(function(response) { + console.log('[DEBUG] JWT fetch response:', response); + if (response.data.status === 1 && response.data.token) { + var token = response.data.token; + var ssh_user = response.data.ssh_user; + var wsProto = location.protocol === 'https:' ? 'wss' : 'ws'; + var wsUrl = wsProto + '://' + window.location.hostname + ':8888/ws?token=' + encodeURIComponent(token) + '&ssh_user=' + encodeURIComponent(ssh_user); + console.log('[DEBUG] Connecting to WebSocket:', wsUrl); + var socket = new WebSocket(wsUrl); + socket.binaryType = 'arraybuffer'; + $scope.terminalSocket = socket; + + socket.onopen = function() { + console.log('[DEBUG] WebSocket connection opened'); + term.write('\x1b[32mConnected.\x1b[0m\r\n'); + }; + socket.onclose = function(event) { + console.log('[DEBUG] WebSocket connection closed', event); + term.write('\r\n\x1b[31mConnection closed.\x1b[0m\r\n'); + // Optionally, log modal state + console.log('[DEBUG] Modal state on close:', $('#web-terminal-modal').is(':visible')); + }; + socket.onerror = function(e) { + console.log('[DEBUG] WebSocket error', e); + term.write('\r\n\x1b[31mWebSocket error.\x1b[0m\r\n'); + }; + socket.onmessage = function(event) { + if (event.data instanceof ArrayBuffer) { + var text = new Uint8Array(event.data); + term.write(new TextDecoder().decode(text)); + } else if (typeof event.data === 'string') { + term.write(event.data); + } + }; + term.onData(function(data) { + if (socket.readyState === WebSocket.OPEN) { + var encoder = new TextEncoder(); + socket.send(encoder.encode(data)); + } + }); + term.onResize(function(size) { + if (socket.readyState === WebSocket.OPEN) { + var msg = JSON.stringify({resize: {cols: size.cols, rows: size.rows}}); + socket.send(msg); + } + }); + $('#web-terminal-modal').on('hidden.bs.modal', function() { + console.log('[DEBUG] Modal hidden event triggered'); + if ($scope.term) { + $scope.term.dispose(); + $scope.term = null; + } + if ($scope.terminalSocket) { + $scope.terminalSocket.close(); + $scope.terminalSocket = null; + } + }); + } else { + console.log('[DEBUG] Failed to get terminal token', response); + term.write('\x1b[31mFailed to get terminal token.\x1b[0m\r\n'); + } + }, function(error) { + console.log('[DEBUG] Failed to contact backend', error); + term.write('\x1b[31mFailed to contact backend.\x1b[0m\r\n'); + }); + }; + $scope.logFileLoading = true; $scope.logsFeteched = true; $scope.couldNotFetchLogs = true; @@ -2282,7 +12095,22 @@ app.controller('websitePages', function ($scope, $http, $timeout, $window) { var statusFile; - $scope.WebsiteSelection = function (){ + + $scope.webselection = true; + $scope.WebsiteType = function () { + var type = $scope.websitetype; + if (type == 'Sub Domain') { + $scope.webselection = false; + $scope.DomainCreateForm = true; + + } else if (type == 'Addon Domain') { + $scope.DomainCreateForm = false; + $scope.webselection = true; + $scope.masterDomain = $('#defaultSite').html() + } + }; + + $scope.WebsiteSelection = function () { $scope.DomainCreateForm = false; }; @@ -2298,7 +12126,7 @@ app.controller('websitePages', function ($scope, $http, $timeout, $window) { $scope.currentStatus = "Starting creation.."; $scope.DomainCreateForm = true; - var ssl, dkimCheck, openBasedir; + var ssl, dkimCheck, openBasedir, apacheBackend; if ($scope.sslCheck === true) { ssl = 1; @@ -2319,6 +12147,13 @@ app.controller('websitePages', function ($scope, $http, $timeout, $window) { } + if ($scope.apacheBackend === true) { + apacheBackend = 1; + } else { + apacheBackend = 0 + } + + url = "/websites/submitDomainCreation"; var domainName = $scope.domainNameCreate; var phpSelection = $scope.phpSelection; @@ -2328,6 +12163,19 @@ app.controller('websitePages', function ($scope, $http, $timeout, $window) { if (typeof path === 'undefined') { path = ""; } + var package = $scope.packageForWebsite; + + // if (website_child_domain_check == 0) { + // var Part2_domainNameCreate = document.getElementById('Part2_domainNameCreate').value; + // var domainName = document.getElementById('TestDomainNameCreate').value + Part2_domainNameCreate; + // } + // if (website_child_domain_check == 1) { + // + // var domainName = $scope.own_domainNameCreate; + // } + var type = $scope.websitetype; + + var domainName = $scope.domainNameCreate; var data = { @@ -2337,7 +12185,8 @@ app.controller('websitePages', function ($scope, $http, $timeout, $window) { path: path, masterDomain: $scope.masterDomain, dkimCheck: dkimCheck, - openBasedir: openBasedir + openBasedir: openBasedir, + apacheBackend: apacheBackend }; var config = { @@ -2346,6 +12195,8 @@ app.controller('websitePages', function ($scope, $http, $timeout, $window) { } }; + // console.log(data) + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); @@ -2552,7 +12403,6 @@ app.controller('websitePages', function ($scope, $http, $timeout, $window) { } - $scope.changePHP = function (childDomain, phpSelection) { // notifcations @@ -2934,7 +12784,7 @@ app.controller('websitePages', function ($scope, $http, $timeout, $window) { $scope.operationFailed = false; $scope.operationSuccessfull = true; $scope.couldNotConnect = true; - $scope.openBaseDirBox = false; + $scope.openBaseDirChanged = false; $scope.errorMessage = response.data.error_message; @@ -2968,6 +12818,7 @@ RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] ### End CyberPanel Generated Rules. `; + const WWWToNonWWW = `### Rewrite Rules Added by CyberPanel Rewrite Rule Generator RewriteEngine On @@ -3003,11 +12854,9 @@ RewriteRule ^/(xmlrpc|wp-trackback)\.php - [F,L,NC] $scope.rewriteRules = httpToHTTPS + $scope.rewriteRules; } else if ($scope.rewriteTemplate === "Force NON-WWW -> WWW") { $scope.rewriteRules = nonWWWToWWW + $scope.rewriteRules; - } - else if ($scope.rewriteTemplate === "Force WWW -> NON-WWW") { + } else if ($scope.rewriteTemplate === "Force WWW -> NON-WWW") { $scope.rewriteRules = WWWToNonWWW + $scope.rewriteRules; - } - else if ($scope.rewriteTemplate === "Disable Wordpress XMLRPC & Trackback") { + } else if ($scope.rewriteTemplate === "Disable Wordpress XMLRPC & Trackback") { $scope.rewriteRules = WordpressProtect + $scope.rewriteRules; } }; @@ -3489,6 +13338,16 @@ app.controller('manageAliasController', function ($scope, $http, $timeout, $wind $scope.manageAliasLoading = true; $scope.operationSuccess = true; + // Initialize the page to show aliases list + $scope.showAliasesList = function() { + $scope.aliasTable = true; + $scope.addAliasButton = true; + $scope.domainAliasForm = false; + }; + + // Auto-show aliases list on page load + $scope.showAliasesList(); + $scope.createAliasEnter = function ($event) { var keyCode = $event.which || $event.keyCode; if (keyCode === 13) { @@ -3499,12 +13358,15 @@ app.controller('manageAliasController', function ($scope, $http, $timeout, $wind $scope.showAliasForm = function (domainName) { - $scope.domainAliasForm = false; - $scope.aliasTable = true; - $scope.addAliasButton = true; + //$scope.domainAliasForm = false; + //$scope.aliasTable = true; + //$scope.addAliasButton = true; masterDomain = domainName; + $scope.showCreateDomainForm(); + $scope.masterDomain = domainName; + }; $scope.addAliasFunc = function () { @@ -3698,6 +13560,7 @@ app.controller('manageAliasController', function ($scope, $http, $timeout, $wind $window.location.reload(); }, 3000); + } else { $scope.aliasTable = false; @@ -3732,73 +13595,233 @@ app.controller('manageAliasController', function ($scope, $http, $timeout, $wind }; + $scope.issueAliasSSL = function (masterDomain, aliasDomain) { + $scope.manageAliasLoading = false; -}); + url = "/websites/issueAliasSSL"; -/* Java script code to manage cron ends here */ + var data = { + masterDomain: masterDomain, + aliasDomain: aliasDomain + }; -app.controller('launchChild', function ($scope, $http) { + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; - $scope.logFileLoading = true; - $scope.logsFeteched = true; - $scope.couldNotFetchLogs = true; + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + if (response.data.issueAliasSSL === 1) { + $scope.aliasTable = false; + $scope.addAliasButton = true; + $scope.domainAliasForm = true; + $scope.aliasError = true; + $scope.couldNotConnect = true; + $scope.aliasCreated = true; + $scope.manageAliasLoading = true; + $scope.operationSuccess = false; + + $timeout(function () { + $window.location.reload(); + }, 3000); + } else { + $scope.aliasTable = false; + $scope.addAliasButton = true; + $scope.domainAliasForm = true; + $scope.aliasError = false; + $scope.couldNotConnect = true; + $scope.aliasCreated = true; + $scope.manageAliasLoading = true; + $scope.operationSuccess = true; + + $scope.errorMessage = response.data.error_message; + } + } + + function cantLoadInitialDatas(response) { + $scope.aliasTable = false; + $scope.addAliasButton = true; + $scope.domainAliasForm = true; + $scope.aliasError = true; + $scope.couldNotConnect = false; + $scope.aliasCreated = true; + $scope.manageAliasLoading = true; + $scope.operationSuccess = true; + } + }; + + + ////// create domain part + + $("#domainCreationForm").hide(); + + $scope.showCreateDomainForm = function () { + $("#domainCreationForm").fadeIn(); + }; + + $scope.hideDomainCreationForm = function () { + $("#domainCreationForm").fadeOut(); + }; + + $scope.masterDomain = $("#domainNamePage").text(); + + // notifcations settings + $scope.domainLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; $scope.couldNotConnect = true; - $scope.fetchedData = true; - $scope.hideLogs = true; - $scope.hideErrorLogs = true; + $scope.goBackDisable = true; + $scope.DomainCreateForm = true; - $scope.hidelogsbtn = function () { - $scope.hideLogs = true; + var statusFile; + + + $scope.webselection = true; + $scope.WebsiteType = function () { + var type = $scope.websitetype; + if (type == 'Sub Domain') { + $scope.webselection = false; + $scope.DomainCreateForm = true; + + } else if (type == 'Addon Domain') { + $scope.DomainCreateForm = false; + $scope.webselection = true; + $scope.masterDomain = $('#defaultSite').html() + } }; - $scope.hideErrorLogsbtn = function () { - $scope.hideLogs = true; + $scope.WebsiteSelection = function () { + $scope.DomainCreateForm = false; }; - $scope.fileManagerURL = "/filemanager/" + $("#domainNamePage").text(); - $scope.previewUrl = "/preview/" + $("#childDomain").text() + "/"; - $scope.wordPressInstallURL = "/websites/" + $("#childDomain").text() + "/wordpressInstall"; - $scope.joomlaInstallURL = "/websites/" + $("#childDomain").text() + "/joomlaInstall"; - $scope.setupGit = "/websites/" + $("#childDomain").text() + "/setupGit"; - $scope.installPrestaURL = "/websites/" + $("#childDomain").text() + "/installPrestaShop"; - $scope.installMagentoURL = "/websites/" + $("#childDomain").text() + "/installMagento"; + $scope.createDomain = function () { - var logType = 0; - $scope.pageNumber = 1; + $scope.domainLoading = false; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.currentStatus = "Starting creation.."; + $scope.DomainCreateForm = true; - $scope.fetchLogs = function (type) { + var ssl, dkimCheck, openBasedir, apacheBackend; - var pageNumber = $scope.pageNumber; - - - if (type == 3) { - pageNumber = $scope.pageNumber + 1; - $scope.pageNumber = pageNumber; - } else if (type == 4) { - pageNumber = $scope.pageNumber - 1; - $scope.pageNumber = pageNumber; + if ($scope.sslCheck === true) { + ssl = 1; } else { - logType = type; + ssl = 0 } + if ($scope.dkimCheck === true) { + dkimCheck = 1; + } else { + dkimCheck = 0 + } - $scope.logFileLoading = false; - $scope.logsFeteched = true; - $scope.couldNotFetchLogs = true; - $scope.couldNotConnect = true; - $scope.fetchedData = false; - $scope.hideErrorLogs = true; + openBasedir = 0; - url = "/websites/getDataFromLogFile"; + apacheBackend = 0 - var domainNamePage = $("#domainNamePage").text(); + + url = "/websites/submitDomainCreation"; + var domainName = $scope.domainNameCreate; + + var path = $scope.docRootPath; + + if (typeof path === 'undefined') { + path = ""; + } + + var domainName = $scope.domainNameCreate; var data = { - logType: logType, - virtualHost: domainNamePage, - page: pageNumber, + domainName: domainName, + ssl: ssl, + path: path, + masterDomain: $scope.masterDomain, + dkimCheck: 1, + openBasedir: 0, + alias: 1 + }; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + // console.log(data) + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.createWebSiteStatus === 1) { + statusFile = response.data.tempStatusPath; + getCreationStatus(); + } else { + + $scope.domainLoading = true; + $scope.installationDetailsForm = true; + $scope.DomainCreateForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + } + + + } + + function cantLoadInitialDatas(response) { + + $scope.domainLoading = true; + $scope.installationDetailsForm = true; + $scope.DomainCreateForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + }; + + $scope.goBack = function () { + $scope.domainLoading = true; + $scope.installationDetailsForm = false; + $scope.DomainCreateForm = true; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $scope.DomainCreateForm = true; + $("#installProgress").css("width", "0%"); + }; + + function getCreationStatus() { + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile }; var config = { @@ -3807,204 +13830,108 @@ app.controller('launchChild', function ($scope, $http) { } }; - $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - if (response.data.logstatus === 1) { - - - $scope.logFileLoading = true; - $scope.logsFeteched = false; - $scope.couldNotFetchLogs = true; - $scope.couldNotConnect = true; - $scope.fetchedData = false; - $scope.hideLogs = false; - - - $scope.records = JSON.parse(response.data.data); - - } else { - - $scope.logFileLoading = true; - $scope.logsFeteched = true; - $scope.couldNotFetchLogs = false; - $scope.couldNotConnect = true; - $scope.fetchedData = true; - $scope.hideLogs = false; - - - $scope.errorMessage = response.data.error_message; - console.log(domainNamePage) - - } - - - } - - function cantLoadInitialDatas(response) { - - $scope.logFileLoading = true; - $scope.logsFeteched = true; - $scope.couldNotFetchLogs = true; - $scope.couldNotConnect = false; - $scope.fetchedData = true; - $scope.hideLogs = false; - - } - - - }; - - $scope.errorPageNumber = 1; - - - $scope.fetchErrorLogs = function (type) { - - var errorPageNumber = $scope.errorPageNumber; - - - if (type === 3) { - errorPageNumber = $scope.errorPageNumber + 1; - $scope.errorPageNumber = errorPageNumber; - } else if (type === 4) { - errorPageNumber = $scope.errorPageNumber - 1; - $scope.errorPageNumber = errorPageNumber; - } else { - logType = type; - } - - // notifications - - $scope.logFileLoading = false; - $scope.logsFeteched = true; - $scope.couldNotFetchLogs = true; - $scope.couldNotConnect = true; - $scope.fetchedData = true; - $scope.hideErrorLogs = true; - $scope.hideLogs = false; - - - url = "/websites/fetchErrorLogs"; - - var domainNamePage = $("#domainNamePage").text(); - - - var data = { - virtualHost: domainNamePage, - page: errorPageNumber, - }; - - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); function ListInitialDatas(response) { - if (response.data.logstatus === 1) { + if (response.data.abort === 1) { - // notifications + if (response.data.installStatus === 1) { - $scope.logFileLoading = true; - $scope.logsFeteched = false; - $scope.couldNotFetchLogs = true; - $scope.couldNotConnect = true; - $scope.fetchedData = true; - $scope.hideLogs = false; - $scope.hideErrorLogs = false; + $scope.domainLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + $("#installProgress").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + fetchDomains(); - $scope.errorLogsData = response.data.data; + } else { + + $scope.domainLoading = true; + $scope.installationDetailsForm = true; + $scope.DomainCreateForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + } } else { - - // notifications - - $scope.logFileLoading = true; - $scope.logsFeteched = true; - $scope.couldNotFetchLogs = false; - $scope.couldNotConnect = true; - $scope.fetchedData = true; - $scope.hideLogs = true; - $scope.hideErrorLogs = true; - - - $scope.errorMessage = response.data.error_message; - + $("#installProgress").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + $timeout(getCreationStatus, 1000); } - } function cantLoadInitialDatas(response) { - // notifications - - $scope.logFileLoading = true; - $scope.logsFeteched = true; - $scope.couldNotFetchLogs = true; + $scope.domainLoading = true; + $scope.installationDetailsForm = true; + $scope.DomainCreateForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; $scope.couldNotConnect = false; - $scope.fetchedData = true; - $scope.hideLogs = true; - $scope.hideErrorLogs = true; + $scope.goBackDisable = false; } - }; + } - ///////// Configurations Part - $scope.configurationsBox = true; - $scope.configsFetched = true; - $scope.couldNotFetchConfigs = true; + ////// List Domains Part + + //////////////////////// + + // notifcations + + $scope.phpChanged = true; + $scope.domainError = true; $scope.couldNotConnect = true; - $scope.fetchedConfigsData = true; - $scope.configFileLoading = true; - $scope.configSaved = true; - $scope.couldNotSaveConfigurations = true; + $scope.domainDeleted = true; + $scope.sslIssued = true; + $scope.childBaseDirChanged = true; - $scope.hideconfigbtn = function () { + fetchDomains(); - $scope.configurationsBox = true; + $scope.showListDomains = function () { + fetchDomains(); + $("#listDomains").fadeIn(); }; - $scope.fetchConfigurations = function () { + $scope.hideListDomains = function () { + $("#listDomains").fadeOut(); + }; + function fetchDomains() { + $scope.domainLoading = false; - $scope.hidsslconfigs = true; - $scope.configurationsBoxRewrite = true; - $scope.changePHPView = true; - - - //Rewrite rules - $scope.configurationsBoxRewrite = true; - $scope.rewriteRulesFetched = true; - $scope.couldNotFetchRewriteRules = true; - $scope.rewriteRulesSaved = true; - $scope.couldNotSaveRewriteRules = true; - $scope.fetchedRewriteRules = true; - $scope.saveRewriteRulesBTN = true; - - /// - - $scope.configFileLoading = false; - - - url = "/websites/getDataFromConfigFile"; - - var virtualHost = $("#childDomain").text(); - + var url = "/websites/fetchDomains"; var data = { - virtualHost: virtualHost, + masterDomain: $("#domainNamePage").text(), + alias: 1 }; var config = { @@ -4018,57 +13945,17 @@ app.controller('launchChild', function ($scope, $http) { function ListInitialDatas(response) { - if (response.data.configstatus === 1) { - //Rewrite rules + if (response.data.fetchStatus === 1) { - $scope.configurationsBoxRewrite = true; - $scope.rewriteRulesFetched = true; - $scope.couldNotFetchRewriteRules = true; - $scope.rewriteRulesSaved = true; - $scope.couldNotSaveRewriteRules = true; - $scope.fetchedRewriteRules = true; - $scope.saveRewriteRulesBTN = true; + $scope.childDomains = JSON.parse(response.data.data); + $scope.domainLoading = true; - /// - - $scope.configurationsBox = false; - $scope.configsFetched = false; - $scope.couldNotFetchConfigs = true; - $scope.couldNotConnect = true; - $scope.fetchedConfigsData = false; - $scope.configFileLoading = true; - $scope.configSaved = true; - $scope.couldNotSaveConfigurations = true; - $scope.saveConfigBtn = false; - - - $scope.configData = response.data.configData; } else { - - //Rewrite rules - $scope.configurationsBoxRewrite = true; - $scope.rewriteRulesFetched = true; - $scope.couldNotFetchRewriteRules = true; - $scope.rewriteRulesSaved = true; - $scope.couldNotSaveRewriteRules = true; - $scope.fetchedRewriteRules = true; - $scope.saveRewriteRulesBTN = true; - - /// - $scope.configurationsBox = false; - $scope.configsFetched = true; - $scope.couldNotFetchConfigs = false; - $scope.couldNotConnect = true; - $scope.fetchedConfigsData = true; - $scope.configFileLoading = true; - $scope.configSaved = true; - $scope.couldNotSaveConfigurations = true; - - + $scope.domainError = false; $scope.errorMessage = response.data.error_message; - + $scope.domainLoading = true; } @@ -4076,149 +13963,29 @@ app.controller('launchChild', function ($scope, $http) { function cantLoadInitialDatas(response) { - //Rewrite rules - $scope.configurationsBoxRewrite = true; - $scope.rewriteRulesFetched = true; - $scope.couldNotFetchRewriteRules = true; - $scope.rewriteRulesSaved = true; - $scope.couldNotSaveRewriteRules = true; - $scope.fetchedRewriteRules = true; - $scope.saveRewriteRulesBTN = true; - /// - - $scope.configurationsBox = false; - $scope.configsFetched = true; - $scope.couldNotFetchConfigs = true; $scope.couldNotConnect = false; - $scope.fetchedConfigsData = true; - $scope.configFileLoading = true; - $scope.configSaved = true; - $scope.couldNotSaveConfigurations = true; - } + } - }; + $scope.changePHP = function (childDomain, phpSelection) { - $scope.saveCongiruations = function () { + // notifcations - $scope.configFileLoading = false; - - - url = "/websites/saveConfigsToFile"; - - var virtualHost = $("#childDomain").text(); - var configData = $scope.configData; - - - var data = { - virtualHost: virtualHost, - configData: configData, - }; - - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - if (response.data.configstatus == 1) { - - $scope.configurationsBox = false; - $scope.configsFetched = true; - $scope.couldNotFetchConfigs = true; - $scope.couldNotConnect = true; - $scope.fetchedConfigsData = true; - $scope.configFileLoading = true; - $scope.configSaved = false; - $scope.couldNotSaveConfigurations = true; - $scope.saveConfigBtn = true; - - - } else { - $scope.configurationsBox = false; - $scope.configsFetched = true; - $scope.couldNotFetchConfigs = true; - $scope.couldNotConnect = true; - $scope.fetchedConfigsData = false; - $scope.configFileLoading = true; - $scope.configSaved = true; - $scope.couldNotSaveConfigurations = false; - - - $scope.errorMessage = response.data.error_message; - - } - - - } - - function cantLoadInitialDatas(response) { - - $scope.configurationsBox = false; - $scope.configsFetched = true; - $scope.couldNotFetchConfigs = true; - $scope.couldNotConnect = false; - $scope.fetchedConfigsData = true; - $scope.configFileLoading = true; - $scope.configSaved = true; - $scope.couldNotSaveConfigurations = true; - - - } - - - }; - - - ///////// Rewrite Rules - - $scope.configurationsBoxRewrite = true; - $scope.rewriteRulesFetched = true; - $scope.couldNotFetchRewriteRules = true; - $scope.rewriteRulesSaved = true; - $scope.couldNotSaveRewriteRules = true; - $scope.fetchedRewriteRules = true; - $scope.saveRewriteRulesBTN = true; - - $scope.hideRewriteRulesbtn = function () { - $scope.configurationsBoxRewrite = true; - }; - - - $scope.fetchRewriteFules = function () { - - $scope.hidsslconfigs = true; - $scope.configurationsBox = true; - $scope.changePHPView = true; - - - $scope.configurationsBox = true; - $scope.configsFetched = true; - $scope.couldNotFetchConfigs = true; + $scope.phpChanged = true; + $scope.domainError = true; $scope.couldNotConnect = true; - $scope.fetchedConfigsData = true; - $scope.configFileLoading = true; - $scope.configSaved = true; - $scope.couldNotSaveConfigurations = true; - $scope.saveConfigBtn = true; - - $scope.configFileLoading = false; - - - url = "/websites/getRewriteRules"; - - var virtualHost = $("#childDomain").text(); + $scope.domainDeleted = true; + $scope.sslIssued = true; + $scope.domainLoading = false; + $scope.childBaseDirChanged = true; + var url = "/websites/changePHP"; var data = { - virtualHost: virtualHost, + childDomain: childDomain, + phpSelection: phpSelection, }; var config = { @@ -4232,64 +13999,110 @@ app.controller('launchChild', function ($scope, $http) { function ListInitialDatas(response) { - if (response.data.rewriteStatus == 1) { + + if (response.data.changePHP === 1) { + + $scope.domainLoading = true; + + $scope.changedPHPVersion = phpSelection; - // from main + // notifcations - $scope.configurationsBox = true; - $scope.configsFetched = true; - $scope.couldNotFetchConfigs = true; - $scope.fetchedConfigsData = true; - $scope.configSaved = true; - $scope.couldNotSaveConfigurations = true; - $scope.saveConfigBtn = true; - - // main ends - - $scope.configFileLoading = true; - - // - - - $scope.configurationsBoxRewrite = false; - $scope.rewriteRulesFetched = false; - $scope.couldNotFetchRewriteRules = true; - $scope.rewriteRulesSaved = true; - $scope.couldNotSaveRewriteRules = true; - $scope.fetchedRewriteRules = false; - $scope.saveRewriteRulesBTN = false; + $scope.phpChanged = false; + $scope.domainError = true; $scope.couldNotConnect = true; + $scope.domainDeleted = true; + $scope.sslIssued = true; + $scope.childBaseDirChanged = true; - $scope.rewriteRules = response.data.rewriteRules; - } else { - // from main - $scope.configurationsBox = true; - $scope.configsFetched = true; - $scope.couldNotFetchConfigs = true; - $scope.fetchedConfigsData = true; - $scope.configFileLoading = true; - $scope.configSaved = true; - $scope.couldNotSaveConfigurations = true; - $scope.saveConfigBtn = true; - // from main + $scope.errorMessage = response.data.error_message; + $scope.domainLoading = true; - $scope.configFileLoading = true; + // notifcations - /// - - $scope.configurationsBoxRewrite = true; - $scope.rewriteRulesFetched = true; - $scope.couldNotFetchRewriteRules = false; - $scope.rewriteRulesSaved = true; - $scope.couldNotSaveRewriteRules = true; - $scope.fetchedRewriteRules = true; - $scope.saveRewriteRulesBTN = true; + $scope.phpChanged = true; + $scope.domainError = false; $scope.couldNotConnect = true; + $scope.domainDeleted = true; + $scope.sslIssued = true; + $scope.childBaseDirChanged = true; + } + } + + function cantLoadInitialDatas(response) { + + $scope.domainLoading = true; + + // notifcations + + $scope.phpChanged = true; + $scope.domainError = false; + $scope.couldNotConnect = true; + $scope.domainDeleted = true; + $scope.sslIssued = true; + $scope.childBaseDirChanged = true; + + } + + }; + + $scope.changeChildBaseDir = function (childDomain, openBasedirValue) { + + // notifcations + + $scope.phpChanged = true; + $scope.domainError = true; + $scope.couldNotConnect = true; + $scope.domainDeleted = true; + $scope.sslIssued = true; + $scope.domainLoading = false; + $scope.childBaseDirChanged = true; + + + var url = "/websites/changeOpenBasedir"; + + var data = { + domainName: childDomain, + openBasedirValue: openBasedirValue + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.changeOpenBasedir === 1) { + + $scope.phpChanged = true; + $scope.domainError = true; + $scope.couldNotConnect = true; + $scope.domainDeleted = true; + $scope.sslIssued = true; + $scope.domainLoading = true; + $scope.childBaseDirChanged = false; + + } else { + + $scope.phpChanged = true; + $scope.domainError = false; + $scope.couldNotConnect = true; + $scope.domainDeleted = true; + $scope.sslIssued = true; + $scope.domainLoading = true; + $scope.childBaseDirChanged = true; + $scope.errorMessage = response.data.error_message; } @@ -4298,37 +14111,174 @@ app.controller('launchChild', function ($scope, $http) { } function cantLoadInitialDatas(response) { - // from main - - $scope.configurationsBox = true; - $scope.configsFetched = true; - $scope.couldNotFetchConfigs = true; - $scope.fetchedConfigsData = true; - $scope.configFileLoading = true; - $scope.configSaved = true; - $scope.couldNotSaveConfigurations = true; - $scope.saveConfigBtn = true; - - // from main - - $scope.configFileLoading = true; - - /// - - $scope.configurationsBoxRewrite = true; - $scope.rewriteRulesFetched = true; - $scope.couldNotFetchRewriteRules = true; - $scope.rewriteRulesSaved = true; - $scope.couldNotSaveRewriteRules = true; - $scope.fetchedRewriteRules = true; - $scope.saveRewriteRulesBTN = true; + $scope.phpChanged = true; + $scope.domainError = true; $scope.couldNotConnect = false; + $scope.domainDeleted = true; + $scope.sslIssued = true; + $scope.domainLoading = true; + $scope.childBaseDirChanged = true; } + } + $scope.showWPSites = function(domain) { + console.log('showWPSites called for domain:', domain); + + // Make sure domain is defined + if (!domain) { + console.error('Domain is undefined'); + return; + } + + // Find the website in the list + var site = $scope.WebSitesList.find(function(website) { + return website.domain === domain; + }); + + if (!site) { + console.error('Website not found:', domain); + return; + } + + // Set loading state + site.loadingWPSites = true; + + // Toggle visibility + site.showWPSites = !site.showWPSites; + + // If we're hiding, just return + if (!site.showWPSites) { + site.loadingWPSites = false; + return; + } + + var config = { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = $.param({ + domain: domain + }); + + $http.post('/websites/fetchWPDetails', data, config) + .then(function(response) { + console.log('Response received:', response); + if (response.data.status === 1 && response.data.fetchStatus === 1) { + site.wp_sites = response.data.sites || []; + // Initialize loading states for each WP site + site.wp_sites.forEach(function(wp) { + wp.loading = false; + wp.loadingPlugins = false; + wp.loadingTheme = false; + }); + $("#listFail").hide(); + } else { + $("#listFail").fadeIn(); + site.showWPSites = false; + $scope.errorMessage = response.data.error_message || 'Failed to fetch WordPress sites'; + console.error('Error in response:', response.data.error_message); + new PNotify({ + title: 'Error!', + text: response.data.error_message || 'Failed to fetch WordPress sites', + type: 'error' + }); + } + }) + .catch(function(error) { + console.error('Request failed:', error); + site.showWPSites = false; + $("#listFail").fadeIn(); + $scope.errorMessage = error.message || 'An error occurred while fetching WordPress sites'; + new PNotify({ + title: 'Error!', + text: error.message || 'Could not connect to server', + type: 'error' + }); + }) + .finally(function() { + site.loadingWPSites = false; + }); + }; + + $scope.updateSetting = function(wp, setting) { + var settingMap = { + 'search-indexing': 'searchIndex', + 'debugging': 'debugging', + 'password-protection': 'passwordProtection', + 'maintenance-mode': 'maintenanceMode' + }; + + // Toggle the state before sending request + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + + var data = { + siteId: wp.id, + setting: setting, + value: wp[settingMap[setting]] + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post('/websites/UpdateWPSettings', data, config).then(function(response) { + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Setting updated successfully.', + type: 'success' + }); + if (setting === 'password-protection' && wp[settingMap[setting]] === 1) { + // Show password protection modal if enabling + wp.PPUsername = ""; + wp.PPPassword = ""; + $scope.currentWP = wp; + $('#passwordProtectionModal').modal('show'); + } + } else { + // Revert the change if update failed + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: response.data.error_message || 'Failed to update setting.', + type: 'error' + }); + } + }).catch(function(error) { + // Revert the change on error + wp[settingMap[setting]] = wp[settingMap[setting]] === 1 ? 0 : 1; + new PNotify({ + title: 'Error', + text: 'Connection failed while updating setting.', + type: 'error' + }); + }); + }; + + $scope.visitSite = function(wp) { + var url = wp.url || wp.domain; + if (!url) return; + if (!url.startsWith('http://') && !url.startsWith('https://')) { + url = 'https://' + url; + } + window.open(url, '_blank'); + }; + + $scope.wpLogin = function(wpId) { + window.open('/websites/wpLogin?wpID=' + wpId, '_blank'); + }; + + $scope.manageWP = function(wpId) { + window.location.href = '/websites/listWPsites?wpID=' + wpId; }; $scope.saveRewriteRules = function () { @@ -5731,6 +15681,85 @@ app.controller('installMauticCTRL', function ($scope, $http, $timeout) { app.controller('sshAccess', function ($scope, $http, $timeout) { + $scope.openWebTerminal = function() { + $('#web-terminal-modal').modal('show'); + + if ($scope.term) { + $scope.term.dispose(); + } + var term = new Terminal({ + cursorBlink: true, + fontFamily: 'monospace', + fontSize: 14, + theme: { background: '#000' } + }); + $scope.term = term; + term.open(document.getElementById('xterm-container')); + term.focus(); + + // Fetch JWT from backend with CSRF token + var domain = $("#domainName").text(); + var csrftoken = getCookie('csrftoken'); + $http.post('/websites/getTerminalJWT', { domain: domain }, { + headers: { 'X-CSRFToken': csrftoken } + }) + .then(function(response) { + if (response.data.status === 1 && response.data.token) { + var token = response.data.token; + var ssh_user = $("#externalApp").text(); + var wsProto = location.protocol === 'https:' ? 'wss' : 'ws'; + var wsUrl = wsProto + '://' + window.location.hostname + ':8888/ws?token=' + encodeURIComponent(token) + '&ssh_user=' + encodeURIComponent(ssh_user); + var socket = new WebSocket(wsUrl); + socket.binaryType = 'arraybuffer'; + $scope.terminalSocket = socket; + + socket.onopen = function() { + term.write('\x1b[32mConnected.\x1b[0m\r\n'); + }; + socket.onclose = function() { + term.write('\r\n\x1b[31mConnection closed.\x1b[0m\r\n'); + }; + socket.onerror = function(e) { + term.write('\r\n\x1b[31mWebSocket error.\x1b[0m\r\n'); + }; + socket.onmessage = function(event) { + if (event.data instanceof ArrayBuffer) { + var text = new Uint8Array(event.data); + term.write(new TextDecoder().decode(text)); + } else if (typeof event.data === 'string') { + term.write(event.data); + } + }; + term.onData(function(data) { + if (socket.readyState === WebSocket.OPEN) { + var encoder = new TextEncoder(); + socket.send(encoder.encode(data)); + } + }); + term.onResize(function(size) { + if (socket.readyState === WebSocket.OPEN) { + var msg = JSON.stringify({resize: {cols: size.cols, rows: size.rows}}); + socket.send(msg); + } + }); + $('#web-terminal-modal').on('hidden.bs.modal', function() { + if ($scope.term) { + $scope.term.dispose(); + $scope.term = null; + } + if ($scope.terminalSocket) { + $scope.terminalSocket.close(); + $scope.terminalSocket = null; + } + }); + } else { + term.write('\x1b[31mFailed to get terminal token.\x1b[0m\r\n'); + } + }, function() { + term.write('\x1b[31mFailed to contact backend.\x1b[0m\r\n'); + }); + }; + $scope.wpInstallLoading = true; $scope.setupSSHAccess = function () { @@ -6099,350 +16128,6 @@ app.controller('cloneWebsite', function ($scope, $http, $timeout, $window) { }); /* Java script code to cloneWebsite ends here */ - -/* Java script code to syncWebsite */ -app.controller('syncWebsite', function ($scope, $http, $timeout, $window) { - - $scope.cyberpanelLoading = true; - $scope.installationDetailsForm = false; - $scope.installationProgress = true; - $scope.goBackDisable = true; - - var statusFile; - - $scope.startSyncing = function () { - - $scope.cyberpanelLoading = false; - $scope.installationDetailsForm = true; - $scope.installationProgress = false; - $scope.goBackDisable = true; - - $scope.currentStatus = "Cloning started.."; - - url = "/websites/startSync"; - - - var data = { - childDomain: $("#childDomain").text(), - eraseCheck: $scope.eraseCheck, - dbCheck: $scope.dbCheck, - copyChanged: $scope.copyChanged - - }; - - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - - function ListInitialDatas(response) { - - if (response.data.status === 1) { - statusFile = response.data.tempStatusPath; - getCreationStatus(); - } else { - - $scope.cyberpanelLoading = true; - $scope.installationDetailsForm = true; - $scope.installationProgress = false; - $scope.goBackDisable = false; - - $scope.currentStatus = response.data.error_message; - } - - - } - - function cantLoadInitialDatas(response) { - - $scope.cyberpanelLoading = true; - $scope.installationDetailsForm = true; - $scope.installationProgress = false; - $scope.goBackDisable = false; - - } - - }; - $scope.goBack = function () { - $scope.cyberpanelLoading = true; - $scope.installationDetailsForm = false; - $scope.installationProgress = true; - $scope.goBackDisable = true; - $("#installProgress").css("width", "0%"); - }; - - function getCreationStatus() { - - url = "/websites/installWordpressStatus"; - - var data = { - statusFile: statusFile - }; - - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - - $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - - if (response.data.abort === 1) { - - if (response.data.installStatus === 1) { - - $scope.cyberpanelLoading = true; - $scope.installationDetailsForm = true; - $scope.installationProgress = false; - $scope.goBackDisable = false; - - $("#installProgress").css("width", "100%"); - $scope.installPercentage = "100"; - $scope.currentStatus = response.data.currentStatus; - $timeout.cancel(); - - } else { - - $scope.cyberpanelLoading = true; - $scope.installationDetailsForm = true; - $scope.installationProgress = false; - $scope.goBackDisable = false; - - $scope.currentStatus = response.data.error_message; - - $("#installProgress").css("width", "0%"); - $scope.installPercentage = "0"; - $scope.goBackDisable = false; - - } - - } else { - $("#installProgress").css("width", response.data.installationProgress + "%"); - $scope.installPercentage = response.data.installationProgress; - $scope.currentStatus = response.data.currentStatus; - $timeout(getCreationStatus, 1000); - } - - } - - function cantLoadInitialDatas(response) { - - $scope.cyberpanelLoading = true; - $scope.installationDetailsForm = true; - $scope.installationProgress = false; - $scope.goBackDisable = false; - - } - - - } - -}); -/* Java script code to syncWebsite ends here */ - - -app.controller('installMagentoCTRL', function ($scope, $http, $timeout) { - - $scope.installationDetailsForm = false; - $scope.installationProgress = true; - $scope.installationFailed = true; - $scope.installationSuccessfull = true; - $scope.couldNotConnect = true; - $scope.wpInstallLoading = true; - $scope.goBackDisable = true; - - $scope.databasePrefix = 'ps_'; - - var statusFile; - var domain = $("#domainNamePage").text(); - var path; - - - $scope.goBack = function () { - $scope.installationDetailsForm = false; - $scope.installationProgress = true; - $scope.installationFailed = true; - $scope.installationSuccessfull = true; - $scope.couldNotConnect = true; - $scope.wpInstallLoading = true; - $scope.goBackDisable = true; - $("#installProgress").css("width", "0%"); - }; - - function getInstallStatus() { - - url = "/websites/installWordpressStatus"; - - var data = { - statusFile: statusFile, - domainName: domain - }; - - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - - $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - - if (response.data.abort === 1) { - - if (response.data.installStatus === 1) { - - $scope.installationDetailsForm = true; - $scope.installationProgress = false; - $scope.installationFailed = true; - $scope.installationSuccessfull = false; - $scope.couldNotConnect = true; - $scope.wpInstallLoading = true; - $scope.goBackDisable = false; - - if (typeof path !== 'undefined') { - $scope.installationURL = "http://" + domain + "/" + path; - } else { - $scope.installationURL = domain; - } - - - $("#installProgress").css("width", "100%"); - $scope.installPercentage = "100"; - $scope.currentStatus = response.data.currentStatus; - $timeout.cancel(); - - } else { - - $scope.installationDetailsForm = true; - $scope.installationProgress = false; - $scope.installationFailed = false; - $scope.installationSuccessfull = true; - $scope.couldNotConnect = true; - $scope.wpInstallLoading = true; - $scope.goBackDisable = false; - - $scope.errorMessage = response.data.error_message; - - $("#installProgress").css("width", "0%"); - $scope.installPercentage = "0"; - - } - - } else { - $("#installProgress").css("width", response.data.installationProgress + "%"); - $scope.installPercentage = response.data.installationProgress; - $scope.currentStatus = response.data.currentStatus; - - $timeout(getInstallStatus, 1000); - - - } - - } - - function cantLoadInitialDatas(response) { - - $scope.canNotFetch = true; - $scope.couldNotConnect = false; - - - } - - - } - - $scope.installMagento = function () { - - $scope.installationDetailsForm = true; - $scope.installationProgress = false; - $scope.installationFailed = true; - $scope.installationSuccessfull = true; - $scope.couldNotConnect = true; - $scope.wpInstallLoading = false; - $scope.goBackDisable = true; - $scope.currentStatus = "Starting installation.."; - - path = $scope.installPath; - - - url = "/websites/magentoInstall"; - - var home = "1"; - - if (typeof path !== 'undefined') { - home = "0"; - } - var sampleData; - if ($scope.sampleData === true) { - sampleData = 1; - } else { - sampleData = 0 - } - - - var data = { - domain: domain, - home: home, - path: path, - firstName: $scope.firstName, - lastName: $scope.lastName, - username: $scope.username, - email: $scope.email, - passwordByPass: $scope.password, - sampleData: sampleData - }; - - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - - - function ListInitialDatas(response) { - - if (response.data.installStatus === 1) { - statusFile = response.data.tempStatusPath; - getInstallStatus(); - } else { - - $scope.installationDetailsForm = true; - $scope.installationProgress = false; - $scope.installationFailed = false; - $scope.installationSuccessfull = true; - $scope.couldNotConnect = true; - $scope.wpInstallLoading = true; - $scope.goBackDisable = false; - - $scope.errorMessage = response.data.error_message; - - } - - - } - - function cantLoadInitialDatas(response) { - } - - }; - - -}); - /* Java script code to git tracking */ app.controller('manageGIT', function ($scope, $http, $timeout, $window) { @@ -7464,3 +17149,1868 @@ app.controller('manageGIT', function ($scope, $http, $timeout, $window) { }); /* Java script code to git tracking ends here */ + + +app.controller('ApacheManager', function ($scope, $http, $timeout) { + $scope.cyberpanelloading = true; + $scope.apacheOLS = true; + $scope.pureOLS = true; + $scope.lswsEnt = true; + + var apache = 1, ols = 2, lsws = 3; + var statusFile; + + $scope.getSwitchStatus = function () { + $scope.cyberpanelloading = false; + url = "/websites/getSwitchStatus"; + + var data = { + domainName: $("#domainNamePage").text() + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.cyberpanelloading = true; + if (response.data.status === 1) { + if (response.data.server === apache) { + $scope.apacheOLS = false; + $scope.pureOLS = true; + $scope.lswsEnt = true; + $scope.configData = response.data.configData; + + $scope.pmMaxChildren = response.data.pmMaxChildren; + $scope.pmStartServers = response.data.pmStartServers; + $scope.pmMinSpareServers = response.data.pmMinSpareServers; + $scope.pmMaxSpareServers = response.data.pmMaxSpareServers; + $scope.phpPath = response.data.phpPath; + + + } else if (response.data.server === ols) { + $scope.apacheOLS = true; + $scope.pureOLS = false; + $scope.lswsEnt = true; + } else { + $scope.apacheOLS = true; + $scope.pureOLS = true; + $scope.lswsEnt = false; + } + //$scope.records = JSON.parse(response.data.data); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialData(response) { + $scope.cyberpanelloading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page.', + type: 'error' + }); + } + + + }; + $scope.getSwitchStatus(); + + $scope.switchServer = function (server) { + $scope.cyberpanelloading = false; + $scope.functionProgress = {"width": "0%"}; + $scope.functionStatus = 'Starting conversion..'; + + url = "/websites/switchServer"; + + var data = { + domainName: $("#domainNamePage").text(), + phpSelection: $scope.phpSelection, + server: server + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + function ListInitialData(response) { + if (response.data.status === 1) { + statusFile = response.data.tempStatusPath; + statusFunc(); + + } else { + $scope.cyberpanelloading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialData(response) { + $scope.cyberpanelloading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page.', + type: 'error' + }); + } + + + }; + + function statusFunc() { + $scope.cyberpanelloading = false; + url = "/websites/statusFunc"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + if (response.data.status === 1) { + if (response.data.abort === 1) { + $scope.functionProgress = {"width": "100%"}; + $scope.functionStatus = response.data.currentStatus; + $scope.cyberpanelloading = true; + $timeout.cancel(); + $scope.getSwitchStatus(); + } else { + $scope.functionProgress = {"width": response.data.installationProgress + "%"}; + $scope.functionStatus = response.data.currentStatus; + $timeout(statusFunc, 3000); + } + + } else { + $scope.cyberpanelloading = true; + $scope.functionStatus = response.data.error_message; + $scope.functionProgress = {"width": response.data.installationProgress + "%"}; + $timeout.cancel(); + } + + } + + function cantLoadInitialData(response) { + $scope.functionProgress = {"width": response.data.installationProgress + "%"}; + $scope.functionStatus = 'Could not connect to server, please refresh this page.'; + $timeout.cancel(); + } + + } + + + $scope.tuneSettings = function () { + $scope.cyberpanelloading = false; + + url = "/websites/tuneSettings"; + + var data = { + domainName: $("#domainNamePage").text(), + pmMaxChildren: $scope.pmMaxChildren, + pmStartServers: $scope.pmStartServers, + pmMinSpareServers: $scope.pmMinSpareServers, + pmMaxSpareServers: $scope.pmMaxSpareServers, + phpPath: $scope.phpPath + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + function ListInitialData(response) { + $scope.cyberpanelloading = true; + if (response.data.status === 1) { + + new PNotify({ + title: 'Success', + text: 'Changes successfully applied.', + type: 'success' + }); + + } else { + $scope.cyberpanelloading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialData(response) { + $scope.cyberpanelloading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page.', + type: 'error' + }); + } + + + }; + + $scope.saveApacheConfig = function () { + $scope.cyberpanelloading = false; + + url = "/websites/saveApacheConfigsToFile"; + + var data = { + domainName: $("#domainNamePage").text(), + configData: $scope.configData + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + function ListInitialData(response) { + $scope.cyberpanelloading = true; + if (response.data.status === 1) { + + new PNotify({ + title: 'Success', + text: 'Changes successfully applied.', + type: 'success' + }); + + } else { + $scope.cyberpanelloading = true; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + + } + + function cantLoadInitialData(response) { + $scope.cyberpanelloading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page.', + type: 'error' + }); + } + + + }; + +}); + + +app.controller('createDockerPackage', function ($scope, $http, $window) { + $scope.cyberpanelLoading = true; + + $scope.createdockerpackage = function () { + + $scope.cyberpanelLoading = false; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + name: $scope.packagesname, + cpu: $scope.CPU, + Memory: $scope.Memory, + Bandwidth: $scope.Bandwidth, + disk: $scope.disk + }; + + + dataurl = "/websites/AddDockerpackage"; + + $http.post(dataurl, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + $scope.cyberpanelLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Successfully Saved.', + type: 'success' + }); + setTimeout(function() { + location.reload(); + }, 1500); + + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.cyberpanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page.', + type: 'error' + }); + + + } + } + + + $scope.Getpackage = function (packid) { + + $scope.cyberpanelLoading = false; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + id: packid, + }; + + + dataurl = "/websites/Getpackage"; + + $http.post(dataurl, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + $scope.cyberpanelLoading = true; + console.log('Getpackage response:', response.data); + if (response.data.status === 1) { + // Log the exact structure to understand the response + console.log('Response error_message:', response.data.error_message); + + // Handle different possible response formats + var packageData = response.data.error_message; + if (packageData) { + // Check if data is nested in obj property or direct + var data = packageData.obj || packageData; + + $scope.U_Name = data.Name; + $scope.U_CPU = data.CPU || data.CPUs; + $scope.U_Memory = data.Memory || data.Ram; + $scope.U_Bandwidth = data.Bandwidth; + $scope.U_DiskSpace = data.DiskSpace; + $scope.EditID = packid; + + console.log('Set modal data:', { + Name: $scope.U_Name, + CPU: $scope.U_CPU, + Memory: $scope.U_Memory, + Bandwidth: $scope.U_Bandwidth, + DiskSpace: $scope.U_DiskSpace + }); + + // Force Angular to update the view + if (!$scope.$$phase) { + $scope.$apply(); + } + + // Also manually update the form fields as a fallback + setTimeout(function() { + $('#EditPackage input[ng-model="U_Name"]').val($scope.U_Name); + $('#EditPackage input[ng-model="U_CPU"]').val($scope.U_CPU); + $('#EditPackage input[ng-model="U_Memory"]').val($scope.U_Memory); + $('#EditPackage input[ng-model="U_Bandwidth"]').val($scope.U_Bandwidth); + $('#EditPackage input[ng-model="U_DiskSpace"]').val($scope.U_DiskSpace); + + console.log('Manually updated form fields'); + + // Ensure Angular knows about the manual updates + $('#EditPackage').find('input[ng-model="U_CPU"]').trigger('input'); + $('#EditPackage').find('input[ng-model="U_Memory"]').trigger('input'); + $('#EditPackage').find('input[ng-model="U_Bandwidth"]').trigger('input'); + $('#EditPackage').find('input[ng-model="U_DiskSpace"]').trigger('input'); + + // Show the modal + $('#EditPackage').modal('show'); + }, 200); + } else { + console.error('Package data not found in response'); + } + + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.cyberpanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page.', + type: 'error' + }); + + + } + } + + + $scope.SaveUpdate = function () { + + $scope.cyberpanelLoading = false; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + id: $scope.EditID, + CPU: $scope.U_CPU, + RAM: $scope.U_Memory, + Bandwidth: $scope.U_Bandwidth, + DiskSpace: $scope.U_DiskSpace, + }; + + + dataurl = "/websites/Updatepackage"; + + $http.post(dataurl, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + $scope.cyberpanelLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Successfully Updated.', + type: 'success' + }); + setTimeout(function() { + location.reload(); + }, 1500); + $('#EditPackage').modal('hide'); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.cyberpanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page.', + type: 'error' + }); + + + } + } + + var FinalDeletepackageURL; + $scope.Deletepackage = function (url) { + FinalDeletepackageURL = url; + console.log('Delete URL set to:', FinalDeletepackageURL); + + // Show the delete confirmation modal + $('#packagedelete').modal('show'); + } + + $scope.ConfirmDelete = function () { + console.log('Confirming delete with URL:', FinalDeletepackageURL); + + if (!FinalDeletepackageURL) { + console.error('No delete URL set'); + return; + } + + // Hide modal and redirect after a small delay + $('#packagedelete').modal('hide'); + + setTimeout(function() { + window.location.href = FinalDeletepackageURL; + }, 300); + } + +}) +app.controller('AssignPackage', function ($scope, $http,) { + $scope.cyberpanelLoading = true; + $scope.AddAssignment = function () { + $scope.cyberpanelLoading = false; + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + package: $('#packageSelection').val(), + user: $scope.userSelection, + }; + + + dataurl = "/websites/AddAssignment"; + + $http.post(dataurl, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + function ListInitialDatas(response) { + $scope.cyberpanelLoading = true; + if (response.data.status === 1) { + new PNotify({ + title: 'Success', + text: 'Successfully saved.', + type: 'success' + }); + + // Reload page to show new assignment + setTimeout(function() { + location.reload(); + }, 1500); + + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.cyberpanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page.', + type: 'error' + }); + + + } + } + + var FinalDeletepackageURL; + $scope.Deleteassingment = function (url) { + FinalDeletepackageURL = url; + // console.log(FinalDeletepackageURL); + } + + $scope.ConfirmDelete = function () { + window.location.href = FinalDeletepackageURL + } + +}) +app.controller('createDockerSite', function ($scope, $http, $timeout) { + $scope.cyberpanelLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + var statusFile; + + $scope.createdockersite = function () { + + $scope.cyberpanelLoading = false; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + + $scope.currentStatus = "Starting creation.."; + + + url = "/websites/submitDockerSiteCreation"; + + var package = $scope.packageForWebsite; + + + var data = { + sitename: $scope.siteName, + Owner: $scope.userSelection, + Domain: $scope.domainNameCreate, + MysqlCPU: $scope.CPUMysql, + MYsqlRam: $scope.rammysql, + SiteCPU: $scope.CPUSite, + SiteRam: $scope.RamSite, + App: $scope.App, + WPusername: $scope.WPUsername, + WPemal: $scope.wpEmail, + WPpasswd: $scope.WPpassword + }; + + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + console.log('.........................') + if (response.data.installStatus === 1) { + console.log(response.data.installsatus) + statusFile = response.data.tempStatusPath; + getCreationStatus(); + } else { + + $scope.cyberpanelLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + } + + + } + + function cantLoadInitialDatas(response) { + + $scope.cyberpanelLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + }; + $scope.goBack = function () { + $scope.cyberpanelLoading = true; + $scope.installationDetailsForm = false; + $scope.installationProgress = true; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = true; + $("#installProgress").css("width", "0%"); + }; + + function getCreationStatus() { + + url = "/websites/installWordpressStatus"; + + var data = { + statusFile: statusFile + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.abort === 1) { + + if (response.data.installStatus === 1) { + + $scope.cyberpanelLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = false; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $("#installProgress").css("width", "100%"); + $scope.installPercentage = "100"; + $scope.currentStatus = response.data.currentStatus; + $timeout.cancel(); + + } else { + + $scope.cyberpanelLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = false; + $scope.success = true; + $scope.couldNotConnect = true; + $scope.goBackDisable = false; + + $scope.errorMessage = response.data.error_message; + + $("#installProgress").css("width", "0%"); + $scope.installPercentage = "0"; + $scope.goBackDisable = false; + + } + + } else { + $("#installProgress").css("width", response.data.installationProgress + "%"); + $scope.installPercentage = response.data.installationProgress; + $scope.currentStatus = response.data.currentStatus; + $timeout(getCreationStatus, 1000); + } + + } + + function cantLoadInitialDatas(response) { + + $scope.cyberpanelLoading = true; + $scope.installationDetailsForm = true; + $scope.installationProgress = false; + $scope.errorMessageBox = true; + $scope.success = true; + $scope.couldNotConnect = false; + $scope.goBackDisable = false; + + } + + + } + +}) + + +app.controller('listDockersite', function ($scope, $http) { + + $scope.cyberPanelLoading = true; + + + $scope.currentPage = 1; + $scope.recordsToShow = 10; + + $scope.fetchDockersiteFromDB = function () { + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + page: $scope.currentPage, + recordsToShow: $scope.recordsToShow + }; + + + dataurl = "/websites/fetchDockersite"; + + $http.post(dataurl, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.cyberPanelLoading = false; + if (response.data.listWebSiteStatus === 1) { + + $scope.WebSitesList = JSON.parse(response.data.data); + $scope.pagination = response.data.pagination; + $scope.clients = JSON.parse(response.data.data); + $("#listFail").hide(); + } else { + $("#listFail").fadeIn(); + $scope.errorMessage = response.data.error_message; + + } + } + + function cantLoadInitialData(response) { + $scope.cyberPanelLoading = false; + } + + + }; + $scope.fetchDockersiteFromDB(); + + $scope.cyberPanelLoading = true; + + + $scope.cyberPanelLoading = true; + + $scope.searchWebsites = function () { + + $scope.cyberPanelLoading = false; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + var data = { + patternAdded: $scope.patternAdded + }; + + dataurl = "/websites/searchWebsites"; + + $http.post(dataurl, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.cyberPanelLoading = true; + if (response.data.listWebSiteStatus === 1) { + + var finalData = JSON.parse(response.data.data); + $scope.WebSitesList = finalData; + $("#listFail").hide(); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + + } + } + + function cantLoadInitialData(response) { + $scope.cyberPanelLoading = true; + new PNotify({ + title: 'Operation Failed!', + text: 'Connect disrupted, refresh the page.', + type: 'error' + }); + } + + + }; + + $scope.getFurtherWebsitesFromDB = function () { + $scope.fetchDockersiteFromDB(); + }; + + var deletedockersiteurl; + $scope.DeleteDockersite = function (url, id) { + // console.log(url) + // console.log(id) + deletedockersiteurl = url + id; + } + + $scope.ConfirmDelete = function () { + window.location.href = deletedockersiteurl; + } + + +}); + + +app.controller('BuyAddons', function ($scope, $http) { + + + $scope.cyberpanelLoading = true; + $scope.sftpHide = true; + $scope.localHide = true; + + $scope.PaypalBuyNowAddons = function (planName, monthlyPrice, yearlyPrice, lifetime, months) { + + const baseURL = 'https://platform.cyberpersons.com/Billing/AddOnOrderPaypal'; + // Get the current URL + var currentURL = window.location.href; + +// Find the position of the question mark + const queryStringIndex = currentURL.indexOf('?'); + +// Check if there is a query string + currentURL = queryStringIndex !== -1 ? currentURL.substring(0, queryStringIndex) : currentURL; + + // Encode parameters to make them URL-safe + const params = new URLSearchParams({ + planName: planName, + monthlyPrice: monthlyPrice, + yearlyPrice: yearlyPrice, + returnURL: currentURL, // Add the current URL as a query parameter + months: months + }); + + // Build the complete URL with query string + const fullURL = `${baseURL}?${params.toString()}`; + + // Redirect to the constructed URL + + window.location.href = fullURL; + + } + +}) + +app.controller('launchChild', function ($scope, $http) { + + $scope.logFileLoading = true; + $scope.logsFeteched = true; + $scope.couldNotFetchLogs = true; + $scope.couldNotConnect = true; + $scope.fetchedData = true; + $scope.hideLogs = true; + $scope.hideErrorLogs = true; + + $scope.hidelogsbtn = function () { + $scope.hideLogs = true; + }; + + $scope.hideErrorLogsbtn = function () { + $scope.hideLogs = true; + }; + + // Watch for when the scope variables are initialized from ng-init + $scope.$watch('childDomainName', function(newVal) { + if (newVal) { + $scope.fileManagerURL = "/filemanager/" + $scope.masterDomain; + $scope.previewUrl = "/preview/" + $scope.childDomainName + "/"; + $scope.wordPressInstallURL = "/websites/" + $scope.childDomainName + "/wordpressInstall"; + $scope.joomlaInstallURL = "/websites/" + $scope.childDomainName + "/joomlaInstall"; + $scope.setupGit = "/websites/" + $scope.childDomainName + "/setupGit"; + $scope.installPrestaURL = "/websites/" + $scope.childDomainName + "/installPrestaShop"; + $scope.installMagentoURL = "/websites/" + $scope.childDomainName + "/installMagento"; + } + }); + + var logType = 0; + $scope.pageNumber = 1; + + $scope.fetchLogs = function (type) { + + var pageNumber = $scope.pageNumber; + + + if (type == 3) { + pageNumber = $scope.pageNumber + 1; + $scope.pageNumber = pageNumber; + } else if (type == 4) { + pageNumber = $scope.pageNumber - 1; + $scope.pageNumber = pageNumber; + } else { + logType = type; + } + + + $scope.logFileLoading = false; + $scope.logsFeteched = true; + $scope.couldNotFetchLogs = true; + $scope.couldNotConnect = true; + $scope.fetchedData = false; + $scope.hideErrorLogs = true; + + + url = "/websites/getDataFromLogFile"; + + var domainNamePage = $("#domainNamePage").text(); + + + var data = { + logType: logType, + virtualHost: domainNamePage, + page: pageNumber, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.logstatus === 1) { + + + $scope.logFileLoading = true; + $scope.logsFeteched = false; + $scope.couldNotFetchLogs = true; + $scope.couldNotConnect = true; + $scope.fetchedData = false; + $scope.hideLogs = false; + + + $scope.records = JSON.parse(response.data.data); + + } else { + + $scope.logFileLoading = true; + $scope.logsFeteched = true; + $scope.couldNotFetchLogs = false; + $scope.couldNotConnect = true; + $scope.fetchedData = true; + $scope.hideLogs = false; + + + $scope.errorMessage = response.data.error_message; + console.log(domainNamePage) + + } + + + } + + function cantLoadInitialDatas(response) { + + $scope.logFileLoading = true; + $scope.logsFeteched = true; + $scope.couldNotFetchLogs = true; + $scope.couldNotConnect = false; + $scope.fetchedData = true; + $scope.hideLogs = false; + + } + + + }; + + $scope.errorPageNumber = 1; + + + $scope.fetchErrorLogs = function (type) { + + var errorPageNumber = $scope.errorPageNumber; + + + if (type === 3) { + errorPageNumber = $scope.errorPageNumber + 1; + $scope.errorPageNumber = errorPageNumber; + } else if (type === 4) { + errorPageNumber = $scope.errorPageNumber - 1; + $scope.errorPageNumber = errorPageNumber; + } else { + logType = type; + } + + // notifications + + $scope.logFileLoading = false; + $scope.logsFeteched = true; + $scope.couldNotFetchLogs = true; + $scope.couldNotConnect = true; + $scope.fetchedData = true; + $scope.hideErrorLogs = true; + $scope.hideLogs = false; + + + url = "/websites/fetchErrorLogs"; + + var domainNamePage = $("#domainNamePage").text(); + + + var data = { + virtualHost: domainNamePage, + page: errorPageNumber, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.logstatus === 1) { + + + // notifications + + $scope.logFileLoading = true; + $scope.logsFeteched = false; + $scope.couldNotFetchLogs = true; + $scope.couldNotConnect = true; + $scope.fetchedData = true; + $scope.hideLogs = false; + $scope.hideErrorLogs = false; + + + $scope.errorLogsData = response.data.data; + + } else { + + // notifications + + $scope.logFileLoading = true; + $scope.logsFeteched = true; + $scope.couldNotFetchLogs = false; + $scope.couldNotConnect = true; + $scope.fetchedData = true; + $scope.hideLogs = true; + $scope.hideErrorLogs = true; + + + $scope.errorMessage = response.data.error_message; + + } + + + } + + function cantLoadInitialDatas(response) { + + // notifications + + $scope.logFileLoading = true; + $scope.logsFeteched = true; + $scope.couldNotFetchLogs = true; + $scope.couldNotConnect = false; + $scope.fetchedData = true; + $scope.hideLogs = true; + $scope.hideErrorLogs = true; + + } + + + }; + + ///////// Configurations Part + + $scope.configurationsBox = true; + $scope.configsFetched = true; + $scope.couldNotFetchConfigs = true; + $scope.couldNotConnect = true; + $scope.fetchedConfigsData = true; + $scope.configFileLoading = true; + $scope.configSaved = true; + $scope.couldNotSaveConfigurations = true; + + $scope.hideconfigbtn = function () { + + $scope.configurationsBox = true; + }; + + $scope.fetchConfigurations = function () { + + + $scope.hidsslconfigs = true; + $scope.configurationsBoxRewrite = true; + $scope.changePHPView = true; + + + //Rewrite rules + $scope.configurationsBoxRewrite = true; + $scope.rewriteRulesFetched = true; + $scope.couldNotFetchRewriteRules = true; + $scope.rewriteRulesSaved = true; + $scope.couldNotSaveRewriteRules = true; + $scope.fetchedRewriteRules = true; + $scope.saveRewriteRulesBTN = true; + + /// + + $scope.configFileLoading = false; + + + url = "/websites/getDataFromConfigFile"; + + var virtualHost = $("#childDomain").text(); + + + var data = { + virtualHost: virtualHost, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.configstatus === 1) { + + //Rewrite rules + + $scope.configurationsBoxRewrite = true; + $scope.rewriteRulesFetched = true; + $scope.couldNotFetchRewriteRules = true; + $scope.rewriteRulesSaved = true; + $scope.couldNotSaveRewriteRules = true; + $scope.fetchedRewriteRules = true; + $scope.saveRewriteRulesBTN = true; + + /// + + $scope.configurationsBox = false; + $scope.configsFetched = false; + $scope.couldNotFetchConfigs = true; + $scope.couldNotConnect = true; + $scope.fetchedConfigsData = false; + $scope.configFileLoading = true; + $scope.configSaved = true; + $scope.couldNotSaveConfigurations = true; + $scope.saveConfigBtn = false; + + + $scope.configData = response.data.configData; + + } else { + + //Rewrite rules + $scope.configurationsBoxRewrite = true; + $scope.rewriteRulesFetched = true; + $scope.couldNotFetchRewriteRules = true; + $scope.rewriteRulesSaved = true; + $scope.couldNotSaveRewriteRules = true; + $scope.fetchedRewriteRules = true; + $scope.saveRewriteRulesBTN = true; + + /// + $scope.configurationsBox = false; + $scope.configsFetched = true; + $scope.couldNotFetchConfigs = false; + $scope.couldNotConnect = true; + $scope.fetchedConfigsData = true; + $scope.configFileLoading = true; + $scope.configSaved = true; + $scope.couldNotSaveConfigurations = true; + + + $scope.errorMessage = response.data.error_message; + + } + + + } + + function cantLoadInitialDatas(response) { + + //Rewrite rules + $scope.configurationsBoxRewrite = true; + $scope.rewriteRulesFetched = true; + $scope.couldNotFetchRewriteRules = true; + $scope.rewriteRulesSaved = true; + $scope.couldNotSaveRewriteRules = true; + $scope.fetchedRewriteRules = true; + $scope.saveRewriteRulesBTN = true; + /// + + $scope.configurationsBox = false; + $scope.configsFetched = true; + $scope.couldNotFetchConfigs = true; + $scope.couldNotConnect = false; + $scope.fetchedConfigsData = true; + $scope.configFileLoading = true; + $scope.configSaved = true; + $scope.couldNotSaveConfigurations = true; + + + } + + + }; + + $scope.saveCongiruations = function () { + + $scope.configFileLoading = false; + + + url = "/websites/saveConfigsToFile"; + + var virtualHost = $("#childDomain").text(); + var configData = $scope.configData; + + + var data = { + virtualHost: virtualHost, + configData: configData, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.configstatus == 1) { + + $scope.configurationsBox = false; + $scope.configsFetched = true; + $scope.couldNotFetchConfigs = true; + $scope.couldNotConnect = true; + $scope.fetchedConfigsData = true; + $scope.configFileLoading = true; + $scope.configSaved = false; + $scope.couldNotSaveConfigurations = true; + $scope.saveConfigBtn = true; + + + } else { + $scope.configurationsBox = false; + $scope.configsFetched = true; + $scope.couldNotFetchConfigs = true; + $scope.couldNotConnect = true; + $scope.fetchedConfigsData = false; + $scope.configFileLoading = true; + $scope.configSaved = true; + $scope.couldNotSaveConfigurations = false; + + + $scope.errorMessage = response.data.error_message; + + } + + + } + + function cantLoadInitialDatas(response) { + + $scope.configurationsBox = false; + $scope.configsFetched = true; + $scope.couldNotFetchConfigs = true; + $scope.couldNotConnect = false; + $scope.fetchedConfigsData = true; + $scope.configFileLoading = true; + $scope.configSaved = true; + $scope.couldNotSaveConfigurations = true; + + + } + + + }; + + + ///////// Rewrite Rules + + $scope.configurationsBoxRewrite = true; + $scope.rewriteRulesFetched = true; + $scope.couldNotFetchRewriteRules = true; + $scope.rewriteRulesSaved = true; + $scope.couldNotSaveRewriteRules = true; + $scope.fetchedRewriteRules = true; + $scope.saveRewriteRulesBTN = true; + + $scope.hideRewriteRulesbtn = function () { + $scope.configurationsBoxRewrite = true; + }; + + + $scope.fetchRewriteFules = function () { + + $scope.hidsslconfigs = true; + $scope.configurationsBox = true; + $scope.changePHPView = true; + + + $scope.configurationsBox = true; + $scope.configsFetched = true; + $scope.couldNotFetchConfigs = true; + $scope.couldNotConnect = true; + $scope.fetchedConfigsData = true; + $scope.configFileLoading = true; + $scope.configSaved = true; + $scope.couldNotSaveConfigurations = true; + $scope.saveConfigBtn = true; + + $scope.configFileLoading = false; + + + url = "/websites/getRewriteRules"; + + var virtualHost = $("#childDomain").text(); + + + var data = { + virtualHost: virtualHost, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.rewriteStatus == 1) { + + + // from main + + $scope.configurationsBox = true; + $scope.configsFetched = true; + $scope.couldNotFetchConfigs = true; + $scope.fetchedConfigsData = true; + $scope.configSaved = true; + $scope.couldNotSaveConfigurations = true; + $scope.saveConfigBtn = true; + + // main ends + + $scope.configFileLoading = true; + + // + + + $scope.configurationsBoxRewrite = false; + $scope.rewriteRulesFetched = false; + $scope.couldNotFetchRewriteRules = true; + $scope.rewriteRulesSaved = true; + $scope.couldNotSaveRewriteRules = true; + $scope.fetchedRewriteRules = false; + $scope.saveRewriteRulesBTN = false; + $scope.couldNotConnect = true; + + + $scope.rewriteRules = response.data.rewriteRules; + + } else { + // from main + $scope.configurationsBox = true; + $scope.configsFetched = true; + $scope.couldNotFetchConfigs = true; + $scope.fetchedConfigsData = true; + $scope.configFileLoading = true; + $scope.configSaved = true; + $scope.couldNotSaveConfigurations = true; + $scope.saveConfigBtn = true; + // from main + + $scope.configFileLoading = true; + + /// + + $scope.configurationsBoxRewrite = true; + $scope.rewriteRulesFetched = true; + $scope.couldNotFetchRewriteRules = false; + $scope.rewriteRulesSaved = true; + $scope.couldNotSaveRewriteRules = true; + $scope.fetchedRewriteRules = true; + $scope.saveRewriteRulesBTN = true; + $scope.couldNotConnect = true; + + + $scope.errorMessage = response.data.error_message; + + } + + + } + + function cantLoadInitialDatas(response) { + // from main + + $scope.configurationsBox = true; + $scope.configsFetched = true; + $scope.couldNotFetchConfigs = true; + $scope.fetchedConfigsData = true; + $scope.configFileLoading = true; + $scope.configSaved = true; + $scope.couldNotSaveConfigurations = true; + $scope.saveConfigBtn = true; + + // from main + + $scope.configFileLoading = true; + + /// + + $scope.configurationsBoxRewrite = true; + $scope.rewriteRulesFetched = true; + $scope.couldNotFetchRewriteRules = true; + $scope.rewriteRulesSaved = true; + $scope.couldNotSaveRewriteRules = true; + $scope.fetchedRewriteRules = true; + $scope.saveRewriteRulesBTN = true; + + $scope.couldNotConnect = false; + + + } + + + }; + + $scope.saveRewriteRules = function () { + + $scope.configFileLoading = false; + + + url = "/websites/saveRewriteRules"; + + var virtualHost = $("#childDomain").text(); + var rewriteRules = $scope.rewriteRules; + + + var data = { + virtualHost: virtualHost, + rewriteRules: rewriteRules, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.rewriteStatus == 1) { + + $scope.configurationsBoxRewrite = false; + $scope.rewriteRulesFetched = true; + $scope.couldNotFetchRewriteRules = true; + $scope.rewriteRulesSaved = false; + $scope.couldNotSaveRewriteRules = true; + $scope.fetchedRewriteRules = true; + $scope.saveRewriteRulesBTN = true; + $scope.configFileLoading = true; + + + } else { + $scope.configurationsBoxRewrite = false; + $scope.rewriteRulesFetched = false; + $scope.couldNotFetchRewriteRules = true; + $scope.rewriteRulesSaved = true; + $scope.couldNotSaveRewriteRules = false; + $scope.fetchedRewriteRules = true; + $scope.saveRewriteRulesBTN = false; + + $scope.configFileLoading = true; + + + $scope.errorMessage = response.data.error_message; + + } + + + } + + function cantLoadInitialDatas(response) { + + $scope.configurationsBoxRewrite = false; + $scope.rewriteRulesFetched = false; + $scope.couldNotFetchRewriteRules = true; + $scope.rewriteRulesSaved = true; + $scope.couldNotSaveRewriteRules = true; + $scope.fetchedRewriteRules = true; + $scope.saveRewriteRulesBTN = false; + + $scope.configFileLoading = true; + + $scope.couldNotConnect = false; + + + } + + + }; + + + //////// SSL Part + + $scope.sslSaved = true; + $scope.couldNotSaveSSL = true; + $scope.hidsslconfigs = true; + $scope.couldNotConnect = true; + + + $scope.hidesslbtn = function () { + $scope.hidsslconfigs = true; + }; + + $scope.addSSL = function () { + $scope.hidsslconfigs = false; + $scope.configurationsBox = true; + $scope.configurationsBoxRewrite = true; + $scope.changePHPView = true; + }; + + + $scope.saveSSL = function () { + + + $scope.configFileLoading = false; + + url = "/websites/saveSSL"; + + var virtualHost = $("#childDomain").text(); + var cert = $scope.cert; + var key = $scope.key; + + + var data = { + virtualHost: virtualHost, + cert: cert, + key: key, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + if (response.data.sslStatus === 1) { + + $scope.sslSaved = false; + $scope.couldNotSaveSSL = true; + $scope.couldNotConnect = true; + $scope.configFileLoading = true; + + + } else { + + $scope.sslSaved = true; + $scope.couldNotSaveSSL = false; + $scope.couldNotConnect = true; + $scope.configFileLoading = true; + + $scope.errorMessage = response.data.error_message; + + } + + + } + + function cantLoadInitialDatas(response) { + + $scope.sslSaved = true; + $scope.couldNotSaveSSL = true; + $scope.couldNotConnect = false; + $scope.configFileLoading = true; + + + } + + }; + + + //// Change PHP Master + + $scope.failedToChangePHPMaster = true; + $scope.phpChangedMaster = true; + $scope.couldNotConnect = true; + + $scope.changePHPView = true; + + + $scope.hideChangePHPMaster = function () { + $scope.changePHPView = true; + }; + + $scope.changePHPMaster = function () { + $scope.hidsslconfigs = true; + $scope.configurationsBox = true; + $scope.configurationsBoxRewrite = true; + $scope.changePHPView = false; + }; + + + $scope.changePHPVersionMaster = function (childDomain, phpSelection) { + + // notifcations + + $scope.configFileLoading = false; + + var url = "/websites/changePHP"; + + var data = { + childDomain: $("#childDomain").text(), + phpSelection: $scope.phpSelectionMaster, + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.changePHP === 1) { + + $scope.configFileLoading = true; + $scope.websiteDomain = $("#childDomain").text(); + + + // notifcations + + $scope.failedToChangePHPMaster = true; + $scope.phpChangedMaster = false; + $scope.couldNotConnect = true; + + + } else { + + $scope.configFileLoading = true; + $scope.errorMessage = response.data.error_message; + + // notifcations + + $scope.failedToChangePHPMaster = false; + $scope.phpChangedMaster = true; + $scope.couldNotConnect = true; + + } + + + } + + function cantLoadInitialDatas(response) { + + $scope.configFileLoading = true; + + // notifcations + + $scope.failedToChangePHPMaster = true; + $scope.phpChangedMaster = true; + $scope.couldNotConnect = false; + + } + + }; + + + /// Open_basedir protection + + $scope.baseDirLoading = true; + $scope.operationFailed = true; + $scope.operationSuccessfull = true; + $scope.couldNotConnect = true; + $scope.openBaseDirBox = true; + + + $scope.openBaseDirView = function () { + $scope.openBaseDirBox = false; + }; + + $scope.hideOpenBasedir = function () { + $scope.openBaseDirBox = true; + }; + + $scope.applyOpenBasedirChanges = function (childDomain, phpSelection) { + + // notifcations + + $scope.baseDirLoading = false; + $scope.operationFailed = true; + $scope.operationSuccessfull = true; + $scope.couldNotConnect = true; + $scope.openBaseDirBox = false; + + + var url = "/websites/changeOpenBasedir"; + + var data = { + domainName: $("#childDomain").text(), + openBasedirValue: $scope.openBasedirValue + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); + + + function ListInitialDatas(response) { + + + if (response.data.changeOpenBasedir === 1) { + + $scope.baseDirLoading = true; + $scope.operationFailed = true; + $scope.operationSuccessfull = false; + $scope.couldNotConnect = true; + $scope.openBaseDirBox = false; + + } else { + + $scope.baseDirLoading = true; + $scope.operationFailed = false; + $scope.operationSuccessfull = true; + $scope.couldNotConnect = true; + $scope.openBaseDirBox = false; + + $scope.errorMessage = response.data.error_message; + + } + + + } + + function cantLoadInitialDatas(response) { + + $scope.baseDirLoading = true; + $scope.operationFailed = true; + $scope.operationSuccessfull = true; + $scope.couldNotConnect = false; + $scope.openBaseDirBox = false; + + + } + + } + +}); \ No newline at end of file diff --git a/static/websiteFunctions/websiteFunctions.js b/static/websiteFunctions/websiteFunctions.js index 1089c21b5..f6c5f9dcb 100644 --- a/static/websiteFunctions/websiteFunctions.js +++ b/static/websiteFunctions/websiteFunctions.js @@ -5,7 +5,14 @@ // Ensure app is available (get existing module or create reference) // This ensures compatibility with the global app variable from system-status.js if (typeof app === 'undefined') { - app = angular.module('CyberCP'); + // First try to get window.app (set by system-status.js) + if (typeof window !== 'undefined' && typeof window.app !== 'undefined') { + app = window.app; + } else { + // If window.app doesn't exist, get the existing CyberCP module + // This works because system-status.js should have already created it + app = angular.module('CyberCP'); + } } // Global function for deleting staging sites diff --git a/websiteFunctions/static/websiteFunctions/websiteFunctions.js b/websiteFunctions/static/websiteFunctions/websiteFunctions.js index f178d4810..dd86b2455 100644 --- a/websiteFunctions/static/websiteFunctions/websiteFunctions.js +++ b/websiteFunctions/static/websiteFunctions/websiteFunctions.js @@ -2,6 +2,19 @@ * Created by usman on 7/26/17. */ +// Ensure app is available (get existing module or create reference) +// This ensures compatibility with the global app variable from system-status.js +if (typeof app === 'undefined') { + // First try to get window.app (set by system-status.js) + if (typeof window !== 'undefined' && typeof window.app !== 'undefined') { + app = window.app; + } else { + // If window.app doesn't exist, get the existing CyberCP module + // This works because system-status.js should have already created it + app = angular.module('CyberCP'); + } +} + // Global function for deleting staging sites function deleteStagingGlobal(stagingId) { if (confirm("Are you sure you want to delete this staging site? This action cannot be undone.")) { @@ -10730,39 +10743,6 @@ $("#modifyWebsiteLoading").hide(); $("#modifyWebsiteButton").hide(); app.controller('modifyWebsitesController', function ($scope, $http) { - - // Initialize home directory variables - $scope.homeDirectories = []; - $scope.selectedHomeDirectory = ''; - $scope.selectedHomeDirectoryInfo = null; - $scope.currentHomeDirectory = ''; - - // Load home directories on page load - $scope.loadHomeDirectories = function() { - $http.post('/userManagement/getUserHomeDirectories/', {}) - .then(function(response) { - if (response.data.status === 1) { - $scope.homeDirectories = response.data.directories; - } - }) - .catch(function(error) { - console.error('Error loading home directories:', error); - }); - }; - - // Update home directory info when selection changes - $scope.updateHomeDirectoryInfo = function() { - if ($scope.selectedHomeDirectory) { - $scope.selectedHomeDirectoryInfo = $scope.homeDirectories.find(function(dir) { - return dir.id == $scope.selectedHomeDirectory; - }); - } else { - $scope.selectedHomeDirectoryInfo = null; - } - }; - - // Initialize home directories - $scope.loadHomeDirectories(); $scope.fetchWebsites = function () { @@ -10807,7 +10787,6 @@ app.controller('modifyWebsitesController', function ($scope, $http) { $scope.webpacks = JSON.parse(response.data.packages); $scope.adminNames = JSON.parse(response.data.adminNames); $scope.currentAdmin = response.data.currentAdmin; - $scope.currentHomeDirectory = response.data.currentHomeDirectory || 'Default'; $("#webSiteDetailsToBeModified").fadeIn(); $("#websiteModifySuccess").fadeIn(); @@ -10835,7 +10814,6 @@ app.controller('modifyWebsitesController', function ($scope, $http) { var email = $scope.adminEmail; var phpVersion = $scope.phpSelection; var admin = $scope.selectedAdmin; - var homeDirectory = $scope.selectedHomeDirectory; $("#websiteModifyFailure").hide(); @@ -10852,8 +10830,7 @@ app.controller('modifyWebsitesController', function ($scope, $http) { packForWeb: packForWeb, email: email, phpVersion: phpVersion, - admin: admin, - homeDirectory: homeDirectory + admin: admin }; var config = { @@ -13325,16 +13302,6 @@ app.controller('manageAliasController', function ($scope, $http, $timeout, $wind $scope.manageAliasLoading = true; $scope.operationSuccess = true; - // Initialize the page to show aliases list - $scope.showAliasesList = function() { - $scope.aliasTable = true; - $scope.addAliasButton = true; - $scope.domainAliasForm = false; - }; - - // Auto-show aliases list on page load - $scope.showAliasesList(); - $scope.createAliasEnter = function ($event) { var keyCode = $event.which || $event.keyCode; if (keyCode === 13) { @@ -13582,64 +13549,6 @@ app.controller('manageAliasController', function ($scope, $http, $timeout, $wind }; - $scope.issueAliasSSL = function (masterDomain, aliasDomain) { - $scope.manageAliasLoading = false; - - url = "/websites/issueAliasSSL"; - - var data = { - masterDomain: masterDomain, - aliasDomain: aliasDomain - }; - - var config = { - headers: { - 'X-CSRFToken': getCookie('csrftoken') - } - }; - - $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas); - - function ListInitialDatas(response) { - if (response.data.issueAliasSSL === 1) { - $scope.aliasTable = false; - $scope.addAliasButton = true; - $scope.domainAliasForm = true; - $scope.aliasError = true; - $scope.couldNotConnect = true; - $scope.aliasCreated = true; - $scope.manageAliasLoading = true; - $scope.operationSuccess = false; - - $timeout(function () { - $window.location.reload(); - }, 3000); - } else { - $scope.aliasTable = false; - $scope.addAliasButton = true; - $scope.domainAliasForm = true; - $scope.aliasError = false; - $scope.couldNotConnect = true; - $scope.aliasCreated = true; - $scope.manageAliasLoading = true; - $scope.operationSuccess = true; - - $scope.errorMessage = response.data.error_message; - } - } - - function cantLoadInitialDatas(response) { - $scope.aliasTable = false; - $scope.addAliasButton = true; - $scope.domainAliasForm = true; - $scope.aliasError = true; - $scope.couldNotConnect = false; - $scope.aliasCreated = true; - $scope.manageAliasLoading = true; - $scope.operationSuccess = true; - } - }; - ////// create domain part