Compare commits

..
6 Commits
Author SHA1 Message Date
kurogeek deadb17b25 CMS login/error layouts: drop Metronic demo sign-in general.js/i18n.js (FormValidation on non-existent #kt_sign_in_form threw TypeError on /login; real form is #frm-login with its own handler) 2026-10-27 02:14:03 +00:00
kurogeek e94d72130d CMS add/edit-article (chiangmai, where-else): remove flatpickr onReady todayDateElem highlight; element is null/undefined at onReady and the class has no CSS, and the throw could prevent the Save handler from binding on add pages 2026-10-27 02:07:59 +00:00
kurogeek d49c3e2d97 CMS layout: drop Metronic demo save-category.js (ran FormValidation on a non-existent form, TypeError on every page) and duplicate upgrade-plan/create-app/users-search includes 2026-10-27 02:07:59 +00:00
kurogeek b189281a1b Site main.js: skip nav anchors without href in scroll handler; the Categories dropdown toggle has none, so every scroll threw TypeError and aborted sticky-header/header-appear logic 2026-10-27 02:07:59 +00:00
kurogeek c274e6dcd9 CMS edit-article (chiangmai, where-else): remove duplicate #btn_submit handler that submitted before Editor.js serialized, prefill hidden description inputs from stored values, surface editor save failure; fixes 'Data cannot be empty' when only sub-categories changed 2026-10-26 11:15:25 +00:00
kurogeek e95006a9e9 CMS article insert/update (chiangmai, where-else): store sub_category_ids as strict CSV ('15,21' not '15, 21') so FIND_IN_SET matches every chosen sub-category, not just the first; migration strips spaces from existing rows 2026-10-26 11:15:25 +00:00
11 changed files with 38 additions and 57 deletions

No files matched your search

@@ -119,7 +119,7 @@ class ArticleController extends Controller
// prepared data // prepared data
$data = [ $data = [
'category_id' => 1, 'category_id' => 1,
'sub_category_ids' => implode(", ", $sub_categories), 'sub_category_ids' => implode(",", $sub_categories),
'due_date' => $formattedDate, 'due_date' => $formattedDate,
'name' => $name, 'name' => $name,
'name_en' => $name_en, 'name_en' => $name_en,
@@ -207,7 +207,7 @@ class ArticleController extends Controller
$formattedDate = $dateObject->format('Y-m-d'); // Convert to YYYY-MM-DD $formattedDate = $dateObject->format('Y-m-d'); // Convert to YYYY-MM-DD
$data = [ $data = [
'category_id' => 1, 'category_id' => 1,
'sub_category_ids' => implode(", ", $sub_categories), 'sub_category_ids' => implode(",", $sub_categories),
'due_date' => $formattedDate, 'due_date' => $formattedDate,
'active' => $active, 'active' => $active,
'name' => $name, 'name' => $name,
@@ -118,7 +118,7 @@ class ArticleWhereElseController extends Controller
// prepared data // prepared data
$data = [ $data = [
'category_id' => 2, 'category_id' => 2,
'sub_category_ids' => implode(", ", $sub_categories), 'sub_category_ids' => implode(",", $sub_categories),
'due_date' => $formattedDate, 'due_date' => $formattedDate,
'name' => $name, 'name' => $name,
'name_en' => $name_en, 'name_en' => $name_en,
@@ -206,7 +206,7 @@ class ArticleWhereElseController extends Controller
$formattedDate = $dateObject->format('Y-m-d'); // Convert to YYYY-MM-DD $formattedDate = $dateObject->format('Y-m-d'); // Convert to YYYY-MM-DD
$data = [ $data = [
'category_id' => 2, 'category_id' => 2,
'sub_category_ids' => implode(", ", $sub_categories), 'sub_category_ids' => implode(",", $sub_categories),
'due_date' => $formattedDate, 'due_date' => $formattedDate,
'active' => $active, 'active' => $active,
'name' => $name, 'name' => $name,
@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
// Article insert/update used to store sub_category_ids as "15, 21" (comma+space).
// Every reader uses FIND_IN_SET(?, sub_category_ids), which never matches " 21",
// so only the first checked sub-category was ever visible. Strip the spaces.
return new class extends Migration
{
public function up(): void
{
DB::table('article')
->where('sub_category_ids', 'like', '% %')
->update(['sub_category_ids' => DB::raw("REPLACE(sub_category_ids, ' ', '')")]);
}
public function down(): void
{
// Irreversible by design: the spaced format was a bug, not a schema.
}
};
@@ -524,11 +524,6 @@
enableTime: false, enableTime: false,
dateFormat: 'd-m-Y', dateFormat: 'd-m-Y',
defaultDate: null, // Do not preselect any date defaultDate: null, // Do not preselect any date
onReady: function(selectedDates, dateStr, instance) {
// Highlight today's date with a custom CSS class
const today = instance.todayDateElem;
today.classList.add('flatpickr-today-highlight'); // Add a custom class to today
}
}); });
$(document).on('click', '#btn_submit', function(e) { $(document).on('click', '#btn_submit', function(e) {
@@ -245,14 +245,14 @@
<div class="mb-10 fv-row"> <div class="mb-10 fv-row">
<label class="required form-label">Description</label> <label class="required form-label">Description</label>
<div class="form-control" id="description" name="description"></div> <div class="form-control" id="description" name="description"></div>
<input type="hidden" id="description_input" name="description" /> <input type="hidden" id="description_input" name="description" value="{{ $itemView->description }}" />
</div> </div>
<div class="mb-10 fv-row"> <div class="mb-10 fv-row">
<label class="required form-label">Description (EN)</label> <label class="required form-label">Description (EN)</label>
<div class="form-control" id="description_en" name="description_en"></div> <div class="form-control" id="description_en" name="description_en"></div>
<input type="hidden" id="description_input_en" name="description_en" /> <input type="hidden" id="description_input_en" name="description_en" value="{{ $itemView->description_en }}" />
</div> </div>
@@ -297,21 +297,8 @@
enableTime: false, enableTime: false,
dateFormat: 'd-m-Y', dateFormat: 'd-m-Y',
defaultDate: null, // Do not preselect any date defaultDate: null, // Do not preselect any date
onReady: function(selectedDates, dateStr, instance) {
// Highlight today's date with a custom CSS class
const today = instance.todayDateElem;
today.classList.add('flatpickr-today-highlight'); // Add a custom class to today
}
}); });
$(document).on("click", "#btn_submit", function(e) {
e.preventDefault();
alertLoading("Loading")
const form = $('#frmUpdate');
form.submit();
})
}); });
</script> </script>
@@ -585,6 +572,7 @@
}) })
.catch((error) => { .catch((error) => {
console.error('Error saving editor content:', error); console.error('Error saving editor content:', error);
alertFail('Notice', 'Could not save description, please try again');
}); });
}); });
</script> </script>
@@ -537,11 +537,6 @@
enableTime: false, enableTime: false,
dateFormat: 'd-m-Y', dateFormat: 'd-m-Y',
defaultDate: null, // Do not preselect any date defaultDate: null, // Do not preselect any date
onReady: function(selectedDates, dateStr, instance) {
// Highlight today's date with a custom CSS class
const today = instance.todayDateElem;
today.classList.add('flatpickr-today-highlight'); // Add a custom class to today
}
}); });
$(document).on('click', '#btn_submit', function(e) { $(document).on('click', '#btn_submit', function(e) {
@@ -256,14 +256,14 @@
<div class="mb-10 fv-row"> <div class="mb-10 fv-row">
<label class="required form-label">Description</label> <label class="required form-label">Description</label>
<div class="form-control" id="description" name="description"></div> <div class="form-control" id="description" name="description"></div>
<input type="hidden" id="description_input" name="description" /> <input type="hidden" id="description_input" name="description" value="{{ $itemView->description }}" />
</div> </div>
<div class="mb-10 fv-row"> <div class="mb-10 fv-row">
<label class="required form-label">Description (EN)</label> <label class="required form-label">Description (EN)</label>
<div class="form-control" id="description_en" name="description_en"></div> <div class="form-control" id="description_en" name="description_en"></div>
<input type="hidden" id="description_input_en" name="description_en" /> <input type="hidden" id="description_input_en" name="description_en" value="{{ $itemView->description_en }}" />
</div> </div>
@@ -308,20 +308,8 @@
enableTime: false, enableTime: false,
dateFormat: 'd-m-Y', dateFormat: 'd-m-Y',
defaultDate: null, // Do not preselect any date defaultDate: null, // Do not preselect any date
onReady: function(selectedDates, dateStr, instance) {
// Highlight today's date with a custom CSS class
const today = instance.todayDateElem;
today.classList.add('flatpickr-today-highlight'); // Add a custom class to today
}
}); });
$(document).on("click", "#btn_submit", function(e) {
e.preventDefault();
alertLoading("Loading")
const form = $('#frmUpdate');
form.submit();
})
}); });
</script> </script>
@@ -595,6 +583,7 @@
}) })
.catch((error) => { .catch((error) => {
console.error('Error saving editor content:', error); console.error('Error saving editor content:', error);
alertFail('Notice', 'Could not save description, please try again');
}); });
}); });
</script> </script>
@@ -525,10 +525,6 @@
<script src="{{ url('assets/js/custom/utilities/modals/create-app.js') }}"></script> <script src="{{ url('assets/js/custom/utilities/modals/create-app.js') }}"></script>
<script src="{{ url('assets/js/custom/utilities/modals/new-target.js') }}"></script> <script src="{{ url('assets/js/custom/utilities/modals/new-target.js') }}"></script>
<script src="{{ url('assets/js/custom/utilities/modals/users-search.js') }}"></script> <script src="{{ url('assets/js/custom/utilities/modals/users-search.js') }}"></script>
<script src="{{ url('assets/js/custom/apps/ecommerce/catalog/save-category.js') }}"></script>
<script src="{{ url('assets/js/custom/utilities/modals/upgrade-plan.js') }}"></script>
<script src="{{ url('assets/js/custom/utilities/modals/create-app.js') }}"></script>
<script src="{{ url('assets/js/custom/utilities/modals/users-search.js') }}"></script>
<!--end::Custom Javascript--> <!--end::Custom Javascript-->
<script src="{{ url('assets/js/utils.js') }}"></script> <script src="{{ url('assets/js/utils.js') }}"></script>
@@ -86,10 +86,6 @@
<script src="{{ url('assets/plugins/global/plugins.bundle.js') }}"></script> <script src="{{ url('assets/plugins/global/plugins.bundle.js') }}"></script>
<script src="{{ url('assets/js/scripts.bundle.js') }}"></script> <script src="{{ url('assets/js/scripts.bundle.js') }}"></script>
<!--end::Global Javascript Bundle--> <!--end::Global Javascript Bundle-->
<!--begin::Custom Javascript(used for this page only)-->
<script src="{{ url('assets/js/custom/authentication/sign-in/general.js') }}"></script>
<script src="{{ url('assets/js/custom/authentication/sign-in/i18n.js') }}"></script>
<!--end::Custom Javascript-->
<!--end::Javascript--> <!--end::Javascript-->
@@ -111,10 +111,6 @@
<script src="{{ url('assets/plugins/global/plugins.bundle.js') }}"></script> <script src="{{ url('assets/plugins/global/plugins.bundle.js') }}"></script>
<script src="{{ url('assets/js/scripts.bundle.js') }}"></script> <script src="{{ url('assets/js/scripts.bundle.js') }}"></script>
<!--end::Global Javascript Bundle--> <!--end::Global Javascript Bundle-->
<!--begin::Custom Javascript(used for this page only)-->
<script src="{{ url('assets/js/custom/authentication/sign-in/general.js') }}"></script>
<script src="{{ url('assets/js/custom/authentication/sign-in/i18n.js') }}"></script>
<!--end::Custom Javascript-->
<!--end::Javascript--> <!--end::Javascript-->
+6 -2
View File
@@ -43,9 +43,13 @@
scrollPos = scrollPos + 60; scrollPos = scrollPos + 60;
menu_links.each(function () { menu_links.each(function () {
var currLink = $(this); var currLink = $(this);
var hasPos = currLink.attr("href").indexOf("#"); var href = currLink.attr("href");
if (!href) {
return;
}
var hasPos = href.indexOf("#");
if (hasPos > -1) { if (hasPos > -1) {
var res = currLink.attr("href").substring(hasPos); var res = href.substring(hasPos);
if (res != '' && res != '#' && $(res).length > 0) { if (res != '' && res != '#' && $(res).length > 0) {
var refElement = $(res); var refElement = $(res);
if (refElement.offset().top <= scrollPos && refElement.offset().top + refElement.height() > scrollPos) { if (refElement.offset().top <= scrollPos && refElement.offset().top + refElement.height() > scrollPos) {