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:
Ümit Tunç
2026-04-28 22:05:59 +03:00
parent 3657074017
commit 784724c6bc
7 changed files with 346 additions and 520 deletions
+171 -255
View File
@@ -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(),
]; ];
?> ?>
+1 -1
View File
@@ -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
}; };
}
} }