Sid Gifari File Manager
🏠 Root
/
home
/
u403571817
/
Editing: .bash_history
@section('scripts') <script type="text/javascript"> var database = firebase.firestore(); var ref = database.collection('vendor_subcategories'); var ref_sections = database.collection('sections'); var ref_categories = database.collection('vendor_categories'); $(document).ready(function () { loadSubcategories(); loadSections(); }); async function loadSubcategories() { const querySnapshot = await ref.get(); let html = ''; querySnapshot.forEach((doc) => { const data = doc.data(); html += buildHTML(data); }); $('#append_list1').html(html); $('.total_count').text(querySnapshot.size); } async function buildHTML(val) { const categoryName = await getCategoryName(val.category_id); const sectionName = await getSectionName(val.section_id); return ` <tr> <td> <img class="rounded" style="width:50px" src="${val.photo || ''}" alt="image"> <a href="/subcategories/edit/${val.id}" class="left_space">${val.title}</a> </td> <td>${categoryName}</td> <td>${sectionName}</td> <td>0</td> <td> <label class="switch"> <input type="checkbox" ${val.publish ? 'checked' : ''} id="${val.id}" name="isSwitch"> <span class="slider round"></span> </label> </td> <td> <span class="action-btn"> <a href="/subcategories/edit/${val.id}"><i class="mdi mdi-lead-pencil"></i></a> <a id="${val.id}" name="subcategory-delete" class="delete-btn" href="javascript:void(0)"><i class="mdi mdi-delete"></i></a> </span> </td> </tr> `; } async function getCategoryName(categoryId) { if (!categoryId) return ''; const snapshot = await ref_categories.doc(categoryId).get(); return snapshot.exists ? snapshot.data().title : ''; } async function getSectionName(sectionId) { if (!sectionId) return ''; const snapshot = await ref_sections.doc(sectionId).get(); return snapshot.exists ? snapshot.data().name : ''; } async function loadSections() { const querySnapshot = await ref_sections.get(); let options = '<option value="">{{trans("lang.select")}} {{trans("lang.section_plural")}}</option>'; querySnapshot.forEach((doc) => { const data = doc.data(); if (data.serviceTypeFlag == "delivery-service" || data.serviceTypeFlag == "ecommerce-service") { options += `<option value="${data.id}">${data.name}</option>`; } }); $('#section_id').html(options); } $(document).on("click", "input[name='isSwitch']", function (e) { var ischeck = $(this).is(':checked'); var id = this.id; database.collection('vendor_subcategories').doc(id).update({ 'publish': ischeck }); }); $(document).on("click", "a[name='subcategory-delete']", async function (e) { var id = this.id; if (confirm("Are you sure you want to delete this subcategory?")) { await database.collection('vendor_subcategories').doc(id).delete(); loadSubcategories(); } }); function clickLink(value) { location.reload(); } </script> @endsection EOF cat > resources/views/subcategories/create.blade.php << 'EOF' @extends('layouts.app') @section('content') <div class="page-wrapper"> <div class="row page-titles"> <div class="col-md-5 align-self-center"> <h3 class="text-themecolor">{{trans('lang.subcategory_plural')}}</h3> </div> <div class="col-md-7 align-self-center"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a href="{{url('/dashboard')}}">{{trans('lang.dashboard')}}</a></li> <li class="breadcrumb-item"><a href="{!! route('subcategories') !!}">{{trans('lang.subcategory_plural')}}</a></li> <li class="breadcrumb-item active">{{trans('lang.subcategory_create')}}</li> </ol> </div> </div> <div class="container-fluid"> <div class="cat-edite-page max-width-box"> <div class="card pb-4"> <div class="card-header"> <ul class="nav nav-tabs align-items-end card-header-tabs w-100"> <li role="presentation" class="nav-item"> <a href="#subcategory_information" aria-controls="description" role="tab" data-toggle="tab" class="nav-link active">{{trans('lang.subcategory_information')}}</a> </li> </ul> </div> <div class="card-body"> <div class="error_top" style="display:none"></div> <div class="row vendor_payout_create" role="tabpanel"> <div class="vendor_payout_create-inner tab-content"> <div role="tabpanel" class="tab-pane active" id="subcategory_information"> <fieldset> <legend>{{trans('lang.subcategory_create')}}</legend> <div class="form-group row width-100"> <label class="col-3 control-label">{{trans('lang.select_section')}}</label> <div class="col-7"> <select name="section_id" id="section_id" class="form-control"> <option value="">{{trans('lang.select')}}</option> </select> </div> </div> <div class="form-group row width-100"> <label class="col-3 control-label">{{trans('lang.select_category')}}</label> <div class="col-7"> <select name="category_id" id="category_id" class="form-control"> <option value="">{{trans('lang.select')}}</option> </select> <div class="form-text text-muted">{{ trans("lang.select_category_help") }}</div> </div> </div> <div class="form-group row width-100"> <label class="col-3 control-label">{{trans('lang.subcategory_name')}}</label> <div class="col-7"> <input type="text" class="form-control subcat-name"> <div class="form-text text-muted">{{ trans("lang.subcategory_name_help") }}</div> </div> </div> <div class="form-group row width-100"> <label class="col-3 control-label ">{{trans('lang.subcategory_description')}}</label> <div class="col-7"> <textarea rows="7" class="subcategory_description form-control" id="subcategory_description"></textarea> <div class="form-text text-muted">{{ trans("lang.subcategory_description_help") }}</div> </div> </div> <div class="form-group row width-100"> <label class="col-3 control-label">{{trans('lang.subcategory_image')}}</label> <div class="col-7"> <input type="file" id="subcategory_image"> <div class="placeholder_img_thumb subcat_image"></div> <div id="uploding_image"></div> <div class="form-text text-muted w-50">{{ trans("lang.subcategory_image_help") }}</div> </div> </div> <div class="form-check width-100"> <input type="checkbox" class="item_publish" id="item_publish"> <label class="col-3 control-label" for="item_publish">{{trans('lang.item_publish')}}</label> </div> </fieldset> </div> </div> </div> </div> <div class="form-group col-12 text-center btm-btn"> <button type="button" class="btn btn-primary save-setting-btn"><i class="fa fa-save"></i> {{trans('lang.save')}} </button> <a href="{!! route('subcategories') !!}" class="btn btn-default"><i class="fa fa-undo"></i>{{trans('lang.cancel')}}</a> </div> </div> </div> </div> </div> @endsection @section('scripts') <script type="text/javascript"> var database = firebase.firestore(); var ref = database.collection('vendor_subcategories'); var ref_sections = database.collection('sections'); var ref_categories = database.collection('vendor_categories'); var photo = ""; var fileName = ''; var id_subcategory = "<?php echo uniqid(); ?>"; var placeholderImage = ''; var placeholder = database.collection('settings').doc('placeHolderImage'); var storageRef = firebase.storage().ref('images'); placeholder.get().then(async function (snapshotsimage) { var placeholderImageData = snapshotsimage.data(); placeholderImage = placeholderImageData.image; }) $(document).ready(function () { loadSections(); loadCategories(); }); async function loadSections() { const querySnapshot = await ref_sections.get(); let options = '<option value="">{{trans("lang.select")}}</option>'; querySnapshot.forEach((doc) => { const data = doc.data(); if (data.serviceTypeFlag == "delivery-service" || data.serviceTypeFlag == "ecommerce-service") { options += `<option value="${data.id}">${data.name}</option>`; } }); $('#section_id').html(options); } async function loadCategories() { const querySnapshot = await ref_categories.get(); let options = '<option value="">{{trans("lang.select")}}</option>'; querySnapshot.forEach((doc) => { const data = doc.data(); options += `<option value="${data.id}" data-section="${data.section_id}">${data.title}</option>`; }); $('#category_id').html(options); } $("#section_id").change(function () { const sectionId = $(this).val(); $('#category_id option').show(); if (sectionId) { $('#category_id option').each(function() { const dataSection = $(this).data('section'); if (dataSection && dataSection !== sectionId) { $(this).hide(); } }); } $('#category_id').val(''); }); $(".save-setting-btn").click(async function () { var title = $(".subcat-name").val(); var description = $(".subcategory_description").val(); var section_id = $("#section_id").val(); var category_id = $("#category_id").val(); var itemPublish = $(".item_publish").is(":checked"); if (title == '') { $(".error_top").show(); $(".error_top").html(""); $(".error_top").append("<p>Please enter subcategory title</p>"); window.scrollTo(0, 0); } else if (section_id == '') { $(".error_top").show(); $(".error_top").html(""); $(".error_top").append("<p>Please select section</p>"); window.scrollTo(0, 0); } else if (category_id == '') { $(".error_top").show(); $(".error_top").html(""); $(".error_top").append("<p>Please select category</p>"); window.scrollTo(0, 0); } else if (photo == '') { $(".error_top").show(); $(".error_top").html(""); $(".error_top").append("<p>Please upload image</p>"); window.scrollTo(0, 0); } else { jQuery("#data-table_processing").show(); storeImageData().then(IMG => { database.collection('vendor_subcategories').doc(id_subcategory).set({ 'id': id_subcategory, 'title': title, 'description': description, 'photo': IMG, 'section_id': section_id, 'category_id': category_id, 'publish': itemPublish }).then(function (result) { window.location.href = '{{ route("subcategories")}}'; }); }).catch(function (error) { jQuery("#data-table_processing").hide(); $(".error_top").show(); $(".error_top").html(""); $(".error_top").append("<p>" + error + "</p>"); }) } }); $("#subcategory_image").resizeImg({ callback: function (base64str) { var val = $('#subcategory_image').val().toLowerCase(); var ext = val.split('.')[1]; var filename = $('#subcategory_image').val().replace(/C:\\fakepath\\/i, '') var timestamp = Number(new Date()); var filename = filename.split('.')[0] + "_" + timestamp + '.' + ext; photo = base64str; fileName = filename; $(".subcat_image").empty(); $(".subcat_image").append('<img class="rounded" style="width:50px" src="' + photo + '" alt="image">'); $("#subcategory_image").val(''); } }); async function storeImageData() { var newPhoto = ''; try { photo = photo.replace(/^data:image\/[a-z]+;base64,/, "") var uploadTask = await storageRef.child(fileName).putString(photo, 'base64', { contentType: 'image/jpg' }); var downloadURL = await uploadTask.ref.getDownloadURL(); newPhoto = downloadURL; photo = downloadURL; } catch (error) { console.log("ERR ===", error); } return newPhoto; } </script> @endsection EOF cat > resources/views/subcategories/edit.blade.php << 'EOF' @extends('layouts.app') @section('content') <div class="page-wrapper"> <div class="row page-titles"> <div class="col-md-5 align-self-center"> <h3 class="text-themecolor">{{trans('lang.subcategory_plural')}}</h3> </div> <div class="col-md-7 align-self-center"> <ol class="breadcrumb"> <li class="breadcrumb-item"><a href="{{url('/dashboard')}}">{{trans('lang.dashboard')}}</a></li> <li class="breadcrumb-item"><a href="{!! route('subcategories') !!}">{{trans('lang.subcategory_plural')}}</a></li> <li class="breadcrumb-item active">{{trans('lang.subcategory_edit')}}</li> </ol> </div> </div> <div class="container-fluid"> <div class="cat-edite-page max-width-box"> <div class="card pb-4"> <div class="card-header"> <ul class="nav nav-tabs align-items-end card-header-tabs w-100"> <li role="presentation" class="nav-item"> <a href="#subcategory_information" aria-controls="subcategory_information" role="tab" data-toggle="tab" class="nav-link active">{{trans('lang.subcategory_information')}}</a> </li> </ul> </div> <div class="card-body"> <div class="error_top" style="display:none"></div> <div class="row vendor_payout_create" role="tabpanel"> <div class="vendor_payout_create-inner tab-content category_edit_div"> <div role="tabpanel" class="tab-pane active" id="subcategory_information"> <fieldset> <legend>{{trans('lang.subcategory_edit')}}</legend> <div class="form-group row width-100"> <label class="col-3 control-label">{{trans('lang.select_section')}}</label> <div class="col-7"> <select name="section_id" id="section_id" class="form-control"> <option value="">{{trans('lang.select')}}</option> </select> </div> </div> <div class="form-group row width-100"> <label class="col-3 control-label">{{trans('lang.select_category')}}</label> <div class="col-7"> <select name="category_id" id="category_id" class="form-control"> <option value="">{{trans('lang.select')}}</option> </select> <div class="form-text text-muted">{{ trans("lang.select_category_help") }}</div> </div> </div> <div class="form-group row width-100"> <label class="col-3 control-label">{{trans('lang.subcategory_name')}}</label> <div class="col-7"> <input type="text" class="form-control subcat-name"> <div class="form-text text-muted">{{ trans("lang.subcategory_name_help") }}</div> </div> </div> <div class="form-group row width-100"> <label class="col-3 control-label ">{{trans('lang.subcategory_description')}}</label> <div class="col-7"> <textarea rows="7" class="subcategory_description form-control" id="subcategory_description"></textarea> <div class="form-text text-muted">{{ trans("lang.subcategory_description_help") }}</div> </div> </div> <div class="form-group row width-100"> <label class="col-3 control-label">{{trans('lang.subcategory_image')}}</label> <div class="col-7"> <input type="file" id="subcategory_image"> <div class="placeholder_img_thumb subcat_image"></div> <div id="uploding_image"></div> <div class="form-text text-muted w-50">{{ trans("lang.subcategory_image_help") }}</div> </div> </div> <div class="form-check width-100"> <input type="checkbox" class="item_publish" id="item_publish"> <label class="col-3 control-label" for="item_publish">{{trans('lang.item_publish')}}</label> </div> </fieldset> </div> </div> </div> </div> <div class="form-group col-12 text-center btm-btn"> <button type="button" class="btn btn-primary edit-setting-btn"><i class="fa fa-save"></i> {{trans('lang.save')}} </button> <a href="{!! route('subcategories') !!}" class="btn btn-default"><i class="fa fa-undo"></i>{{trans('lang.cancel')}}</a> </div> </div> </div> </div> </div> @endsection @section('scripts') <script type="text/javascript"> var id = "<?php echo $id; ?>"; var database = firebase.firestore(); var ref_sections = database.collection('sections'); var ref_categories = database.collection('vendor_categories'); var ref = database.collection('vendor_subcategories').where("id", "==", id); var selected_review_attributes = ''; var subcategory = ''; var photo = ""; var fileName = ''; var subcatImageFile = ""; var placeholderImage = ''; var placeholder = database.collection('settings').doc('placeHolderImage'); var storage = firebase.storage(); var storageRef = firebase.storage().ref('images'); placeholder.get().then(async function (snapshotsimage) { var placeholderImageData = snapshotsimage.data(); placeholderImage = placeholderImageData.image; }) $(document).ready(function () { loadSections(); loadCategories(); loadSubcategory(); }); async function loadSections() { const querySnapshot = await ref_sections.get(); let options = '<option value="">{{trans("lang.select")}}</option>'; querySnapshot.forEach((doc) => { const data = doc.data(); if (data.serviceTypeFlag == "delivery-service" || data.serviceTypeFlag == "ecommerce-service") { options += `<option value="${data.id}">${data.name}</option>`; } }); $('#section_id').html(options); } async function loadCategories() { const querySnapshot = await ref_categories.get(); let options = '<option value="">{{trans("lang.select")}}</option>'; querySnapshot.forEach((doc) => { const data = doc.data(); options += `<option value="${data.id}" data-section="${data.section_id}">${data.title}</option>`; }); $('#category_id').html(options); } async function loadSubcategory() { const querySnapshot = await ref.get(); if (querySnapshot.docs.length > 0) { subcategory = querySnapshot.docs[0].data(); $(".subcat-name").val(subcategory.title); $(".subcategory_description").val(subcategory.description); if (subcategory.section_id) { $("#section_id").val(subcategory.section_id); updateCategoryOptions(); } if (subcategory.category_id) { $("#category_id").val(subcategory.category_id); } photo = subcategory.photo; if (photo != '' && photo != null) { subcatImageFile = subcategory.photo; $(".subcat_image").append('<img class="rounded" style="width:50px" src="' + photo + '" alt="image" onerror="this.onerror=null;this.src=\'' + placeholderImage + '\'">'); } else { $(".subcat_image").append('<img class="rounded" style="width:50px" src="' + placeholderImage + '" alt="image">'); } if (subcategory.publish) { $(".item_publish").prop('checked', true); } } } $("#section_id").change(function () { updateCategoryOptions(); $('#category_id').val(''); }); function updateCategoryOptions() { const sectionId = $("#section_id").val(); $('#category_id option').show(); if (sectionId) { $('#category_id option').each(function() { const dataSection = $(this).data('section'); if (dataSection && dataSection !== sectionId) { $(this).hide(); } }); } } $(".edit-setting-btn").click(async function () { var title = $(".subcat-name").val(); var description = $(".subcategory_description").val(); var section_id = $("#section_id").val(); var category_id = $("#category_id").val(); var itemPublish = $(".item_publish").is(":checked"); if (title == '') { $(".error_top").show(); $(".error_top").html(""); $(".error_top").append("<p>Please enter subcategory title</p>"); window.scrollTo(0, 0); } else if (section_id == '') { $(".error_top").show(); $(".error_top").html(""); $(".error_top").append("<p>Please select section</p>"); window.scrollTo(0, 0); } else if (category_id == '') { $(".error_top").show(); $(".error_top").html(""); $(".error_top").append("<p>Please select category</p>"); window.scrollTo(0, 0); } else if (photo == '') { $(".error_top").show(); $(".error_top").html(""); $(".error_top").append("<p>Please upload image</p>"); window.scrollTo(0, 0); } else { jQuery("#data-table_processing").show(); storeImageData().then(IMG => { database.collection('vendor_subcategories').doc(id).update({ 'section_id': section_id, 'title': title, 'description': description, 'photo': IMG, 'category_id': category_id, 'publish': itemPublish }).then(function (result) { window.location.href = '{{ route("subcategories")}}'; }); }).catch(err => { jQuery("#data-table_processing").hide(); $(".error_top").show(); $(".error_top").html(""); $(".error_top").append("<p>" + err + "</p>"); window.scrollTo(0, 0); }); } }); $("#subcategory_image").resizeImg({ callback: function (base64str) { var val = $('#subcategory_image').val().toLowerCase(); var ext = val.split('.')[1]; var filename = $('#subcategory_image').val().replace(/C:\\fakepath\\/i, '') var timestamp = Number(new Date()); var filename = filename.split('.')[0] + "_" + timestamp + '.' + ext; photo = base64str; fileName = filename; $(".subcat_image").empty(); $(".subcat_image").append('<img class="rounded" style="width:50px" src="' + photo + '" alt="image">'); $("#subcategory_image").val(''); } }); async function storeImageData() { var newPhoto = ''; try { if (subcatImageFile != "" && photo != subcatImageFile) { var subcatOldImageUrlRef = await storage.refFromURL(subcatImageFile); imageBucket = subcatOldImageUrlRef.bucket; var envBucket = "<?php echo env('FIREBASE_STORAGE_BUCKET'); ?>"; if (imageBucket == envBucket) { await subcatOldImageUrlRef.delete().then(() => { console.log("Old file deleted!") }).catch((error) => { console.log("ERR File delete ===", error); }); } else { console.log('Bucket not matched'); } } if (photo != subcatImageFile) { photo = photo.replace(/^data:image\/[a-z]+;base64,/, "") var uploadTask = await storageRef.child(fileName).putString(photo, 'base64', { contentType: 'image/jpg' }); var downloadURL = await uploadTask.ref.getDownloadURL(); newPhoto = downloadURL; photo = downloadURL; } else { newPhoto = photo; } } catch (error) { console.log("ERR ===", error); } return newPhoto; } </script> @endsection EOF sed -i '/show_in_homepage.*span id="forsection"/,/<\/div>/a\ <div class="form-group row width-100">\n <label class="col-3 control-label">{{trans("lang.subcategory_plural")}}</label>\n <div class="col-7">\n <div id="subcategories_list">\n <!-- Subcategories will be loaded here -->\n </div>\n <div class="mt-2">\n <a href="{!! route("subcategories.create") !!}" class="btn btn-sm btn-success">\n <i class="mdi mdi-plus mr-1"></i>{{trans("lang.subcategory_create")}}\n </a>\n </div>\n </div>\n </div>' resources/views/categories/edit.blade.php sed -i '/return newPhoto;/a\ }\n\n async function loadSubcategories() {\n if (id) {\n const querySnapshot = await database.collection("vendor_subcategories").where("category_id", "==", id).get();\n let html = "";\n \n if (querySnapshot.empty) {\n html = "<p class=\"text-muted\">No subcategories found</p>";\n } else {\n querySnapshot.forEach((doc) => {\n const data = doc.data();\n html += `\n <div class=\"d-flex justify-content-between align-items-center mb-2 p-2 border rounded\">\n <div>\n <strong>${data.title}</strong>\n <br><small class=\"text-muted\">${data.description || ""}</small>\n </div>\n <div>\n <a href=\"/subcategories/edit/${data.id}\" class=\"btn btn-sm btn-primary mr-1\">\n <i class=\"mdi mdi-lead-pencil\"></i>\n </a>\n <button class=\"btn btn-sm btn-danger\" onclick=\"deleteSubcategory(\"${data.id}\")\">\n <i class=\"mdi mdi-delete\"></i>\n </button>\n </div>\n </div>\n `;\n });\n }\n \n $(\"#subcategories_list\").html(html);\n }\n }\n\n async function deleteSubcategory(subcategoryId) {\n if (confirm(\"Are you sure you want to delete this subcategory?\")) {\n await database.collection(\"vendor_subcategories\").doc(subcategoryId).delete();\n loadSubcategories();\n }\n }\n\n // Load subcategories when page loads\n $(document).ready(function() {\n loadSubcategories();\n });' resources/views/categories/edit.blade.php cat > SUBCATEGORIES_README.md << 'EOF' # نظام Subcategories (الفئات الفرعية) ## نظرة عامة تم إضافة نظام subcategories للموقع الحالي، مما يسمح بإنشاء فئات فرعية تحت كل كاتيجوري رئيسية. ## الميزات المضافة ### 1. إدارة Subcategories - إنشاء subcategory جديدة - تعديل subcategory موجودة - حذف subcategory - عرض جميع الـ subcategories ### 2. ربط Subcategories مع الكاتيجوري - كل subcategory مرتبطة بكاتيجوري رئيسية - كل subcategory مرتبطة بقسم (section) - عرض الـ subcategories في صفحة تعديل الكاتيجوري ### 3. واجهة المستخدم - صفحة رئيسية لعرض جميع الـ subcategories - نموذج إنشاء subcategory جديدة - نموذج تعديل subcategory موجودة - أزرار سريعة للوصول للـ subcategories ## الملفات المضافة ### Controllers - `app/Http/Controllers/SubcategoryController.php` - كنترولر إدارة الـ subcategories ### Views - `resources/views/subcategories/index.blade.php` - صفحة عرض جميع الـ subcategories - `resources/views/subcategories/create.blade.php` - صفحة إنشاء subcategory جديدة - `resources/views/subcategories/edit.blade.php` - صفحة تعديل subcategory موجودة ### Routes تم إضافة الروابط التالية في `routes/web.php`: ```php Route::middleware(['permission:subcategories,subcategories'])->group(function () { Route::get('/subcategories', [App\Http\Controllers\SubcategoryController::class, 'index'])->name('subcategories'); }); Route::middleware(['permission:subcategories,subcategories.edit'])->group(function () { Route::get('/subcategories/edit/{id}', [App\Http\Controllers\SubcategoryController::class, 'edit'])->name('subcategories.edit'); }); Route::middleware(['permission:subcategories,subcategories.create'])->group(function () { Route::get('/subcategories/create', [App\Http\Controllers\SubcategoryController::class, 'create'])->name('subcategories.create'); }); ``` ### Menu تم إضافة رابط الـ subcategories في القائمة الجانبية. ### Translations تم إضافة الترجمات العربية والإنجليزية للـ subcategories. ## كيفية الاستخدام ### 1. إنشاء Subcategory جديدة 1. اذهب إلى صفحة Subcategories 2. اضغط على زر "Create Subcategory" 3. اختر القسم (Section) 4. اختر الكاتيجوري الرئيسية 5. أدخل اسم ووصف الـ subcategory 6. ارفع صورة 7. اضغط Save ### 2. تعديل Subcategory موجودة 1. اذهب إلى صفحة Subcategories 2. اضغط على أيقونة التعديل بجانب الـ subcategory المطلوبة 3. قم بالتعديلات المطلوبة 4. اضغط Save ### 3. عرض Subcategories في الكاتيجوري - في صفحة تعديل الكاتيجوري، ستجد قسم يعرض جميع الـ subcategories المرتبطة - يمكنك إنشاء subcategory جديدة مباشرة من هناك - يمكنك تعديل أو حذف أي subcategory ## قاعدة البيانات ### Collection: vendor_subcategories ```json { "id": "unique_id", "title": "اسم الـ subcategory", "description": "وصف الـ subcategory", "photo": "رابط الصورة", "section_id": "id القسم", "category_id": "id الكاتيجوري الرئيسية", "publish": true/false } ``` ## الأمان - جميع العمليات محمية بـ middleware authentication - يتم التحقق من الصلاحيات قبل الوصول للعمليات ## التوافق مع Flutter النظام مصمم ليعمل مع تطبيق Flutter بدون الحاجة لتغييرات في API: - يستخدم نفس قاعدة البيانات Firebase - نفس هيكل البيانات - نفس نظام الصلاحيات ## ملاحظات مهمة 1. تأكد من وجود صلاحيات subcategories للمستخدم 2. كل subcategory يجب أن تكون مرتبطة بكاتيجوري وقسم 3. الصور يتم حفظها في Firebase Storage 4. النظام يدعم اللغتين العربية والإنجليزية EOF cd /home/u403571817/domains/rawneeded.anmka.com/public_html && sed -i '/async function getProductTotal/a\ async function getSubcategoryCount(categoryId) {\ var subcategory_total = 0;\ try {\ await database.collection("vendor_subcategories").where("category_id", "==", categoryId).get().then(async function (subcategorySnapshots) {\ subcategory_total = subcategorySnapshots.docs.length;\ });\ } catch (error) {\ console.error("Error getting subcategory count:", error);\ }\ return subcategory_total;\ }' resources/views/categories/index.blade.php sed -i 's/const orderableColumns = (checkDeletePermission) ? \['\''\'\'', '\''title'\'', '\''sectionName'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''\] : \['\''title'\'', '\''sectionName'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''\];/const orderableColumns = (checkDeletePermission) ? ['\''\'\'', '\''title'\'', '\''sectionName'\'', '\''subcategoryCount'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''] : ['\''title'\'', '\''sectionName'\'', '\''subcategoryCount'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''];/' resources/views/categories/index.blade.php sed -i 's/orderable: false, targets: (checkDeletePermission==true) ? \[0,4,5\] : \[3,4\]/orderable: false, targets: (checkDeletePermission==true) ? [0,4,5,6] : [3,4,5]/' resources/views/categories/index.blade.php sed -i 's/order: (checkDeletePermission) ? \[1, '\''asc'\''\] : \[0, '\''asc'\''\]/order: (checkDeletePermission) ? [1, '\''asc'\''] : [0, '\''asc'\'']/' resources/views/categories/index.blade.php grep -n "orderableColumns" resources/views/categories/index.blade.php grep -n "columnDefs" resources/views/categories/index.blade.php sed -n '323,330p' resources/views/categories/index.blade.php sed -i 's/targets: (checkDeletePermission==true) ? \[0,4,5\] : \[3,4\]/targets: (checkDeletePermission==true) ? [0,4,5,6] : [3,4,5]/' resources/views/categories/index.blade.php sed -n '323,330p' resources/views/categories/index.blade.php grep -n "getSubcategoryCount" resources/views/categories/index.blade.php cp resources/views/categories/index.blade.php resources/views/categories/index_backup.blade.php sed -n '545,580p' resources/views/categories/index.blade.php sed -i 's/const orderableColumns = (checkDeletePermission) ? \['\''\'\'', '\''title'\'', '\''sectionName'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''\] : \['\''title'\'', '\''sectionName'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''\];/const orderableColumns = (checkDeletePermission) ? ['\''\'\'', '\''title'\'', '\''sectionName'\'', '\''subcategoryCount'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''] : ['\''title'\'', '\''sectionName'\'', '\''subcategoryCount'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''];/' resources/views/categories/index.blade.php sed -i '579,595d' resources/views/categories/index.blade.php php artisan route:list | grep categories sed -i '/async function buildHTML(val) {/i\ // New function to get subcategory count\n async function getSubcategoryCount(categoryId) {\n var subcategoryCount = 0;\n if (categoryId != \'\'\') {\n await database.collection(\"vendor_subcategories\").where(\"category_id\", \"==\", categoryId).get().then(async function (subcategorySnapshots) {\n subcategoryCount = subcategorySnapshots.docs.length;\n });\n }\n return subcategoryCount;\n }\n\n' resources/views/categories/index.blade.php wc -l resources/views/categories/index.blade.php grep -n "async function buildHTML" resources/views/categories/index.blade.php grep -n "subcategoryCount" resources/views/categories/index.blade.php grep -n "async function buildHTML" resources/views/categories/index.blade.php sed -n '420,440p' resources/views/categories/index.blade.php sed -i '400i\ // New function to get subcategory count\n async function getSubcategoryCount(categoryId) {\n var subcategoryCount = 0;\n if (categoryId != \"\") {\n await database.collection(\"vendor_subcategories\").where(\"category_id\", \"==\", categoryId).get().then(async function (subcategorySnapshots) {\n subcategoryCount = subcategorySnapshots.docs.length;\n });\n }\n return subcategoryCount;\n }\n' resources/views/categories/index.blade.php grep -n "totalProducts = await getProductTotal" resources/views/categories/index.blade.php sed -i '222a\ var subcategoryCount = await getSubcategoryCount(childData.id);' resources/views/categories/index.blade.php grep -n "childData.totalProducts = totalProducts" resources/views/categories/index.blade.php sed -i '222d' resources/views/categories/index.blade.php sed -i 's/(childData.totalProducts && childData.totalProducts.toString().includes(searchValue)) ||/(childData.totalProducts && childData.totalProducts.toString().includes(searchValue)) ||\n (childData.subcategoryCount && childData.subcategoryCount.toString().includes(searchValue)) ||/' resources/views/categories/index.blade.php sed -i 's/if (orderByField === '\''totalProducts'\'') {/if (orderByField === '\''totalProducts'\'' || orderByField === '\''subcategoryCount'\'') {/' resources/views/categories/index.blade.php cp resources/views/categories/index_backup.blade.php resources/views/categories/index.blade.php sed -i 's/const orderableColumns = (checkDeletePermission) ? \['\''\'\'', '\''title'\'', '\''sectionName'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''\] : \['\''title'\'', '\''sectionName'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''\];/const orderableColumns = (checkDeletePermission) ? ['\''\'\'', '\''title'\'', '\''sectionName'\'', '\''subcategoryCount'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''] : ['\''title'\'', '\''sectionName'\'', '\''subcategoryCount'\'', '\''totalProducts'\'', '\''\'\'', '\''\'\''];/' resources/views/categories/index.blade.php grep -n "async function buildHTML" resources/views/categories/index.blade.php sed -i '400i\ // New function to get subcategory count\n async function getSubcategoryCount(categoryId) {\n var subcategoryCount = 0;\n if (categoryId != \"\") {\n await database.collection(\"vendor_subcategories\").where(\"category_id\", \"==\", categoryId).get().then(async function (subcategorySnapshots) {\n subcategoryCount = subcategorySnapshots.docs.length;\n });\n }\n return subcategoryCount;\n }\n' resources/views/categories/index.blade.php echo '// New function to get subcategory count' > temp_function.txt . "/home/u403571817/.cursor-server/bin/e50823e9ded15fddfd743c7122b4724130c25df0/out/vs/workbench/contrib/terminal/common/scripts/shellIntegration-bash.sh" scp -P 65002 /home/u403571817/domains/bandorinasilver-com-20250819-095012-2xf07zkkpczc.wpress u340569411@145.223.112.202:/home/u340569411/domains/bandorinasilver.com/public_html/wp-content/ai1wm-backups/ ls cd public_html ls -lah cd domains/stylzeg.com/public_html . "\home\u403571817\.cursor-server\bin\af58d92614edb1f72bdd756615d131bf8dfa5290\out\vs\workbench\contrib\terminal\common\scripts\shellIntegration-bash.sh" cd site_backup && php run_laravel.php cd site_backup && php artisan key:generate --force ls -la php artisan key:generate --force cat .env php artisan migrate --force php fix_database.php php create_env.php cp .env .env.backup cd /home/u403571817/domains/theway.anmka.com/public_html && php artisan migrate --force pwd && ls -la ls cd site_backup && php artisan migrate --force cd site_backup && cat .env ls -la site_backup/ ls -la cat .env php artisan migrate --force php artisan config:clear && php artisan cache:clear php artisan migrate --force cat config/database.php | grep -A 20 "mysql" sed -i 's/database.*=>.*u996301192_theway/database => env(\"DB_DATABASE\", \"u996301192_theway\")/' config/database.php sed -i 's/username.*=>.*u996301192_theway/username => env(\"DB_USERNAME\", \"u996301192_theway\")/' config/database.php sed -i 's/password.*=>.*Anmka@2222/password => env(\"DB_PASSWORD\", \"Anmka@2222\")/' config/database.php php artisan config:clear && php artisan cache:clear php artisan migrate --force cat config/database.php | grep -A 10 "mysql" cp config/database.php config/database.php.backup sed -i 's/database.*=>.*u996301192_theway/database => env("DB_DATABASE", "u996301192_theway")/' config/database.php sed -i 's/username.*=>.*u996301192_theway/username => env("DB_USERNAME", "u996301192_theway")/' config/database.php sed -i 's/password.*=>.*Anmka@2222/password => env("DB_PASSWORD", "Anmka@2222")/' config/database.php cat config/database.php | grep -A 10 "mysql" cp config/database.php.backup config/database.php sed -i 's/database.*=>.*u996301192_theway/database => env("DB_DATABASE", "u996301192_theway")/' config/database.php sed -i 's/username.*=>.*u996301192_theway/username => env("DB_USERNAME", "u996301192_theway")/' config/database.php sed -i 's/password.*=>.*Anmka@2222/password => env("DB_PASSWORD", "Anmka@2222")/' config/database.php cat config/database.php | grep -A 10 "mysql" cat .env echo 'APP_NAME="TheWay" APP_ENV=production APP_KEY=base64:yT0rFYx2h1HXwjXmBJXLO6nRSW7EFMV1jHvpXIJw/HQ= APP_DEBUG=true APP_URL=https://theway.anmka.com ASSET_URL=${APP_URL} LOG_CHANNEL=stack LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=u403571817_thewaynew DB_USERNAME=u403571817_thewaynew DB_PASSWORD=Anmka@2222 BROADCAST_DRIVER=log CACHE_DRIVER=file FILESYSTEM_DISK=public QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 SESSION_SECURE_COOKIE=false MEMCACHED_HOST=127.0.0.1 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=log MAIL_HOST=smtp.hostinger.com MAIL_PORT=465 MAIL_USERNAME= MAIL_PASSWORD= MAIL_ENCRYPTION=ssl MAIL_FROM_ADDRESS=no-reply@theway.anmka.com MAIL_FROM_NAME="${APP_NAME}" SANCTUM_STATEFUL_DOMAINS=theway.anmka.com SESSION_DOMAIN=theway.anmka.com' > .env cat .env php artisan config:clear && php artisan cache:clear php artisan migrate --force head -50 config/database.php | grep -A 15 "mysql" sed -n '40,60p' config/database.php cp config/database.php.backup config/database.php sed -i 's/database.*=>.*u996301192_theway/database => env("DB_DATABASE", "u996301192_theway")/' config/database.php sed -i 's/username.*=>.*u996301192_theway/username => env("DB_USERNAME", "u996301192_theway")/' config/database.php sed -i 's/password.*=>.*Anmka@2222/password => env("DB_PASSWORD", "Anmka@2222")/' config/database.php sed -n '40,60p' config/database.php cp config/database.php.backup config/database.php sed -i 's/database.*=>.*u996301192_theway/database => env("DB_DATABASE", "u996301192_theway")/' config/database.php sed -i 's/username.*=>.*u996301192_theway/username => env("DB_USERNAME", "u996301192_theway")/' config/database.php sed -i 's/password.*=>.*Anmka@2222/password => env("DB_PASSWORD", "Anmka@2222")/' config/database.php sed -n '40,60p' config/database.php cp config/database.php.backup config/database.php sed -i 's/database.*=>.*u996301192_theway/database => env("DB_DATABASE", "u996301192_theway")/' config/database.php sed -i 's/username.*=>.*u996301192_theway/username => env("DB_USERNAME", "u996301192_theway")/' config/database.php sed -i 's/password.*=>.*Anmka@2222/password => env("DB_PASSWORD", "Anmka@2222")/' config/database.php sed -n '40,60p' config/database.php cp config/database.php.backup config/database.php sed -n '40,60p' config/database.php cat config/database.php | grep -A 15 "mysql" php artisan config:clear && php artisan cache:clear php artisan config:clear . "\home\u403571817\.cursor-server\bin\af58d92614edb1f72bdd756615d131bf8dfa5290\out\vs\workbench\contrib\terminal\common\scripts\shellIntegration-bash.sh" cd /home/u403571817/domains/theway.anmka.com/public_html/site_backup && php artisan serve --host=0.0.0.0 --port=8000 cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && npm run start . "\home\u403571817\.cursor-server\bin\af58d92614edb1f72bdd756615d131bf8dfa5290\out\vs\workbench\contrib\terminal\common\scripts\shellIntegration-bash.sh" cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && npm install which node && which npm cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && ls -la cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && find .next -name "*.html" | head -5 cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && ls -la .next/ cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && ls -la .next/server/ cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && ls -la .next/server/app/ cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && ls -la .next/static/ cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && find .next/static/css -name "*.css" | head -3 cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && find .next/static/css -name "globals.css" cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && ls -la .next/static/css/app/ cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && ls -la .next/static/chunks/ | head -10 cd "/home/u403571817/domains/theway.anmka.com/public_html/the-way-lms-fallback (2)" && ls -la .next/server/app/ . "\home\u403571817\.cursor-server\bin\af58d92614edb1f72bdd756615d131bf8dfa5290\out\vs\workbench\contrib\terminal\common\scripts\shellIntegration-bash.sh" cd ~/domains/theway.anmka.com/public_html/the-way-lms-fallback npm install npm run build npm run start php artisan serve --host=0.0.0.0 --port=8000 cd site_backup && composer install curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer cd site_backup && php composer.phar install ls -la php composer.phar install ls -la .env* php artisan key:generate php artisan migrate:status php artisan migrate php artisan tinker --execute="Schema::getColumnListing('users')" php -r "echo 'PHP version: ' . PHP_VERSION . PHP_EOL;" cat .env cd "the-way-lms-fallback (2)" && npm install cd .. && ls -la cd "../the-way-lms-fallback (2)" && npm install cd /home/u403571817/domains/theway.anmka.com/public_html/"the-way-lms-fallback (2)" && npm install which node && which npm && which nodejs curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - && sudo apt-get install -y nodejs curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash . "\home\u403571817\.cursor-server\bin\6af2d906e8ca91654dd7c4224a73ef17900ad730/out/vs/workbench/contrib/terminal/common/scripts/shellIntegration-bash.sh" . "/home/u403571817/.cursor-server/bin/a8e95743c5268be73767c46944a71f4465d05c90/out/vs/workbench/contrib/terminal/common/scripts/shellIntegration-bash.sh" ls -la /home/u403571817/domains/appmrbahermahmoud.anmka.com/public_html/ ls -la /home/u403571817/domains/appmrbahermahmoud.anmka.com/public_html/public/ ls -la find . -name ".env*" -type f ls -la storage/ ls -la storage/framework/ && ls -la storage/logs/ ls -la .env* tail -20 storage/logs/laravel.log cat .env chmod 755 storage/framework/cache storage/framework/sessions storage/framework/views storage/logs chmod -R 755 storage/ && chmod -R 644 storage/logs/*.log php artisan config:clear && php artisan cache:clear && php artisan view:clear chmod 644 .htaccess && chmod 644 public/.htaccess && chmod 755 public/ php artisan route:clear && php artisan optimize php artisan config:clear && rm -f bootstrap/cache/config.php chmod 644 test.php . "/home/u403571817/.cursor-server/bin/5911e9593196a000b1c00553aaf03b0b32042b90/out/vs/workbench/contrib/terminal/common/scripts/shellIntegration-bash.sh" . "\home\u403571817\.cursor-server\bin\fe5d1728063e86edeeda5bebd2c8e14bf4d0f960/out/vs/workbench/contrib/terminal/common/scripts/shellIntegration-bash.sh" . "/home/u403571817/.cursor-server/bin/9e7a27b76730ca7fe4aecaeafc58bac1e2c82120/out/vs/workbench/contrib/terminal/common/scripts/shellIntegration-bash.sh"
Save
Cancel