mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2026-03-06 04:10:44 +01:00
File Manager App
This commit is contained in:
@@ -678,7 +678,7 @@
|
||||
DKIM Manager</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#"
|
||||
<a href="{% url 'EmailDebuggerV2' %}"
|
||||
class="flex items-center w-full text-base font-normal text-white transition duration-75 rounded-lg group hover:bg-cyan-400 dark:text-white dark:hover:bg-gray-700 pl-11">•
|
||||
Email Debugger</a>
|
||||
</li>
|
||||
@@ -1676,6 +1676,8 @@
|
||||
<script src="{% static 'databases/databasesV2.js' %}"></script>
|
||||
<script src="{% static 'dns/dnsV2.js' %}"></script>
|
||||
<script src="{% static 'mailServer/mailServerV2.js' %}"></script>
|
||||
<script src="{% static 'emailPremium/emailPremiumV2.js' %}"></script>
|
||||
<script src="{% static 'filemanager/js/fileManagerV2.js' %}"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
301
emailPremium/static/emailPremium/emailPremiumV2.js
Normal file
301
emailPremium/static/emailPremium/emailPremiumV2.js
Normal file
@@ -0,0 +1,301 @@
|
||||
newapp.controller('EmailDebuugerV2', function ($scope, $http, $timeout, $window) {
|
||||
|
||||
$scope.cyberpanelLoading = true;
|
||||
$scope.ExecutionStatus = true;
|
||||
$scope.ReportStatus = true;
|
||||
|
||||
|
||||
$scope.RunServerLevelEmailChecks = function () {
|
||||
$scope.cyberpanelLoading = false;
|
||||
|
||||
var url = "/emailPremium/RunServerLevelEmailChecks";
|
||||
|
||||
var data = {};
|
||||
|
||||
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) {
|
||||
statusFile = response.data.tempStatusPath;
|
||||
reportFile = response.data.reportFile;
|
||||
statusFunc();
|
||||
|
||||
|
||||
} else {
|
||||
new PNotify({
|
||||
title: 'Operation Failed!',
|
||||
text: response.data.error_message,
|
||||
type: 'error'
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function cantLoadInitialData(response) {
|
||||
$scope.cyberpanelLoading = true;
|
||||
|
||||
new PNotify({
|
||||
title: 'Error',
|
||||
text: 'Could not connect to server, please refresh this page.',
|
||||
type: 'error'
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
function statusFunc() {
|
||||
$scope.cyberpanelLoading = false;
|
||||
$scope.ExecutionStatus = false;
|
||||
var url = "/emailPremium/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;
|
||||
$scope.ReadReport();
|
||||
$timeout.cancel();
|
||||
} 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.ReadReport = function () {
|
||||
|
||||
if (reportFile === 'none') {
|
||||
return;
|
||||
}
|
||||
|
||||
$scope.cyberpanelLoading = false;
|
||||
|
||||
var url = "/emailPremium/ReadReport";
|
||||
|
||||
var data = {
|
||||
reportFile: reportFile
|
||||
};
|
||||
|
||||
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) {
|
||||
var reportResult = JSON.parse(response.data.reportContent);
|
||||
|
||||
if (reportResult.MailSSL === 1) {
|
||||
$scope.MailSSL = 'Issued and Valid';
|
||||
} else {
|
||||
$scope.MailSSL = 'Not issued or expired.'
|
||||
}
|
||||
var report = response.data.report;
|
||||
|
||||
console.log(report);
|
||||
$scope.Port25 = report.Port25;
|
||||
$scope.Port587 = report.Port587;
|
||||
$scope.Port465 = report.Port465;
|
||||
$scope.Port110 = report.Port110;
|
||||
$scope.Port143 = report.Port143;
|
||||
$scope.Port993 = report.Port993;
|
||||
$scope.Port995 = report.Port995;
|
||||
//document.getElementById('MailSSLURL').href = 'https://' + report.serverHostName + ":" + report.port + '/cloudAPI/access?token=' + report.token + "&serverUserName=" + report.userName + '&redirect=/manageSSL/sslForMailServer';
|
||||
document.getElementById('MailSSLURL').href = '/manageSSL/sslForMailServer';
|
||||
|
||||
|
||||
$scope.ReportStatus = false;
|
||||
} else {
|
||||
new PNotify({
|
||||
title: 'Operation Failed!',
|
||||
text: response.data.error_message,
|
||||
type: 'error'
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function cantLoadInitialData(response) {
|
||||
$scope.cyberpanelLoading = true;
|
||||
new PNotify({
|
||||
title: 'Error',
|
||||
text: 'Could not connect to server, please refresh this page.',
|
||||
type: 'error'
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
$scope.ResetEmailConfigurations = function () {
|
||||
$scope.cyberpanelLoading = false;
|
||||
|
||||
var url = "/emailPremium/ResetEmailConfigurations";
|
||||
|
||||
var data = {};
|
||||
|
||||
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) {
|
||||
statusFile = response.data.tempStatusPath;
|
||||
reportFile = response.data.reportFile;
|
||||
reportFile = 'none';
|
||||
statusFunc();
|
||||
|
||||
|
||||
} else {
|
||||
new PNotify({
|
||||
title: 'Operation Failed!',
|
||||
text: response.data.error_message,
|
||||
type: 'error'
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function cantLoadInitialData(response) {
|
||||
$scope.cyberpanelLoading = true;
|
||||
|
||||
new PNotify({
|
||||
title: 'Error',
|
||||
text: 'Could not connect to server, please refresh this page.',
|
||||
type: 'error'
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
newapp.controller('emailDebuggerDomainLevelV2', function ($scope, $http, $timeout, $window) {
|
||||
$scope.cyberpanelLoading = true;
|
||||
$scope.ReportStatus = true;
|
||||
|
||||
$scope.debugEmailForSite = function () {
|
||||
$scope.cyberpanelLoading = false;
|
||||
|
||||
url = "/emailPremium/debugEmailForSite";
|
||||
|
||||
var data = {
|
||||
websiteName: $scope.websiteName
|
||||
};
|
||||
var config = {
|
||||
headers: {
|
||||
'X-CSRFToken': getCookie('csrftoken')
|
||||
}
|
||||
};
|
||||
|
||||
$http.post(url, data, config).then(ListInitialData, cantLoadInitialData);
|
||||
|
||||
|
||||
function ListInitialData(response) {
|
||||
$scope.cyberpanelLoading = true;
|
||||
$scope.status = response.data.status;
|
||||
$scope.message = response.data.error_message;
|
||||
$scope.ReportStatus = false;
|
||||
|
||||
}
|
||||
|
||||
function cantLoadInitialData(response) {
|
||||
$scope.cyberhosting = true;
|
||||
new PNotify({
|
||||
title: 'Operation Failed!',
|
||||
text: 'Could not connect to server, please refresh this page.',
|
||||
type: 'error'
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
$scope.fixMailSSL = function () {
|
||||
$scope.cyberpanelLoading = false;
|
||||
url = "/emailPremium/fixMailSSL";
|
||||
|
||||
var data = {
|
||||
websiteName: $scope.websiteName
|
||||
};
|
||||
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: 'Successfully fixed.',
|
||||
type: 'success'
|
||||
});
|
||||
} 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'
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
});
|
||||
252
emailPremium/templates/emailPremium/EmailDebuggerV2.html
Normal file
252
emailPremium/templates/emailPremium/EmailDebuggerV2.html
Normal file
@@ -0,0 +1,252 @@
|
||||
{% extends "baseTemplate/newBase.html" %}
|
||||
{% load i18n %}
|
||||
{% block titleNew %}{% trans "Home - CyberPanel" %}{% endblock %}
|
||||
{% block newContent %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
<div ng-controller="EmailDebuugerV2" class="p-8">
|
||||
<div>
|
||||
<p class="text-4xl font-bold">Email Debugger</p>
|
||||
<p class="text-xs text-gray-600 py-2 font-semibold">Email debugger to fix server-wide or website level email
|
||||
settings.</p>
|
||||
</div>
|
||||
<div>
|
||||
<div class="flex items-center py-4">
|
||||
<p class="text-xl font-bold">DEBUG EMAIL SERVER</p>
|
||||
<img ng-hide="cyberpanelLoading" src="{% static 'images/loading.gif' %}">
|
||||
</div>
|
||||
<hr>
|
||||
|
||||
<div class="flex gap-5 mt-4">
|
||||
<button class="flex items-center text-orange-500 font-bold px-2 py-2 shadow-lg rounded-lg border-2 border-orange-500"
|
||||
ng-click="RunServerLevelEmailChecks()">
|
||||
<span>Run Sever Level Check</span>
|
||||
<img ng-hide="cyberpanelLoading" src="{% static 'images/loading.gif' %}"></button>
|
||||
<button class="flex items-center text-orange-500 font-bold px-2 py-2 shadow-lg rounded-lg border-2 border-orange-500"
|
||||
ng-click="ResetEmailConfigurations()">
|
||||
<span>Reset Server wide Email Configurations</span>
|
||||
<img ng-hide="cyberpanelLoading" src="{% static 'images/loading.gif' %}"></button>
|
||||
</div>
|
||||
<div ng-controller="emailDebuggerDomainLevelV2">
|
||||
<div class="flex items-center py-4">
|
||||
<p class="text-xl font-bold">WEBSITE LEVEL EMAIL ISSUES</p>
|
||||
<img ng-hide="cyberpanelLoading" src="{% static 'images/loading.gif' %}">
|
||||
</div>
|
||||
<hr>
|
||||
<div class="flex mt-4 py-2 px-6">
|
||||
<div>
|
||||
<p class="font-semibold w-60">Websites</p>
|
||||
</div>
|
||||
<div>
|
||||
<select ng-model="websiteName" class="form-control w-80 bg-gray-100 rounded px-2 py-1"
|
||||
ng-change="debugEmailForSite()"
|
||||
id="example-select">
|
||||
{% for items in websiteList %}
|
||||
<option>{{ items }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div ng-hide="ReportStatus" class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Status
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Actions
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="border shadow-lg py-3 px-6 rounded-b-lg">
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
{$ message $}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
<button ng-click="fixMailSSL()" ng-disabled='status==1' data-toggle="modal"
|
||||
title="Manage CyberPanel" type="button"
|
||||
class="bg-orange-500 text-white font-bold px-2 py-1">
|
||||
Fix Now
|
||||
</button>
|
||||
<button ng-click="fixMailSSL()" data-toggle="modal"
|
||||
title="Manage CyberPanel" type="button"
|
||||
class="bg-orange-500 text-white font-bold px-2 py-1">
|
||||
Force Fix
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-center items-center font-bold text-xl">
|
||||
<h2>{$ functionStatus $}</h2>
|
||||
<img ng-hide="cyberpanelLoading" src="{% static 'images/loading.gif' %}">
|
||||
</div>
|
||||
<div class="w-full bg-gray-100 rounded-full mt-3">
|
||||
<div id="installProgress"
|
||||
class="bg-green-600 text-xs font-medium text-white text-center p-2 leading-none rounded-full"
|
||||
style="width:0%" ng-style="functionProgress">
|
||||
</div>
|
||||
</div>
|
||||
<div ng-hide="ReportStatus" class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Issue
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Status
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Actions
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="border shadow-lg py-3 px-6 rounded-b-lg">
|
||||
<tr>
|
||||
<td class="px-6 py-3">
|
||||
Mail Server SSL
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
{$ MailSSL $}
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
<a id="MailSSLURL" target="_blank" href="#">
|
||||
<button data-toggle="modal" title="Manage CyberPanel" type="button"
|
||||
class="bg-orange-500 text-white font-bold px-2 py-1">
|
||||
Issue Now
|
||||
</button>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-3">
|
||||
Port 25
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
{$ Port25 $}
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
<a id="MailSSLURL" target="_blank"
|
||||
href="https://cyberpanel.net/blog/test-smtp-connection/?utm_source=cyberpanel&utm_medium=cyberpanel&utm_campaign=from-cyberpanel&utm_id=from-cyberpanel">
|
||||
<button data-toggle="modal" title="Manage CyberPanel" type="button"
|
||||
class="bg-orange-500 text-white font-bold px-2 py-1">
|
||||
Learn More
|
||||
</button>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-3">
|
||||
Port 587
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
{$ Port587 $}
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
<a id="MailSSLURL" target="_blank"
|
||||
href="https://cyberpanel.net/blog/test-smtp-connection/?utm_source=cyberpanel&utm_medium=cyberpanel&utm_campaign=from-cyberpanel&utm_id=from-cyberpanel">
|
||||
<button data-toggle="modal" title="Manage CyberPanel" type="button"
|
||||
class="bg-orange-500 text-white font-bold px-2 py-1">
|
||||
Learn More
|
||||
</button>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-3">
|
||||
Port 465
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
{$ Port465 $}
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
<a id="MailSSLURL" target="_blank"
|
||||
href="https://cyberpanel.net/blog/test-smtp-connection/?utm_source=cyberpanel&utm_medium=cyberpanel&utm_campaign=from-cyberpanel&utm_id=from-cyberpanel">
|
||||
<button data-toggle="modal" title="Manage CyberPanel" type="button"
|
||||
class="bg-orange-500 text-white font-bold px-2 py-1">
|
||||
Learn More
|
||||
</button>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-3">
|
||||
Port 110
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
{$ Port110 $}
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
<a id="MailSSLURL" target="_blank"
|
||||
href="https://cyberpanel.net/blog/test-smtp-connection/?utm_source=cyberpanel&utm_medium=cyberpanel&utm_campaign=from-cyberpanel&utm_id=from-cyberpanel">
|
||||
<button data-toggle="modal" title="Manage CyberPanel" type="button"
|
||||
class="bg-orange-500 text-white font-bold px-2 py-1">
|
||||
Learn More
|
||||
</button>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-3">
|
||||
Port 143
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
{$ Port143 $}
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
<a id="MailSSLURL" target="_blank"
|
||||
href="https://cyberpanel.net/blog/test-smtp-connection/?utm_source=cyberpanel&utm_medium=cyberpanel&utm_campaign=from-cyberpanel&utm_id=from-cyberpanel">
|
||||
<button data-toggle="modal" title="Manage CyberPanel" type="button"
|
||||
class="bg-orange-500 text-white font-bold px-2 py-1">
|
||||
Learn More
|
||||
</button>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-3">
|
||||
Port 995
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
{$ Port995 $}
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
<a id="MailSSLURL" target="_blank"
|
||||
href="https://cyberpanel.net/blog/test-smtp-connection/?utm_source=cyberpanel&utm_medium=cyberpanel&utm_campaign=from-cyberpanel&utm_id=from-cyberpanel">
|
||||
<button data-toggle="modal" title="Manage CyberPanel" type="button"
|
||||
class="bg-orange-500 text-white font-bold px-2 py-1">
|
||||
Learn More
|
||||
</button>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-3">
|
||||
Port 993
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
{$ Port993 $}
|
||||
</td>
|
||||
<td class="px-6 py-3">
|
||||
<a id="MailSSLURL" target="_blank"
|
||||
href="https://cyberpanel.net/blog/test-smtp-connection/?utm_source=cyberpanel&utm_medium=cyberpanel&utm_campaign=from-cyberpanel&utm_id=from-cyberpanel">
|
||||
<button data-toggle="modal" title="Manage CyberPanel" type="button"
|
||||
class="bg-orange-500 text-white font-bold px-2 py-1">
|
||||
Learn More
|
||||
</button>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -59,6 +59,7 @@ urlpatterns = [
|
||||
url(r'^RestartRspamd$', views.RestartRspamd, name='RestartRspamd'),
|
||||
|
||||
url(r'^EmailDebugger$', views.EmailDebugger, name='EmailDebugger'),
|
||||
url(r'^V2/EmailDebuggerV2$', views.EmailDebuggerV2, name='EmailDebuggerV2'),
|
||||
|
||||
url(r'^RunServerLevelEmailChecks$', views.RunServerLevelEmailChecks, name='RunServerLevelEmailChecks'),
|
||||
url(r'^ResetEmailConfigurations$', views.ResetEmailConfigurations, name='ResetEmailConfigurations'),
|
||||
|
||||
@@ -1260,6 +1260,7 @@ def Rspamd(request):
|
||||
else:
|
||||
return redirect("https://cyberpanel.net/cyberpanel-addons")
|
||||
|
||||
|
||||
def installRspamd(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1298,6 +1299,7 @@ def installRspamd(request):
|
||||
final_json = json.dumps(final_dic)
|
||||
return HttpResponse(final_json)
|
||||
|
||||
|
||||
def installStatusRspamd(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1321,7 +1323,7 @@ def installStatusRspamd(request):
|
||||
'abort': 1,
|
||||
'installed': 1,
|
||||
})
|
||||
cmd = 'rm -f %s'%mailUtilities.RspamdInstallLogPath
|
||||
cmd = 'rm -f %s' % mailUtilities.RspamdInstallLogPath
|
||||
ProcessUtilities.executioner(cmd)
|
||||
return HttpResponse(final_json)
|
||||
|
||||
@@ -1355,6 +1357,7 @@ def installStatusRspamd(request):
|
||||
final_json = json.dumps(final_dic)
|
||||
return HttpResponse(final_json)
|
||||
|
||||
|
||||
def fetchRspamdSettings(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1487,14 +1490,14 @@ def fetchRspamdSettings(request):
|
||||
read_servers = j[1]
|
||||
# logging.CyberCPLogFileWriter.writeToFile(str(read_servers) + "read_servers")
|
||||
|
||||
#ClamAV configs
|
||||
# ClamAV configs
|
||||
|
||||
clamav_Debug = True
|
||||
LogFile = ''
|
||||
TCPAddr = ''
|
||||
TCPSocket = ''
|
||||
|
||||
if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8:
|
||||
if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8:
|
||||
clamavconfpath = '/etc/clamd.d/scan.conf'
|
||||
elif ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
|
||||
clamavconfpath = "/etc/clamav/clamd.conf"
|
||||
@@ -1518,7 +1521,6 @@ def fetchRspamdSettings(request):
|
||||
else:
|
||||
clamav_Debug = True
|
||||
|
||||
|
||||
final_dic = {'fetchStatus': 1,
|
||||
'installed': 1,
|
||||
'enabled': enabled,
|
||||
@@ -1553,6 +1555,7 @@ def fetchRspamdSettings(request):
|
||||
except KeyError:
|
||||
return redirect(loadLoginPage)
|
||||
|
||||
|
||||
def saveRspamdConfigurations(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1589,6 +1592,7 @@ def saveRspamdConfigurations(request):
|
||||
except KeyError:
|
||||
return redirect(loadLoginPage)
|
||||
|
||||
|
||||
def savepostfixConfigurations(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1625,6 +1629,7 @@ def savepostfixConfigurations(request):
|
||||
except KeyError:
|
||||
return redirect(loadLoginPage)
|
||||
|
||||
|
||||
def saveRedisConfigurations(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1661,6 +1666,7 @@ def saveRedisConfigurations(request):
|
||||
except KeyError:
|
||||
return redirect(loadLoginPage)
|
||||
|
||||
|
||||
def saveclamavConfigurations(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1697,6 +1703,7 @@ def saveclamavConfigurations(request):
|
||||
except KeyError:
|
||||
return redirect(loadLoginPage)
|
||||
|
||||
|
||||
def unistallRspamd(request):
|
||||
try:
|
||||
logging.CyberCPLogFileWriter.writeToFile("unistallRspamd...1")
|
||||
@@ -1708,14 +1715,12 @@ def unistallRspamd(request):
|
||||
else:
|
||||
return ACLManager.loadErrorJson()
|
||||
|
||||
|
||||
try:
|
||||
|
||||
execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/mailUtilities.py"
|
||||
execPath = execPath + " uninstallRspamd"
|
||||
ProcessUtilities.popenExecutioner(execPath)
|
||||
|
||||
|
||||
final_json = json.dumps({'status': 1, 'error_message': "None"})
|
||||
return HttpResponse(final_json)
|
||||
except BaseException as msg:
|
||||
@@ -1732,6 +1737,7 @@ def unistallRspamd(request):
|
||||
|
||||
return HttpResponse(final_json)
|
||||
|
||||
|
||||
def uninstallStatusRspamd(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1789,6 +1795,7 @@ def uninstallStatusRspamd(request):
|
||||
final_json = json.dumps(final_dic)
|
||||
return HttpResponse(final_json)
|
||||
|
||||
|
||||
def FetchRspamdLog(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1837,7 +1844,7 @@ def RestartRspamd(request):
|
||||
|
||||
ProcessUtilities.executioner(command)
|
||||
|
||||
dic = {'status': 1, 'error_message': 'None',}
|
||||
dic = {'status': 1, 'error_message': 'None', }
|
||||
json_data = json.dumps(dic)
|
||||
return HttpResponse(json_data)
|
||||
except BaseException as msg:
|
||||
@@ -1880,6 +1887,36 @@ def EmailDebugger(request):
|
||||
else:
|
||||
return redirect("https://cyberpanel.net/cyberpanel-addons")
|
||||
|
||||
|
||||
def EmailDebuggerV2(request):
|
||||
url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission"
|
||||
data = {
|
||||
"name": "email-debugger",
|
||||
"IP": ACLManager.GetServerIP()
|
||||
}
|
||||
|
||||
import requests
|
||||
response = requests.post(url, data=json.dumps(data))
|
||||
Status = response.json()['status']
|
||||
|
||||
if (Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent:
|
||||
userID = request.session['userID']
|
||||
currentACL = ACLManager.loadedACL(userID)
|
||||
|
||||
if currentACL['admin'] == 1:
|
||||
pass
|
||||
else:
|
||||
return ACLManager.loadErrorJson()
|
||||
currentACL = ACLManager.loadedACL(userID)
|
||||
websitesName = ACLManager.findAllSites(currentACL, userID)
|
||||
|
||||
proc = httpProc(request, 'emailPremium/EmailDebuggerV2.html',
|
||||
{'websiteList': websitesName}, 'admin')
|
||||
return proc.render()
|
||||
else:
|
||||
return redirect("https://cyberpanel.net/cyberpanel-addons")
|
||||
|
||||
|
||||
def RunServerLevelEmailChecks(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1926,6 +1963,7 @@ def ResetEmailConfigurations(request):
|
||||
json_data = json.dumps(dic)
|
||||
return HttpResponse(json_data)
|
||||
|
||||
|
||||
def statusFunc(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1949,6 +1987,7 @@ def statusFunc(request):
|
||||
json_data = json.dumps(dic)
|
||||
return HttpResponse(json_data)
|
||||
|
||||
|
||||
def ReadReport(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -1964,7 +2003,7 @@ def ReadReport(request):
|
||||
res = ob.ReadReport()
|
||||
Result = json.loads(res.content)
|
||||
status = Result['status']
|
||||
#fetch Ip
|
||||
# fetch Ip
|
||||
IP = ACLManager.GetServerIP()
|
||||
if status == 1:
|
||||
def CheckPort(port):
|
||||
@@ -2024,7 +2063,7 @@ def ReadReport(request):
|
||||
final_json = json.dumps(finalResult)
|
||||
return HttpResponse(final_json)
|
||||
else:
|
||||
return 0 , Result
|
||||
return 0, Result
|
||||
except BaseException as msg:
|
||||
logging.CyberCPLogFileWriter.writeToFile("Result....3:" + str(msg))
|
||||
else:
|
||||
@@ -2034,6 +2073,7 @@ def ReadReport(request):
|
||||
except KeyError:
|
||||
return redirect(loadLoginPage)
|
||||
|
||||
|
||||
def debugEmailForSite(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
@@ -2054,6 +2094,7 @@ def debugEmailForSite(request):
|
||||
except KeyError:
|
||||
return redirect(loadLoginPage)
|
||||
|
||||
|
||||
def fixMailSSL(request):
|
||||
try:
|
||||
userID = request.session['userID']
|
||||
|
||||
1819
filemanager/static/filemanager/js/fileManagerV2.js
Normal file
1819
filemanager/static/filemanager/js/fileManagerV2.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1 +1,426 @@
|
||||
<h1>habbi test</h1>
|
||||
{% extends "baseTemplate/newBase.html" %}
|
||||
{% load i18n %}
|
||||
{% block titleNew %}{% trans "Home - CyberPanel" %}{% endblock %}
|
||||
{% block newContent %}
|
||||
|
||||
{# <head>#}
|
||||
{# <title>{% trans "File Manager - CyberPanel" %}</title>#}
|
||||
{# <!-- Required meta tags -->#}
|
||||
{# <meta charset="utf-8">#}
|
||||
{# <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">#}
|
||||
{##}
|
||||
{# {% load static %}#}
|
||||
{# <link rel="icon" type="image/png" href="{% static 'baseTemplate/assets/finalBase/favicon.png' %}">#}
|
||||
{##}
|
||||
{# <!-- Angular JS -->#}
|
||||
{##}
|
||||
{##}
|
||||
{# <!-- Fix for old browsers -->#}
|
||||
{# <script src="{% static 'filemanager/js/es5-shim.min.js' %}"></script>#}
|
||||
{# <script src="{% static 'filemanager/js/es5-sham.min.js' %}"></script>#}
|
||||
{# <script src="{% static 'filemanager/js/jquery-1.8.3.min.js' %}"></script>#}
|
||||
{# <script src="{% static 'filemanager/js/console-sham.js' %}"></script>#}
|
||||
{##}
|
||||
{# <!--<script src="../bower_components/angular/angular.js"></script>-->#}
|
||||
{# <script src="{% static 'filemanager/js/angular-file-upload.min.js' %}"></script>#}
|
||||
{##}
|
||||
{##}
|
||||
{# <!-- HTML Editor Include -->#}
|
||||
{##}
|
||||
{# </head>#}
|
||||
|
||||
<div ng-controller="fileManagerCtrlV2" class="p-8">
|
||||
<div class="flex py-2 px-6 items-center gap-4">
|
||||
<div>
|
||||
<p class="font-bold w-32">Current Path</p>
|
||||
</div>
|
||||
<div>
|
||||
<input type="text" class="w-80 bg-gray-100 rounded px-2 py-1" id="currentRPath" ng-model="currentRPath"
|
||||
readonly>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="flex text-orange-500">
|
||||
<a href="#" onclick="return false;" ng-click="fetchChilds($event,currentRPath,'primary')">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" class="w-6 h-6">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15"/>
|
||||
</svg>
|
||||
</a>
|
||||
<a onclick="return false;"
|
||||
ng-click="fetchForTableSecondary($event,'fromTree',completeStartingPath)" href="#">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5"
|
||||
stroke="currentColor" class="w-6 h-6">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M2.25 12.75V12A2.25 2.25 0 0 1 4.5 9.75h15A2.25 2.25 0 0 1 21.75 12v.75m-8.69-6.44-2.12-2.12a1.5 1.5 0 0 0-1.061-.44H4.5A2.25 2.25 0 0 0 2.25 6v12a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18V9a2.25 2.25 0 0 0-2.25-2.25h-5.379a1.5 1.5 0 0 1-1.06-.44Z"/>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="" class="ml-2">{$ startingPath $}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="py-4">
|
||||
<div>
|
||||
<ul class="flex justify-between bg-blue-200 py-5 px-5 rounded-lg shadow-lg font-semibold">
|
||||
<li>
|
||||
<a class="cursor-pointer" onclick="return false;" ng-click="showUploadBox()"
|
||||
data-modal-target="upload"
|
||||
data-modal-toggle="upload"><i
|
||||
class="fa fa-upload" aria-hidden="true"></i> {% trans "Upload" %}</a>
|
||||
<div id="upload" tabindex="-1"
|
||||
class="hidden overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50 justify-center items-center w-full md:inset-0 h-[calc(100%-1rem)] max-h-full">
|
||||
<div class="relative p-4 w-full max-w-2xl max-h-full">
|
||||
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
|
||||
<div class="flex items-center bg-blue-400 px-2 py-4">
|
||||
<button type="button" data-modal-toggle="upload"
|
||||
class="absolute top-2 end-1 text-black bg-transparent hover:text-black rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center"
|
||||
data-modal-hide="upload">
|
||||
<svg class="w-3 h-3" aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg" fill="none"
|
||||
viewBox="0 0 14 14">
|
||||
<path stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="2"
|
||||
d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
||||
</svg>
|
||||
<span class="sr-only">Close modal</span>
|
||||
</button>
|
||||
<h5 class="text-2xl font-bold">{% trans "Upload File " %}-</h5>
|
||||
|
||||
<a class="text-white text-sm"
|
||||
target="_blank"
|
||||
href="https://go.cyberpanel.net/upload-limits"
|
||||
title="">{% trans " Upload Limits" %}</a>
|
||||
</div>
|
||||
<div class="p-4 md:p-5">
|
||||
<div class="mt-4">
|
||||
<h3 class="text-xl">{% trans "Upload queue" %}</h3>
|
||||
<p>{% trans "Queue length:" %} {$ uploader.queue.length $}</p>
|
||||
<div>
|
||||
<div nv-file-over="" uploader="uploader">
|
||||
<div>
|
||||
<h4 class="font-bold mt-4">{% trans "Drop" %}</h4>
|
||||
<p class="card-text">{% trans "Drop Files here to upload them." %}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<div>
|
||||
<label class="text-xl"
|
||||
for="uploadControlMultiple">{% trans "Upload" %}</label>
|
||||
</div>
|
||||
<div>
|
||||
<input type="file" nv-file-select="" uploader="uploader"
|
||||
class="form-control-file" id="uploadControlMultiple"
|
||||
multiple>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Name
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Size
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Progress
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Status
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Actions
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody ng-repeat="item in uploader.queue"
|
||||
class="border shadow-lg py-3 px-6 rounded-b-lg">
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
<strong>{$ item.file.name $}</strong>
|
||||
</td>
|
||||
<td ng-show="uploader.isHTML5" nowrap class="px-6 py-4">
|
||||
{$ item.file.size / 1024 / 1024 | number:2 $} MB
|
||||
</td>
|
||||
<td ng-show="uploader.isHTML5" class="px-6 py-4">
|
||||
<div class="progress" style="margin-bottom: 0;">
|
||||
<div class="progress-bar" role="progressbar"
|
||||
ng-style="{ 'width': item.progress + '%' }"></div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
<span ng-show="item.isSuccess"><i class="fa fa-check"
|
||||
aria-hidden="true"></i></span>
|
||||
<span ng-show="item.isCancel"><i class="fa fa-ban"
|
||||
aria-hidden="true"></i></span>
|
||||
<span ng-show="item.isError"><i class="fa fa-trash"
|
||||
aria-hidden="true"></i></span>
|
||||
</td>
|
||||
<td nowrap class="px-6 py-4">
|
||||
<button type="button" class="btn btn-success btn-sm"
|
||||
ng-click="item.upload()"
|
||||
ng-disabled="item.isReady || item.isUploading || item.isSuccess">
|
||||
<i class="fa fa-upload"
|
||||
aria-hidden="true"></i> {% trans "Upload" %}
|
||||
</button>
|
||||
<button type="button" class="btn btn-warning btn-sm"
|
||||
ng-click="item.cancel()"
|
||||
ng-disabled="!item.isUploading">
|
||||
<i class="fa fa-ban"
|
||||
aria-hidden="true"></i> {% trans "Cancel" %}
|
||||
</button>
|
||||
<button type="button" class="btn btn-danger btn-sm"
|
||||
ng-click="item.remove()">
|
||||
<i class="fa fa-trash"
|
||||
aria-hidden="true"></i> {% trans "Remove" %}
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div>
|
||||
<div id="queueProg">
|
||||
{% trans "Queue progress:" %}
|
||||
<div class="progress" style="">
|
||||
<div class="progress-bar" role="progressbar"
|
||||
ng-style="{ 'width': uploader.progress + '%' }"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div ng-hide="errorMessage" class="alert alert-danger" role="alert">
|
||||
{$ fileName $} {% trans "can not be uploaded, Error message:" %}
|
||||
{$ error_message $}
|
||||
</div>
|
||||
|
||||
<div class="flex gap-2 justify-center mt-4">
|
||||
<button type="button"
|
||||
class="text-white bg-green-600 hover:bg-green-800 focus:ring-4 focus:outline-none focus:ring-green-300 dark:focus:ring-green-800 font-medium rounded-lg text-sm inline-flex items-center px-5 py-2.5 text-center me-2"
|
||||
ng-click="uploader.uploadAll()"
|
||||
ng-disabled="!uploader.getNotUploadedItems().length">
|
||||
<i class="fa fa-upload"
|
||||
aria-hidden="true"></i> {% trans "Upload all" %}
|
||||
</button>
|
||||
<button type="button"
|
||||
class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10 dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600"
|
||||
ng-click="uploader.cancelAll()"
|
||||
ng-disabled="!uploader.isUploading">
|
||||
<i class="fa fa-ban"
|
||||
aria-hidden="true"></i> {% trans "Cancel all" %}
|
||||
</button>
|
||||
<button type="button"
|
||||
class="text-white bg-red-600 hover:bg-red-800 focus:ring-4 focus:outline-none focus:ring-red-300 dark:focus:ring-red-800 font-medium rounded-lg text-sm inline-flex items-center px-5 py-2.5 text-center me-2"
|
||||
ng-click="uploader.clearQueue()"
|
||||
ng-disabled="!uploader.queue.length">
|
||||
<i class="fa fa-trash"
|
||||
aria-hidden="true"></i> {% trans "Remove all" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<a onclick="return false;" ng-click="showCreateFileModal()" class="nav-link point-events"
|
||||
href="#" data-modal-target="newfile" data-modal-toggle="newfile"><i class="fa fa-plus-square"
|
||||
aria-hidden="true"></i> {% trans "New File" %}
|
||||
</a>
|
||||
<div id="newfile" tabindex="-1"
|
||||
class="hidden overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50 justify-center items-center w-full md:inset-0 h-[calc(100%-1rem)] max-h-full">
|
||||
<div class="relative p-4 w-full max-w-2xl max-h-full">
|
||||
<div class="relative bg-white shadow dark:bg-gray-700">
|
||||
<div class="flex items-center bg-blue-400 px-4 py-4">
|
||||
<p class="font-bold">Create New File</p>
|
||||
<button type="button" data-modal-toggle="newfile"
|
||||
class="absolute top-2 end-1 text-black bg-transparent hover:text-black rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center"
|
||||
data-modal-hide="newfile">
|
||||
<svg class="w-3 h-3" aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg" fill="none"
|
||||
viewBox="0 0 14 14">
|
||||
<path stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="2"
|
||||
d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
||||
</svg>
|
||||
<span class="sr-only">Close modal</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="p-4 md:p-5">
|
||||
<div>
|
||||
<div class="flex">
|
||||
<label class="w-80">{% trans "New File Name" %}</label>
|
||||
<input ng-keypress="createFileEnter($event)" ng-model="newFileName"
|
||||
type="text" class="form-control">
|
||||
</div>
|
||||
<small class="form-text text-muted">{% trans "File will be created in your current directory, if it already exists it will not overwirte." %}</small>
|
||||
<div class="flex justify-center mt-3">
|
||||
<button type="button" ng-click="createNewFile()"
|
||||
class="bg-orange-500 text-white font-bold px-4 py-1 text-xl">{% trans "Create File" %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div ng-hide="errorMessageFile" class="alert alert-danger" role="alert">
|
||||
{$error_message$}
|
||||
</div>
|
||||
<div ng-hide="createSuccess" class="alert alert-success" role="alert">
|
||||
{% trans "File Successfully created." %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<a onclick="return false;" ng-click="showCreateFolderModal()" class="nav-link point-events"
|
||||
href="#" data-modal-target="newfolder" data-modal-toggle="newfolder"><i class="fa fa-folder"
|
||||
aria-hidden="true"></i> {% trans "New Folder" %}
|
||||
</a>
|
||||
<div id="newfolder" tabindex="-1"
|
||||
class="hidden overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50 justify-center items-center w-full md:inset-0 h-[calc(100%-1rem)] max-h-full">
|
||||
<div class="relative p-4 w-full max-w-2xl max-h-full">
|
||||
<div class="relative bg-white shadow dark:bg-gray-700">
|
||||
<div class="flex items-center bg-blue-400 px-4 py-4">
|
||||
<p class="font-bold">Create New Folder</p>
|
||||
<button type="button" data-modal-toggle="newfolder"
|
||||
class="absolute top-2 end-1 text-black bg-transparent hover:text-black rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center"
|
||||
data-modal-hide="newfolder">
|
||||
<svg class="w-3 h-3" aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg" fill="none"
|
||||
viewBox="0 0 14 14">
|
||||
<path stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="2"
|
||||
d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
||||
</svg>
|
||||
<span class="sr-only">Close modal</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="p-4 md:p-5">
|
||||
<div>
|
||||
<div class="flex">
|
||||
<label class="w-80">{% trans "New File Name" %}</label>
|
||||
<input ng-keypress="createFolderEnter($event)" ng-model="newFolderName"
|
||||
type="text" class="form-control">
|
||||
</div>
|
||||
<small class="form-text text-muted">{% trans "Folder will be created in your current directory" %}</small>
|
||||
<div class="flex justify-center mt-3">
|
||||
<button type="button" ng-click="createNewFolder()"
|
||||
class="bg-orange-500 text-white font-bold px-4 py-1 text-xl">{% trans "Create Folder" %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div ng-hide="errorMessageFolder" class="alert alert-danger"
|
||||
role="alert">
|
||||
{$error_message$}
|
||||
</div>
|
||||
<div ng-hide="createSuccess" class="alert alert-success" role="alert">
|
||||
{% trans "Folder Successfully created." %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li id="deleteFile">
|
||||
<a onclick="return false;" ng-click="showDeleteModal()" class="nav-link point-events"
|
||||
href="#"><i
|
||||
class="fa fa-trash-o" aria-hidden="true"></i> {% trans "Delete" %}</a>
|
||||
</li>
|
||||
<li id="copyFile">
|
||||
<a onclick="return false;" ng-click="showCopyModal()" class="nav-link point-events" href="#"><i
|
||||
class="fa fa-files-o" aria-hidden="true"></i> {% trans "Copy" %}</a>
|
||||
</li>
|
||||
<li id="moveFile">
|
||||
<a onclick="return false;" ng-click="showMoveModal()" class="nav-link point-events" href="#"><i
|
||||
class="fa fa-arrows-alt" aria-hidden="true"></i> {% trans "Move" %}</a>
|
||||
</li>
|
||||
<li id="renameFile">
|
||||
<a onclick="return false;" ng-click="showRenameModal()" class="nav-link point-events"
|
||||
href="#"><i
|
||||
class="fa fa-file-text-o" aria-hidden="true"></i> {% trans "Rename" %}</a>
|
||||
</li>
|
||||
<li id="editFile">
|
||||
<a onclick="return false;" ng-click="showHTMLEditorModal()" class="nav-link point-events"
|
||||
href="#"><i class="fa fa-pencil-square-o" aria-hidden="true"></i> {% trans "Edit" %}</a>
|
||||
</li>
|
||||
<li id="compressFile">
|
||||
<a onclick="return false;" ng-click="showCompressionModal()" class="nav-link point-events"
|
||||
href="#"><i
|
||||
class="fa fa-compress" aria-hidden="true"></i> {% trans "Compress" %}</a>
|
||||
</li>
|
||||
<li id="extractFile">
|
||||
<a onclick="return false;" ng-click="showExtractionModal()" class="nav-link point-events"
|
||||
href="#"><i class="fa fa-expand" aria-hidden="true"></i> {% trans "Extract" %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<ul class="flex py-5 px-5 gap-10 font-semibold">
|
||||
<li>
|
||||
<a onclick="return false;" ng-click="fetchForTableSecondary($event,'homeFetch')"
|
||||
href="#"><i class="fa fa-home fa-lg" aria-hidden="true"></i> {% trans "Home" %}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a onclick="return false;" ng-click="fetchForTableSecondary($event,'goBackOnPath')"
|
||||
href="#"><i class="fa fa-arrow-left fa-lg"
|
||||
aria-hidden="true"></i> {% trans "Back" %}</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a onclick="return false;" ng-click="fetchForTableSecondary($event,'refresh')"
|
||||
href="#"><i class="fa fa-refresh fa-lg" aria-hidden="true"></i> {% trans "Refresh" %}</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a onclick="return false;" ng-click="selectAll()" href="#"><i
|
||||
class="fa fa-check-square-o fa-lg" aria-hidden="true"></i> {% trans "Select All" %}</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a onclick="return false;" ng-click="unSelectAll()" href="#"><i
|
||||
class="fa fa-square-o fa-lg" aria-hidden="true"></i> {% trans "UnSelect All" %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<div class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
<thead id="tableHead">
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
File Name
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Size (KB)
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Last Modified
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Permissions
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="tableBodyFiles">
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -74,154 +74,7 @@
|
||||
<div class="py-4">
|
||||
<p class="text-xl font-bold">Details To Configure Mail Clients</p>
|
||||
</div>
|
||||
<div class="flex gap-6">
|
||||
<div>
|
||||
<div ng-hide="creationBox" class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
POP3
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Details
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="border shadow-lg py-3 px-6 rounded-b-lg">
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
Server Hostname
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{$ serverHostname $}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
Port
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
110
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
Port
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
995 (SSL)
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
SSL
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
STARTTLS
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div ng-hide="creationBox" class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
IMAP
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Details
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="border shadow-lg py-3 px-6 rounded-b-lg">
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
Server Hostname
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{$ serverHostname $}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
Port
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
143
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
Port
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
993 (SSL)
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
SSL
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
STARTTLS
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div ng-hide="creationBox" class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
SMTP
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Details
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="border shadow-lg py-3 px-6 rounded-b-lg">
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
Server Hostname
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{$ serverHostname $}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
Port
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
25
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
Port
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
587 (SSL)
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
465 (SSL)
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
STARTTLS
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
<div ng-hide="creationBox" class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
@@ -258,6 +111,125 @@
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div ng-hide="creationBox" class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
<div class="bg-gray-200 mt-6 w-full rounded-t-lg border-b-2 border-gray-400">
|
||||
<p class="font-bold px-4 py-1">POP3</p>
|
||||
</div>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Server Hostname
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Port
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Port
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
SSL
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="border shadow-lg py-3 px-6 rounded-b-lg">
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
{$ serverHostname $}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
110
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
995 (SSL)
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
STARTTLS
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div ng-hide="creationBox" class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
<div class="bg-gray-200 mt-6 w-full rounded-t-lg border-b-2 border-gray-400">
|
||||
<p class="font-bold px-4 py-1">IMAP</p>
|
||||
</div>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Server Hostname
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Port
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Port
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
SSL
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="border shadow-lg py-3 px-6 rounded-b-lg">
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
{$ serverHostname $}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
143
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
993 (SSL)
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
STARTTLS
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div ng-hide="creationBox" class="relative py-5 overflow-x-auto">
|
||||
<table class="w-full text-sm text-left rtl:text-right">
|
||||
<div class="bg-gray-200 mt-6 w-full rounded-t-lg border-b-2 border-gray-400">
|
||||
<p class="font-bold px-4 py-1">SMTP</p>
|
||||
</div>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Server Hostname
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Port
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Port
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
465 SSL
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="border shadow-lg py-3 px-6 rounded-b-lg">
|
||||
<tr>
|
||||
<td class="px-6 py-4">
|
||||
{$ serverHostname $}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
25
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
587 (SSL)
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
STARTTLS
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
@@ -144,7 +144,8 @@
|
||||
</div>
|
||||
|
||||
|
||||
<button ng-click="deletePackageFinal(record.package)" data-modal-target="DeleteListUser_{$$index$}"
|
||||
<button ng-click="deletePackageFinal(record.package)"
|
||||
data-modal-target="DeleteListUser_{$$index$}"
|
||||
data-modal-toggle="DeleteListUser_{$$index$}"
|
||||
class="bg-orange-500 px-2 py-1 text-white"
|
||||
type="button">
|
||||
@@ -199,50 +200,52 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
<button class="btn btn-danger" data-modal-target="habitetest" data-modal-toggle="habitetest">check moda</button>
|
||||
<button class="btn btn-danger" data-modal-target="habitetest" data-modal-toggle="habitetest">check
|
||||
moda
|
||||
</button>
|
||||
<div id="habitetest" tabindex="-1"
|
||||
class="hidden overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50 justify-center items-center w-full md:inset-0 h-[calc(100%-1rem)] max-h-full">
|
||||
<div class="relative p-4 w-full max-w-md max-h-full">
|
||||
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
|
||||
<button type="button" data-modal-toggle="habitetest"
|
||||
class="absolute top-3 end-2.5 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white"
|
||||
data-modal-hide="habitetest">
|
||||
<svg class="w-3 h-3" aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg" fill="none"
|
||||
viewBox="0 0 14 14">
|
||||
<path stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="2"
|
||||
d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
||||
</svg>
|
||||
<span class="sr-only">Close modal</span>
|
||||
</button>
|
||||
<div class="p-4 md:p-5 text-center">
|
||||
<svg class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg" fill="none"
|
||||
viewBox="0 0 20 20">
|
||||
<path stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="2"
|
||||
d="M10 11V6m0 8h.01M19 10a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/>
|
||||
</svg>
|
||||
<h3 class="mb-5 text-lg font-normal text-gray-500 dark:text-gray-400">
|
||||
Are you sure you want to
|
||||
delete this user {$ UserToDelete $} ?</h3>
|
||||
<button ng-click="deleteUserFinal()" data-modal-hide="DeleteListUser"
|
||||
type="button"
|
||||
data-modal-toggle="DeleteListUser"
|
||||
class="text-white bg-red-600 hover:bg-red-800 focus:ring-4 focus:outline-none focus:ring-red-300 dark:focus:ring-red-800 font-medium rounded-lg text-sm inline-flex items-center px-5 py-2.5 text-center me-2">
|
||||
Yes, I'm sure
|
||||
</button>
|
||||
<button data-modal-hide="DeleteListUser" type="button"
|
||||
data-modal-toggle="DeleteListUser"
|
||||
class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10 dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600">
|
||||
No, cancel
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
class="hidden overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50 justify-center items-center w-full md:inset-0 h-[calc(100%-1rem)] max-h-full">
|
||||
<div class="relative p-4 w-full max-w-md max-h-full">
|
||||
<div class="relative bg-white rounded-lg shadow dark:bg-gray-700">
|
||||
<button type="button" data-modal-toggle="habitetest"
|
||||
class="absolute top-3 end-2.5 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white"
|
||||
data-modal-hide="habitetest">
|
||||
<svg class="w-3 h-3" aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg" fill="none"
|
||||
viewBox="0 0 14 14">
|
||||
<path stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="2"
|
||||
d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
|
||||
</svg>
|
||||
<span class="sr-only">Close modal</span>
|
||||
</button>
|
||||
<div class="p-4 md:p-5 text-center">
|
||||
<svg class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200"
|
||||
aria-hidden="true"
|
||||
xmlns="http://www.w3.org/2000/svg" fill="none"
|
||||
viewBox="0 0 20 20">
|
||||
<path stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="2"
|
||||
d="M10 11V6m0 8h.01M19 10a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/>
|
||||
</svg>
|
||||
<h3 class="mb-5 text-lg font-normal text-gray-500 dark:text-gray-400">
|
||||
Are you sure you want to
|
||||
delete this user {$ UserToDelete $} ?</h3>
|
||||
<button ng-click="deleteUserFinal()" data-modal-hide="DeleteListUser"
|
||||
type="button"
|
||||
data-modal-toggle="DeleteListUser"
|
||||
class="text-white bg-red-600 hover:bg-red-800 focus:ring-4 focus:outline-none focus:ring-red-300 dark:focus:ring-red-800 font-medium rounded-lg text-sm inline-flex items-center px-5 py-2.5 text-center me-2">
|
||||
Yes, I'm sure
|
||||
</button>
|
||||
<button data-modal-hide="DeleteListUser" type="button"
|
||||
data-modal-toggle="DeleteListUser"
|
||||
class="text-gray-500 bg-white hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 rounded-lg border border-gray-200 text-sm font-medium px-5 py-2.5 hover:text-gray-900 focus:z-10 dark:bg-gray-700 dark:text-gray-300 dark:border-gray-500 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-600">
|
||||
No, cancel
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<p class="text-4xl font-bold">Install WordPress</p>
|
||||
<p class="text-xs text-gray-600 py-2 font-semibold">Install WordPress with LSCache.</p>
|
||||
</div>
|
||||
<div>a
|
||||
<div>
|
||||
<div class="py-4">
|
||||
<h3 class="title-hero">
|
||||
<span id="domainNamePage">{{ domainName }}</span> - {% trans "Installation Details" %} - <a
|
||||
@@ -64,9 +64,9 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div ng-hide="installationDetailsForm" class="flex justify-center">
|
||||
<div ng-hide="installationDetailsForm" class="flex justify-center mt-3">
|
||||
<button ng-click="installWordPress()"
|
||||
class="bg-orange-500 px-3 py-4 rounded-lg text-xl font-semibold text-white">
|
||||
class="bg-orange-500 px-3 py-2 rounded-lg text-xl font-semibold text-white">
|
||||
Install Now
|
||||
</button>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user