feat: implement admin modules for RT log, document revisions, ferrit logs, and NCR creator, and add centralized common settings page
This commit is contained in:
+171
-255
@@ -1,278 +1,194 @@
|
|||||||
<?php function datagrid_scripts() {
|
<?php function datagrid_scripts()
|
||||||
?>
|
{
|
||||||
<!-- DevExtreme CSS -->
|
?>
|
||||||
<link rel="stylesheet" href="https://cdn3.devexpress.com/jslib/23.1.5/css/dx-diagram.css" />
|
<!-- DevExtreme CSS -->
|
||||||
|
<link rel="stylesheet" href="https://cdn3.devexpress.com/jslib/23.1.5/css/dx-diagram.css" />
|
||||||
|
|
||||||
<!-- DevExtreme Diagram JavaScript -->
|
<!-- DevExtreme Diagram JavaScript -->
|
||||||
<script src="https://cdn3.devexpress.com/jslib/23.1.5/js/dx-diagram.js"></script>
|
<script src="https://cdn3.devexpress.com/jslib/23.1.5/js/dx-diagram.js"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.4.0/polyfill.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.4.0/polyfill.min.js"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/exceljs/4.1.1/exceljs.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/exceljs/4.1.1/exceljs.min.js"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.2/FileSaver.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.2/FileSaver.min.js"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.0.0/jspdf.umd.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.0.0/jspdf.umd.min.js"></script>
|
||||||
<link rel="stylesheet" href="https://cdn3.devexpress.com/jslib/23.1.5/css/<?php echo setting("DevExpress_Theme", false,"dx.light.compact") ?>.css">
|
<link rel="stylesheet"
|
||||||
<!-- Quill CSS -->
|
href="https://cdn3.devexpress.com/jslib/23.1.5/css/<?php echo setting("DevExpress_Theme", false, "dx.light.compact") ?>">
|
||||||
<link rel="stylesheet" href="https://cdn.quilljs.com/1.3.7/quill.snow.css">
|
<!-- Quill CSS -->
|
||||||
|
<link rel=" stylesheet" href="https://cdn.quilljs.com/1.3.7/quill.snow.css">
|
||||||
|
|
||||||
<!-- Quill JS -->
|
<!-- Quill JS -->
|
||||||
<script src="https://cdn.quilljs.com/1.3.7/quill.min.js"></script>
|
<script src="https://cdn.quilljs.com/1.3.7/quill.min.js"></script>
|
||||||
|
|
||||||
|
|
||||||
<script type="text/javascript" src="https://cdn3.devexpress.com/jslib/23.1.5/js/dx.all.js"></script>
|
<script type="text/javascript" src="https://cdn3.devexpress.com/jslib/23.1.5/js/dx.all.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.4/moment.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.4/moment.min.js"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.0.0/jspdf.umd.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.0.0/jspdf.umd.min.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.dx-datagrid tr:nth-child(odd) {
|
.dx-datagrid tr:nth-child(odd) {
|
||||||
background-color:#e8e8e8;
|
background-color: #e8e8e8;
|
||||||
}
|
}
|
||||||
#dataGrid {
|
|
||||||
height: calc(100vh - 220px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dx-datagrid .dx-row > td, .dx-datagrid .dx-row > tr > td {
|
#dataGrid {
|
||||||
padding: 5px !important;
|
height: calc(100vh - 220px);
|
||||||
}
|
}
|
||||||
.dx-editor-cell .dx-texteditor .dx-texteditor-input {
|
|
||||||
height: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dx-datagrid .dx-row-lines > td {
|
.dx-datagrid .dx-row>td,
|
||||||
border-bottom: 1px solid #d2d2d2;
|
.dx-datagrid .dx-row>tr>td {
|
||||||
}
|
padding: 5px !important;
|
||||||
</style>
|
}
|
||||||
<?php
|
|
||||||
|
.dx-editor-cell .dx-texteditor .dx-texteditor-input {
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dx-datagrid .dx-row-lines>td {
|
||||||
|
border-bottom: 1px solid #d2d2d2;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<?php
|
||||||
} ?>
|
} ?>
|
||||||
|
|
||||||
<?php function datagrid_configurations() {
|
<?php function datagrid_configurations()
|
||||||
?>
|
{
|
||||||
toolbar: {
|
?>
|
||||||
items: [
|
toolbar: {
|
||||||
"addRowButton",
|
items: [
|
||||||
"applyFilterButton",
|
"addRowButton",
|
||||||
"columnChooserButton",
|
"applyFilterButton",
|
||||||
"revertButton",
|
"columnChooserButton",
|
||||||
"saveButton",
|
"revertButton",
|
||||||
"searchPanel",
|
"saveButton",
|
||||||
"exportButton",
|
"searchPanel",
|
||||||
"groupPanel",
|
"exportButton",
|
||||||
{
|
"groupPanel",
|
||||||
location: 'before',
|
{
|
||||||
widget: 'dxButton',
|
location: 'before',
|
||||||
options: {
|
widget: 'dxButton',
|
||||||
icon: 'filter',
|
options: {
|
||||||
text: '{{e2("Clear Filter")}}',
|
icon: 'filter',
|
||||||
onClick: function(e) {
|
text: '{{e2("Clear Filter")}}',
|
||||||
dataGrid.clearFilter();
|
onClick: function(e) {
|
||||||
}
|
dataGrid.clearFilter();
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
]
|
},
|
||||||
},
|
]
|
||||||
paging: {
|
},
|
||||||
pageSize: <?php echo setting('row_count') ?>,
|
paging: {
|
||||||
},
|
pageSize: <?php echo setting('row_count') ?>,
|
||||||
allowColumnResizing: true,
|
},
|
||||||
columnAutoWidth: true,
|
allowColumnResizing: true,
|
||||||
allowColumnReordering: true,
|
columnAutoWidth: true,
|
||||||
columnMinWidth: 150,
|
allowColumnReordering: true,
|
||||||
columnMaxWidth: 250,
|
columnMinWidth: 150,
|
||||||
columnResizingMode: "widget",
|
columnMaxWidth: 250,
|
||||||
showColumnLines: true,
|
columnResizingMode: "widget",
|
||||||
filterRow: { visible: true },
|
showColumnLines: true,
|
||||||
searchPanel: { visible: true },
|
filterRow: { visible: true },
|
||||||
columnFixing: {
|
searchPanel: { visible: true },
|
||||||
enabled: true
|
columnFixing: {
|
||||||
},
|
enabled: true
|
||||||
headerFilter: {
|
},
|
||||||
visible: true,
|
headerFilter: {
|
||||||
allowSearch: true,
|
visible: true,
|
||||||
},
|
allowSearch: true,
|
||||||
|
},
|
||||||
loadPanel: {
|
|
||||||
enabled: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
scrolling: {
|
|
||||||
mode: 'standart',
|
|
||||||
rowRenderingMode: 'infinite',
|
|
||||||
columnRenderingMode: 'infinite',
|
|
||||||
},
|
|
||||||
hoverStateEnabled: true,
|
|
||||||
showBorders: true,
|
|
||||||
|
|
||||||
remoteOperations: {
|
|
||||||
filtering: true,
|
|
||||||
paging: true,
|
|
||||||
sorting: true,
|
|
||||||
groupPaging: true,
|
|
||||||
grouping: true,
|
|
||||||
summary: true
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
onContextMenuPreparing: function(e) {
|
|
||||||
console.log("onContextMenuPreparing");
|
|
||||||
console.log(e);
|
|
||||||
if (e.target == "content") {
|
|
||||||
if (!e.items) e.items = [];
|
|
||||||
|
|
||||||
@if(isAuth($id, "modify"))
|
loadPanel: {
|
||||||
|
enabled: true,
|
||||||
|
},
|
||||||
|
|
||||||
e.items.push({
|
scrolling: {
|
||||||
text: "<?php echo e2("Clear Value") ?>",
|
mode: 'standart',
|
||||||
onItemClick: function(args) {
|
rowRenderingMode: 'infinite',
|
||||||
e.component.cellValue(e.rowIndex, e.columnIndex, null);
|
columnRenderingMode: 'infinite',
|
||||||
}
|
},
|
||||||
|
hoverStateEnabled: true,
|
||||||
});
|
showBorders: true,
|
||||||
|
|
||||||
@endif
|
remoteOperations: {
|
||||||
|
filtering: true,
|
||||||
|
paging: true,
|
||||||
|
sorting: true,
|
||||||
|
groupPaging: true,
|
||||||
|
grouping: true,
|
||||||
|
summary: true
|
||||||
|
},
|
||||||
|
|
||||||
@if(isAuth($id, "write"))
|
|
||||||
|
|
||||||
e.items.push({
|
|
||||||
text: "<?php echo e2("Clone Row") ?>",
|
|
||||||
onItemClick: function(args) {
|
|
||||||
$(".dx-icon-edit-button-addrow").trigger("click");
|
|
||||||
selectedData = e.row.data;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
@endif
|
onContextMenuPreparing: function(e) {
|
||||||
|
console.log("onContextMenuPreparing");
|
||||||
|
console.log(e);
|
||||||
|
if (e.target == "content") {
|
||||||
|
if (!e.items) e.items = [];
|
||||||
|
|
||||||
@if(isAuth($id, "modify"))
|
@if(isAuth($id, "modify"))
|
||||||
|
|
||||||
e.items.push({
|
e.items.push({
|
||||||
text: "<?php echo e2("Copy Start") ?>",
|
text: "<?php echo e2("Clear Value") ?>",
|
||||||
onItemClick: function(args) {
|
onItemClick: function(args) {
|
||||||
copyData = e.component.cellValue(e.rowIndex, e.columnIndex);
|
e.component.cellValue(e.rowIndex, e.columnIndex, null);
|
||||||
selectedColIndex = e.columnIndex;
|
}
|
||||||
selectedRowIndex = e.rowIndex;
|
|
||||||
console.log(e);
|
|
||||||
console.log(selectedColIndex);
|
|
||||||
console.log(selectedRowIndex);
|
|
||||||
Swal.fire(copyData, "<?php echo e2("Data copied start") ?>", "success");
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
e.items.push({
|
|
||||||
text: "<?php echo e2("Until Paste") ?>",
|
|
||||||
onItemClick: function(args) {
|
|
||||||
|
|
||||||
if(e.columnIndex != selectedColIndex) {
|
|
||||||
Swal.fire("<?php echo e2("Wrong") ?>", "<?php echo e2("Please copy using the same columns.") ?>", "error");
|
|
||||||
} else {
|
|
||||||
for(var rowIndex = selectedRowIndex + 1; rowIndex<=e.rowIndex; rowIndex++) {
|
|
||||||
e.component.cellValue(rowIndex, e.columnIndex, copyData);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
@endif
|
});
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onEditingStart(e) {
|
|
||||||
var focusedSelector = $("td.dx-focused");
|
|
||||||
var rowIndex = dataGrid.option("focusedRowIndex");
|
|
||||||
var colIndex = dataGrid.option("focusedColumnIndex");
|
|
||||||
try {
|
|
||||||
var dataField = e.column.dataField;
|
|
||||||
var allEntries = JSON.parse(localStorage.getItem("originalData" + rowIndex + colIndex)) || [];
|
|
||||||
allEntries.push(e.data[dataField]);
|
|
||||||
localStorage.setItem("originalData" + rowIndex + colIndex, JSON.stringify(allEntries));
|
|
||||||
} catch (error) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
|
@endif
|
||||||
onInitNewRow(e) {
|
|
||||||
|
|
||||||
if(selectedData) {
|
|
||||||
e.data = selectedData;
|
|
||||||
selectedData = null;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
onRowInserting(e) {
|
|
||||||
logEvent('RowInserting');
|
|
||||||
console.log(e);
|
|
||||||
},
|
|
||||||
|
|
||||||
onRowInserted() {
|
@if(isAuth($id, "write"))
|
||||||
// logEvent('RowInserted');
|
|
||||||
},
|
e.items.push({
|
||||||
onRowUpdating() {
|
text: "<?php echo e2("Clone Row") ?>",
|
||||||
},
|
onItemClick: function(args) {
|
||||||
onRowUpdated() {
|
$(".dx-icon-edit-button-addrow").trigger("click");
|
||||||
// logEvent('RowUpdated');
|
selectedData = e.row.data;
|
||||||
},
|
|
||||||
onRowRemoving() {
|
|
||||||
// logEvent('RowRemoving');
|
}
|
||||||
},
|
|
||||||
onRowRemoved() {
|
});
|
||||||
// logEvent('RowRemoved');
|
|
||||||
},
|
@endif
|
||||||
onSaving() {
|
|
||||||
|
@if(isAuth($id, "modify"))
|
||||||
},
|
|
||||||
onInitialized() {
|
e.items.push({
|
||||||
|
text: "<?php echo e2("Copy Start") ?>",
|
||||||
$("#dataGrid td").on("click", function() {
|
onItemClick: function(args) {
|
||||||
logEvent("#dataGrid td");
|
copyData = e.component.cellValue(e.rowIndex, e.columnIndex);
|
||||||
});
|
selectedColIndex = e.columnIndex;
|
||||||
},
|
selectedRowIndex = e.rowIndex;
|
||||||
onRowClick: function(e) {
|
console.log(e);
|
||||||
|
console.log(selectedColIndex);
|
||||||
/*
|
console.log(selectedRowIndex);
|
||||||
console.log("onRowClick");
|
Swal.fire(copyData, "<?php echo e2("Data copied start") ?>", "success");
|
||||||
console.log(e);
|
|
||||||
selectedData = e.data;
|
|
||||||
selectedData.id = null;
|
}
|
||||||
if(e.rowType === "data") {
|
|
||||||
e.component.editRow(e.rowIndex);
|
});
|
||||||
}
|
|
||||||
|
e.items.push({
|
||||||
*/
|
text: "<?php echo e2("Until Paste") ?>",
|
||||||
},
|
onItemClick: function(args) {
|
||||||
onSaved() {
|
|
||||||
|
if(e.columnIndex != selectedColIndex) {
|
||||||
logEvent('Saving Success');
|
Swal.fire("<?php echo e2("Wrong") ?>", "<?php echo e2("Please copy using the same columns.") ?>", "error");
|
||||||
},
|
} else {
|
||||||
onEditCanceling() {
|
for(var rowIndex = selectedRowIndex + 1; rowIndex<=e.rowIndex; rowIndex++) { e.component.cellValue(rowIndex,
|
||||||
// logEvent('EditCanceling');
|
e.columnIndex, copyData); } } } }); @endif } }, onEditingStart(e) { var focusedSelector=$("td.dx-focused"); var
|
||||||
},
|
rowIndex=dataGrid.option("focusedRowIndex"); var colIndex=dataGrid.option("focusedColumnIndex"); try { var
|
||||||
onEditCanceled() {
|
dataField=e.column.dataField; var allEntries=JSON.parse(localStorage.getItem("originalData" + rowIndex + colIndex)) ||
|
||||||
// logEvent('EditCanceled');
|
[]; allEntries.push(e.data[dataField]); localStorage.setItem("originalData" + rowIndex + colIndex,
|
||||||
},
|
JSON.stringify(allEntries)); } catch (error) { } }, onInitNewRow(e) { if(selectedData) { e.data=selectedData;
|
||||||
onFocusedRowChanging(e) {
|
selectedData=null; } }, onRowInserting(e) { logEvent('RowInserting'); console.log(e); }, onRowInserted() { //
|
||||||
// console.log(e);
|
logEvent('RowInserted'); }, onRowUpdating() { }, onRowUpdated() { // logEvent('RowUpdated'); }, onRowRemoving() { //
|
||||||
},
|
logEvent('RowRemoving'); }, onRowRemoved() { // logEvent('RowRemoved'); }, onSaving() { }, onInitialized() {
|
||||||
|
$("#dataGrid td").on("click", function() { logEvent("#dataGrid td"); }); }, onRowClick: function(e) { /*
|
||||||
|
console.log("onRowClick"); console.log(e); selectedData=e.data; selectedData.id=null; if(e.rowType==="data" ) {
|
||||||
sorting: {
|
e.component.editRow(e.rowIndex); } */ }, onSaved() { logEvent('Saving Success'); }, onEditCanceling() { //
|
||||||
mode: "multiple" // or "multiple" | "none"
|
logEvent('EditCanceling'); }, onEditCanceled() { // logEvent('EditCanceled'); }, onFocusedRowChanging(e) { //
|
||||||
},
|
console.log(e); }, sorting: { mode: "multiple" // or "multiple" | "none" }, <?php
|
||||||
|
|
||||||
|
|
||||||
<?php
|
|
||||||
} ?>
|
} ?>
|
||||||
@@ -185,7 +185,7 @@ $topButtons = [
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
function editorPreparing(e, dataRow) {
|
function editorPreparing(e, dataRow) {
|
||||||
<?php echo dxAutocomplete("subcontructer", "subcontractors", "company_name_en", ['job_description' => 'Montaj']); ?>
|
// <?php echo dxAutocomplete("subcontructer", "subcontractors", "company_name_en", ['job_description' => 'Montaj']); ?>
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ $relationDatas = [
|
|||||||
'html' => '<i class="fa fa-pdf"></i>'
|
'html' => '<i class="fa fa-pdf"></i>'
|
||||||
],
|
],
|
||||||
'ferrite_result' => [
|
'ferrite_result' => [
|
||||||
'datas' => db("results")->get(),
|
'datas' => [],
|
||||||
'pattern' => '{title}',
|
'pattern' => '{title}',
|
||||||
'type' => 'select-dropdown'
|
'type' => 'select-dropdown'
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ $outputFileName = "ncr_no";
|
|||||||
$numberColumn = "ncr_no";
|
$numberColumn = "ncr_no";
|
||||||
|
|
||||||
$relationDatas = [
|
$relationDatas = [
|
||||||
'subcontractor' => db("subcontractors")->select("company_name_ru")->get()->pluck("company_name_ru")->toArray(),
|
'subcontractor' => [],
|
||||||
'thirdparty' => db("subcontractors")->select("company_name_ru")->get()->pluck("company_name_ru")->toArray(),
|
'thirdparty' => [],
|
||||||
'contractor' => db("subcontractors")->select("company_name_ru")->get()->pluck("company_name_ru")->toArray(),
|
'contractor' => [],
|
||||||
'itp' => db("i_t_p_s")->groupBy("itp_no")->get()->pluck("itp_no")->toArray(),
|
'itp' => db("i_t_p_s")->groupBy("itp_no")->get()->pluck("itp_no")->toArray(),
|
||||||
];
|
];
|
||||||
?>
|
?>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ $relationDatas = [
|
|||||||
'html' => '<i class="fa fa-pdf"></i>'
|
'html' => '<i class="fa fa-pdf"></i>'
|
||||||
],
|
],
|
||||||
'rt_result' => [
|
'rt_result' => [
|
||||||
'datas' => db("results")->get(),
|
'datas' => [],
|
||||||
'pattern' => '{title}',
|
'pattern' => '{title}',
|
||||||
'type' => 'select-dropdown'
|
'type' => 'select-dropdown'
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,27 +1,27 @@
|
|||||||
<?php
|
<?php
|
||||||
if(getisset("update")) {
|
if (getisset("update")) {
|
||||||
// Wrap all updates in a single transaction to prevent deadlocks
|
// Wrap all updates in a single transaction to prevent deadlocks
|
||||||
DB::transaction(function() {
|
DB::transaction(function () {
|
||||||
foreach($_POST AS $key => $value) {
|
foreach ($_POST as $key => $value) {
|
||||||
// Skip CSRF token and other non-setting fields
|
// Skip CSRF token and other non-setting fields
|
||||||
if($key === '_token' || $key === 'update') {
|
if ($key === '_token' || $key === 'update') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle array values (like multi-select)
|
// Handle array values (like multi-select)
|
||||||
if(is_array($value)) {
|
if (is_array($value)) {
|
||||||
$value = json_encode($value);
|
$value = json_encode($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
firstOrUpdate([
|
firstOrUpdate([
|
||||||
'title' => $key,
|
'title' => $key,
|
||||||
'html' => $value
|
'html' => $value
|
||||||
],"settings",[
|
], "settings", [
|
||||||
'title' => $key
|
'title' => $key
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Show success message
|
// Show success message
|
||||||
echo "<div class='alert alert-success'>Settings updated successfully!</div>";
|
echo "<div class='alert alert-success'>Settings updated successfully!</div>";
|
||||||
}
|
}
|
||||||
@@ -29,245 +29,168 @@ if(getisset("update")) {
|
|||||||
?>
|
?>
|
||||||
<form action="?t={{get("t")}}&update" method="post">
|
<form action="?t={{get("t")}}&update" method="post">
|
||||||
@csrf
|
@csrf
|
||||||
{{e2("Project Name")}}:
|
{{e2("Project Name")}}:
|
||||||
<input type="text" name="project_name" value="{{setting('project_name')}}" class="form-control" id="">
|
<input type="text" name="project_name" value="{{setting('project_name')}}" class="form-control" id="">
|
||||||
{{e2("Project Russian Name ")}}:
|
{{e2("Project Russian Name ")}}:
|
||||||
<input type="text" name="project_name_ru" value="{{setting('project_name_ru')}}" class="form-control" id="">
|
<input type="text" name="project_name_ru" value="{{setting('project_name_ru')}}" class="form-control" id="">
|
||||||
{{e2("Project Number")}}:
|
{{e2("Project Number")}}:
|
||||||
<input type="text" name="project_number" value="{{setting('project_number')}}" class="form-control" id="">
|
<input type="text" name="project_number" value="{{setting('project_number')}}" class="form-control" id="">
|
||||||
{{e2("Company Code")}}:
|
{{e2("Company Code")}}:
|
||||||
<input type="text" name="company_code" value="{{setting('company_code')}}" class="form-control" id="">
|
<input type="text" name="company_code" value="{{setting('company_code')}}" class="form-control" id="">
|
||||||
{{e2("Default Table Row Count Per Page")}}:
|
{{e2("Default Table Row Count Per Page")}}:
|
||||||
<input type="number" name="row_count" value="{{setting('row_count')}}" class="form-control" id="">
|
<input type="number" name="row_count" value="{{setting('row_count')}}" class="form-control" id="">
|
||||||
{{e2("Register Creator Max Selection")}}:
|
|
||||||
<input type="number" name="register_creator_max_selection" value="{{setting('register_creator_max_selection', 50)}}" class="form-control" id="">
|
{{e2("Summary Mails")}} <small>{{e2("Virgüllerle ayırın")}}</small>:
|
||||||
{{e2("Summary Mails")}} <small>{{e2("Virgüllerle ayırın")}}</small>:
|
|
||||||
<input type="text" name="summary_mails" value="{{setting('summary_mails')}}" class="form-control" id="">
|
<input type="text" name="summary_mails" value="{{setting('summary_mails')}}" class="form-control" id="">
|
||||||
{{e2("Register Creator File Name Pattern")}} :
|
|
||||||
<input type="text" name="register_creator_file_name_pattern" value="{{setting('register_creator_file_name_pattern')}}" class="form-control" id="">
|
|
||||||
|
|
||||||
{{e2("Register Creator Repeat Row")}} :
|
|
||||||
<input type="text" name="register_creator_start_row" value="{{setting('register_creator_start_row')}}" class="form-control" id="">
|
|
||||||
{{e2("Register Creator Path")}} :
|
|
||||||
<input type="text" name="register_creator_path" value="{{setting('register_creator_path')}}" class="form-control" id="">
|
|
||||||
{{e2("Register Creator Column Based")}} :
|
|
||||||
<select name="register_creator_column_based" id="" class="form-control select2">
|
|
||||||
<?php $weldLogsColumns = table_columns("weld_logs");
|
|
||||||
$registerColumnBased = setting('register_creator_column_based');
|
|
||||||
?>
|
|
||||||
<option value="">Select</option>
|
|
||||||
@foreach($weldLogsColumns AS $weldLogsColumn)
|
|
||||||
<option value="{{$weldLogsColumn}}" @if($registerColumnBased == $weldLogsColumn) selected @endif>{{e2($weldLogsColumn)}}</option>
|
|
||||||
@endforeach
|
|
||||||
</select>
|
|
||||||
{{e2("Hand Over Zone Column")}} :
|
|
||||||
<select name="hand_over_zone_column" id="" class="form-control select2">
|
|
||||||
<?php $weldLogsColumns = table_columns("weld_logs");
|
|
||||||
$handOverZoneColumn = setting('hand_over_zone_column');
|
|
||||||
?>
|
|
||||||
<option value="">Select</option>
|
|
||||||
@foreach($weldLogsColumns AS $weldLogsColumn)
|
|
||||||
<option value="{{$weldLogsColumn}}" @if($handOverZoneColumn == $weldLogsColumn) selected @endif>{{e2($weldLogsColumn)}}</option>
|
|
||||||
@endforeach
|
|
||||||
</select>
|
|
||||||
{{e2("TP Register Creator Path")}} :
|
|
||||||
<input type="text" name="tp_register_creator_path" value="{{setting('tp_register_creator_path')}}" class="form-control" id="">
|
|
||||||
{{e2("Main Subcontractor")}}:
|
|
||||||
<select name="main_subcontractor" id="" class="form-control">
|
|
||||||
<option value="">{{e2("Select")}}</option>
|
|
||||||
|
|
||||||
<?php $ste = db("subcontractors")->get();
|
|
||||||
$selected = setting("main_subcontractor");
|
|
||||||
foreach($ste AS $s) {
|
|
||||||
?>
|
|
||||||
<option value="{{$s->company_name_en}}" {{$selected == $s->company_name_en ? "selected" : ""}}>{{$s->company_name_en}}</option>
|
|
||||||
|
|
||||||
|
|
||||||
<?php
|
|
||||||
}
|
{{e2("Cron Job Batch Process Count")}}:
|
||||||
?>
|
<input type="number" name="cron_job_batch_process_count" value="{{setting('cron_job_batch_process_count')}}"
|
||||||
</select>
|
class="form-control" id="">
|
||||||
{{e2("Cron Job Batch Process Count")}}:
|
{{e2("Cron Job Period Minute")}}:
|
||||||
<input type="number" name="cron_job_batch_process_count" value="{{setting('cron_job_batch_process_count')}}" class="form-control" id="">
|
|
||||||
{{e2("Cron Job Period Minute")}}:
|
|
||||||
<input type="number" name="cron_job_period" value="{{setting('cron_job_period')}}" class="form-control" id="">
|
<input type="number" name="cron_job_period" value="{{setting('cron_job_period')}}" class="form-control" id="">
|
||||||
{{e2("Repair Table Target Rate %")}}:
|
|
||||||
<input type="number" name="repair_table_target_rate" value="{{setting('repair_table_target_rate')}}" class="form-control" id="">
|
|
||||||
<div class="p-3 my-3 bg-light border rounded">
|
|
||||||
<h5 class="mb-1">{{e2("Backlog Thresholds")}}</h5>
|
|
||||||
<p class="text-muted small mb-3">{{e2("Define the maximum allowed backlog counts for NDT and Repair processes.")}}</p>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-3">
|
|
||||||
{{e2("NDT Backlog Max Limit")}}:
|
|
||||||
<input type="number" name="ndt_limit" value="{{setting('ndt_limit')}}" class="form-control" id="">
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
{{e2("NDT WDI Scope")}}:
|
|
||||||
<input type="number" name="ndt_wdi" value="{{setting('ndt_wdi')}}" class="form-control" id="">
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
{{e2("Repair Backlog Max Limit")}}:
|
|
||||||
<input type="number" name="repair_limit" value="{{setting('repair_limit')}}" class="form-control" id="">
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
{{e2("Repair WDI Scope")}}:
|
|
||||||
<input type="number" name="repair_wdi" value="{{setting('repair_wdi')}}" class="form-control" id="">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{e2("Welder Qualitification Status Expired Date")}}:
|
|
||||||
<input type="number" name="WelderQualitificationStatusExpiredDate" value="{{setting('WelderQualitificationStatusExpiredDate')}}" class="form-control" id="">
|
|
||||||
{{e2("Welder Qualitification Status Remaining Days")}}:
|
|
||||||
<input type="number" name="WelderQualitificationStatusRemaningDays" value="{{setting('WelderQualitificationStatusRemaningDays')}}" class="form-control" id="">
|
|
||||||
|
|
||||||
{{e2("NDT Date Validation")}}
|
|
||||||
: <span class="" data-toggle="popover" title="NDT Date Validation Info" data-content="Enables or disables the logical date validation sequence (e.g., VT Date > Welding Date). When active, it prevents entering dates that violate the NDT process order." data-trigger="hover" data-placement="top"><i class="fa fa-question-circle"></i></span>
|
|
||||||
|
|
||||||
<div class="input-group mb-3">
|
{{e2("Gemini API Key")}}:
|
||||||
<select name="ndt_date_validation_active" class="form-control select2">
|
|
||||||
<option value="Active" {{setting('ndt_date_validation_active') == 'Active' ? 'selected' : ''}}>{{e2("Active")}}</option>
|
|
||||||
<option value="Disable" {{setting('ndt_date_validation_active') == 'Disable' ? 'selected' : ''}}>{{e2("Disable")}}</option>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
{{e2("Gemini API Key")}}:
|
|
||||||
<input type="text" name="gemini_api_key" value="{{setting('gemini_api_key')}}" class="form-control" id="">
|
<input type="text" name="gemini_api_key" value="{{setting('gemini_api_key')}}" class="form-control" id="">
|
||||||
{{e2("Header Color")}}:
|
{{e2("Header Color")}}:
|
||||||
<?php
|
<?php
|
||||||
$selectedColor = setting('header_color');
|
$selectedColor = setting('header_color');
|
||||||
$colorThemes = [
|
$colorThemes = [
|
||||||
// Default Theme
|
// Default Theme
|
||||||
'bg-primary-lighter',
|
'bg-primary-lighter',
|
||||||
'bg-primary-light',
|
'bg-primary-light',
|
||||||
'bg-primary',
|
'bg-primary',
|
||||||
'bg-primary-dark',
|
'bg-primary-dark',
|
||||||
'bg-primary-darker',
|
'bg-primary-darker',
|
||||||
|
|
||||||
// Elegance Theme
|
// Elegance Theme
|
||||||
'bg-elegance-lighter',
|
'bg-elegance-lighter',
|
||||||
'bg-elegance-light',
|
'bg-elegance-light',
|
||||||
'bg-elegance',
|
'bg-elegance',
|
||||||
'bg-elegance-dark',
|
'bg-elegance-dark',
|
||||||
'bg-elegance-darker',
|
'bg-elegance-darker',
|
||||||
|
|
||||||
// Pulse Theme
|
// Pulse Theme
|
||||||
'bg-pulse-lighter',
|
'bg-pulse-lighter',
|
||||||
'bg-pulse-light',
|
'bg-pulse-light',
|
||||||
'bg-pulse',
|
'bg-pulse',
|
||||||
'bg-pulse-dark',
|
'bg-pulse-dark',
|
||||||
'bg-pulse-darker',
|
'bg-pulse-darker',
|
||||||
|
|
||||||
// Flat Theme
|
// Flat Theme
|
||||||
'bg-flat-lighter',
|
'bg-flat-lighter',
|
||||||
'bg-flat-light',
|
'bg-flat-light',
|
||||||
'bg-flat',
|
'bg-flat',
|
||||||
'bg-flat-dark',
|
'bg-flat-dark',
|
||||||
'bg-flat-darker',
|
'bg-flat-darker',
|
||||||
|
|
||||||
// Corporate Theme
|
// Corporate Theme
|
||||||
'bg-corporate-lighter',
|
'bg-corporate-lighter',
|
||||||
'bg-corporate-light',
|
'bg-corporate-light',
|
||||||
'bg-corporate',
|
'bg-corporate',
|
||||||
'bg-corporate-dark',
|
'bg-corporate-dark',
|
||||||
'bg-corporate-darker',
|
'bg-corporate-darker',
|
||||||
|
|
||||||
// Earth Theme
|
// Earth Theme
|
||||||
'bg-earth-lighter',
|
'bg-earth-lighter',
|
||||||
'bg-earth-light',
|
'bg-earth-light',
|
||||||
'bg-earth',
|
'bg-earth',
|
||||||
'bg-earth-dark',
|
'bg-earth-dark',
|
||||||
'bg-earth-darker',
|
'bg-earth-darker',
|
||||||
|
|
||||||
// Contextual Colors
|
// Contextual Colors
|
||||||
'bg-success',
|
'bg-success',
|
||||||
'bg-info',
|
'bg-info',
|
||||||
'bg-warning',
|
'bg-warning',
|
||||||
'bg-danger',
|
'bg-danger',
|
||||||
'bg-success-light',
|
'bg-success-light',
|
||||||
'bg-info-light',
|
'bg-info-light',
|
||||||
'bg-warning-light',
|
'bg-warning-light',
|
||||||
'bg-danger-light',
|
'bg-danger-light',
|
||||||
|
|
||||||
// Gradient Colors
|
// Gradient Colors
|
||||||
'bg-gd-primary',
|
'bg-gd-primary',
|
||||||
'bg-gd-dusk',
|
'bg-gd-dusk',
|
||||||
'bg-gd-cherry',
|
'bg-gd-cherry',
|
||||||
'bg-gd-aqua',
|
'bg-gd-aqua',
|
||||||
'bg-gd-emerald',
|
'bg-gd-emerald',
|
||||||
'bg-gd-sea',
|
'bg-gd-sea',
|
||||||
'bg-gd-leaf',
|
'bg-gd-leaf',
|
||||||
'bg-gd-lake',
|
'bg-gd-lake',
|
||||||
'bg-gd-sun'
|
'bg-gd-sun'
|
||||||
];
|
];
|
||||||
?>
|
?>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<select name="header_color" id="header_color_select" class="form-control select2">
|
<select name="header_color" id="header_color_select" class="form-control select2">
|
||||||
<option value="">{{e2("Select")}}</option>
|
<option value="">{{e2("Select")}}</option>
|
||||||
<?php foreach($colorThemes as $class) { ?>
|
<?php foreach ($colorThemes as $class) { ?>
|
||||||
<option value="<?php echo $class; ?>" <?php echo ($selectedColor == $class) ? 'selected' : ''; ?>>
|
<option value="<?php echo $class; ?>" <?php echo ($selectedColor == $class) ? 'selected' : ''; ?>>
|
||||||
<?php echo $class; ?>
|
<?php echo $class; ?>
|
||||||
</option>
|
</option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Renk Önizleme -->
|
<!-- Renk Önizleme -->
|
||||||
<div class="row mb-3 p-3">
|
<div class="row mb-3 p-3">
|
||||||
<?php foreach($colorThemes as $class) { ?>
|
<?php foreach ($colorThemes as $class) { ?>
|
||||||
<div class="col-md-3 mb-2">
|
<div class="col-md-3 mb-2">
|
||||||
<div class="d-flex align-items-center" onclick="selectHeaderColor('<?php echo $class; ?>')" style="cursor: pointer;">
|
<div class="d-flex align-items-center" onclick="selectHeaderColor('<?php echo $class; ?>')"
|
||||||
<div style="width: 30px; height: 30px; margin-right: 10px;" class="<?php echo $class; ?> border rounded"></div>
|
style="cursor: pointer;">
|
||||||
<div>
|
<div style="width: 30px; height: 30px; margin-right: 10px;"
|
||||||
<small><?php echo $class; ?></small>
|
class="<?php echo $class; ?> border rounded"></div>
|
||||||
</div>
|
<div>
|
||||||
|
<small><?php echo $class; ?></small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Canlı önizleme için JavaScript kodu -->
|
<!-- Canlı önizleme için JavaScript kodu -->
|
||||||
<script>
|
<script>
|
||||||
function selectHeaderColor(colorClass) {
|
function selectHeaderColor(colorClass) {
|
||||||
// Header color select değerini güncelle
|
// Header color select değerini güncelle
|
||||||
document.getElementById('header_color_select').value = colorClass;
|
document.getElementById('header_color_select').value = colorClass;
|
||||||
$(document.getElementById('header_color_select')).trigger('change');
|
$(document.getElementById('header_color_select')).trigger('change');
|
||||||
|
|
||||||
// #page-header elementini bul
|
// #page-header elementini bul
|
||||||
var pageHeader = document.getElementById('page-header');
|
var pageHeader = document.getElementById('page-header');
|
||||||
if (pageHeader) {
|
if (pageHeader) {
|
||||||
// Tüm mevcut bg-* sınıflarını kaldır
|
// Tüm mevcut bg-* sınıflarını kaldır
|
||||||
var classes = pageHeader.className.split(' ');
|
var classes = pageHeader.className.split(' ');
|
||||||
for (var i = 0; i < classes.length; i++) {
|
for (var i = 0; i < classes.length; i++) {
|
||||||
if (classes[i].startsWith('bg-')) {
|
if (classes[i].startsWith('bg-')) {
|
||||||
pageHeader.classList.remove(classes[i]);
|
pageHeader.classList.remove(classes[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Yeni renk sınıfını ekle
|
||||||
|
pageHeader.classList.add(colorClass);
|
||||||
|
} else {
|
||||||
|
console.warn('#page-header elementi bulunamadı!');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Yeni renk sınıfını ekle
|
|
||||||
pageHeader.classList.add(colorClass);
|
|
||||||
} else {
|
|
||||||
console.warn('#page-header elementi bulunamadı!');
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
// Sayfa yüklendiğinde mevcut rengi uygula
|
||||||
// Sayfa yüklendiğinde mevcut rengi uygula
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
var currentColor = '<?php echo $selectedColor; ?>';
|
||||||
var currentColor = '<?php echo $selectedColor; ?>';
|
if (currentColor) {
|
||||||
if (currentColor) {
|
selectHeaderColor(currentColor);
|
||||||
selectHeaderColor(currentColor);
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- Tema CSS'lerini dahil etmek için gerekebilir -->
|
<!-- Tema CSS'lerini dahil etmek için gerekebilir -->
|
||||||
<link rel="stylesheet" href="/assets/css/themes.min.css">
|
<link rel="stylesheet" href="/assets/css/themes.min.css">
|
||||||
|
|
||||||
{{e2("DevExpress Theme ")}}:
|
{{e2("DevExpress Theme ")}}:
|
||||||
<?php
|
<?php
|
||||||
$selectedTheme = setting('DevExpress_Theme');
|
$selectedTheme = setting('DevExpress_Theme');
|
||||||
echo $selectedTheme;
|
echo $selectedTheme;
|
||||||
|
|
||||||
$themes = explode("\n","dx.light.css
|
$themes = explode("\n", "dx.light.css
|
||||||
dx.dark.css
|
dx.dark.css
|
||||||
dx.carmine.css
|
dx.carmine.css
|
||||||
dx.softblue.css
|
dx.softblue.css
|
||||||
@@ -305,18 +228,18 @@ if(getisset("update")) {
|
|||||||
dx.material.teal.dark.compact.css");
|
dx.material.teal.dark.compact.css");
|
||||||
?>
|
?>
|
||||||
<select name="DevExpress_Theme" id="" class="form-control select2">
|
<select name="DevExpress_Theme" id="" class="form-control select2">
|
||||||
<?php foreach($themes AS $theme) {
|
<?php foreach ($themes as $theme) {
|
||||||
$theme = trim($theme);
|
$theme = trim($theme);
|
||||||
?>
|
?>
|
||||||
<option value="{{$theme}}" {{($theme == $selectedTheme) ? "selected" : ""}}>{{$theme}}</option>
|
<option value="{{$theme}}" {{($theme == $selectedTheme) ? "selected" : ""}}>{{$theme}}</option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
{{e2("PDF Template Path")}} :
|
{{e2("PDF Template Path")}} :
|
||||||
<input type="text" name="pdf_template_path" value="{{setting('pdf_template_path')}}" class="form-control" id="">
|
<input type="text" name="pdf_template_path" value="{{setting('pdf_template_path')}}" class="form-control" id="">
|
||||||
{{e2("Handover Control Count")}}:
|
{{e2("Handover Control Count")}}:
|
||||||
<?php $handoverControlCount = setting('handover_control_count', 3); ?>
|
<?php $handoverControlCount = setting('handover_control_count', 3); ?>
|
||||||
<select name="handover_control_count" class="form-control select2">
|
<select name="handover_control_count" class="form-control select2">
|
||||||
@for($i=1;$i<=10;$i++)
|
@for($i = 1; $i <= 10; $i++)
|
||||||
<option value="{{$i}}" {{$handoverControlCount == $i ? 'selected' : ''}}>{{$i}}</option>
|
<option value="{{$i}}" {{$handoverControlCount == $i ? 'selected' : ''}}>{{$i}}</option>
|
||||||
@endfor
|
@endfor
|
||||||
</select>
|
</select>
|
||||||
@@ -324,23 +247,23 @@ if(getisset("update")) {
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Prevent multiple form submissions
|
// Prevent multiple form submissions
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
const form = document.querySelector('form[action*="update"]');
|
const form = document.querySelector('form[action*="update"]');
|
||||||
const submitBtn = document.getElementById('updateSettingsBtn');
|
const submitBtn = document.getElementById('updateSettingsBtn');
|
||||||
|
|
||||||
if(form && submitBtn) {
|
if (form && submitBtn) {
|
||||||
form.addEventListener('submit', function(e) {
|
form.addEventListener('submit', function (e) {
|
||||||
// Disable button and show loading state
|
// Disable button and show loading state
|
||||||
submitBtn.disabled = true;
|
submitBtn.disabled = true;
|
||||||
submitBtn.innerHTML = '<i class="fa fa-spinner fa-spin"></i> ' + '{{e2("Updating...")}}';
|
submitBtn.innerHTML = '<i class="fa fa-spinner fa-spin"></i> ' + '{{e2("Updating...")}}';
|
||||||
|
|
||||||
// Re-enable after 5 seconds as a fallback
|
// Re-enable after 5 seconds as a fallback
|
||||||
setTimeout(function() {
|
setTimeout(function () {
|
||||||
submitBtn.disabled = false;
|
submitBtn.disabled = false;
|
||||||
submitBtn.innerHTML = '{{e2("Update")}}';
|
submitBtn.innerHTML = '{{e2("Update")}}';
|
||||||
}, 5000);
|
}, 5000);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@@ -12,30 +12,17 @@ var options = e.editorOptions;
|
|||||||
if (e.parentType == 'dataRow' && e.editorName == 'dxTextBox') {
|
if (e.parentType == 'dataRow' && e.editorName == 'dxTextBox') {
|
||||||
|
|
||||||
|
|
||||||
if(e.dataField.indexOf("_result") !== -1) {
|
options.onValueChanged = function(selectData) {
|
||||||
e.editorName = 'dxSelectBox';
|
<?php $except = [
|
||||||
e.editorOptions.dataSource = <?php echo json_encode_tr(
|
'languages',
|
||||||
db("results")
|
]; ?>
|
||||||
->get()
|
|
||||||
->pluck("title")
|
|
||||||
->toArray()
|
|
||||||
) ?>;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
options.onValueChanged = function(selectData) {
|
|
||||||
<?php $except = [
|
|
||||||
'languages',
|
|
||||||
'subcontractor',
|
|
||||||
'work-permit-personel-list',
|
|
||||||
]; ?>
|
|
||||||
|
|
||||||
@if(!in_array($id, $except))
|
@if(!in_array($id, $except))
|
||||||
e.setValue(selectData.value.trim().toUpperCase());
|
e.setValue(selectData.value.trim().toUpperCase());
|
||||||
@else
|
@else
|
||||||
e.setValue(selectData.value.trim());
|
e.setValue(selectData.value.trim());
|
||||||
@endif
|
@endif
|
||||||
};
|
};
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user