Moon ERP · تحليل واجهة + جدوى

جدول اختيار الأصناف: توحيد الشكل + تحكّم المستخدم في الأعمدة (سحب وحفظ دائم) Line-items grid — unify the look & make columns user-arrangeable + persistent

طلبت حاجتين على قسم اختيار المنتج/الأصناف (في البيع والشراء وكل مكان): (1) توحيد الـ padding وشكل الخانات مع حقل البحث عن المنتج، (2) هل ممكن المستخدم يتحكّم في عرض الأعمدة لكل مكان على حدة (سحب/إظهار-إخفاء) ويتحفظ بشكل دائم. ده التحليل بالحقائق من الكود + خطة قابلة للتنفيذ.

📅 2026-06-23 النطاق: FE Angular 21 / PrimeNG v21 الخلاصة: الاتنين ممكنين · محتاجين توحيد أولًا

! الخلاصة في سطرين

تنويه مهم (بعد تحقّق فعلي بالكود): اللي مشترك فعلًا في كل المستندات هو حقل البحث عن المنتج (app-product-search — مستخدم في 19 شاشة: بيع/شراء/مرتجعات/تصنيع/مخازن) — وده اللي بيخلّيها كلها نفس الشكل في البحث. لكن الجدول كامل (الأعمدة وترتيبها وباقي الخانات) لسه متكرّر يدويًا في كل شاشة — موحّد بس عبر المكوّن TransactionLineItemsComponent في أمر البيع وحده.

الخلاصة: الاتنين قابلين للتنفيذ — بس العقبة إن الجدول (مش البحث) مش موحّد. نوحّد المستندات على المكوّن المشترك الأول، وبعدها «الأعمدة القابلة للسحب والمحفوظة» تبقى سهلة. وعندنا نصف الحل موجود: إظهار/إخفاء الحقول محفوظ فعلًا (لكن لكل الشركة مش لكل مستخدم).

تحقّق فعلي (grep على الكود): app-product-search19 شاشة (مشترك ✓) · TransactionLineItemsComponent1 شاشة فقط (أمر البيع). فاللبس كان: المشترك هو البحث مش الجدول.

1 الوضع الحالي (الحقائق من الكود)

أ) المكوّن المشترك — موجود لكن غير مُستغَل

المستندبيستخدم المكوّن المشترك؟تعريف الأعمدة
أمر بيع (Sales Order)✅ نعم — TransactionLineItemsComponentconfig array (lineDescriptor.columns)
فاتورة بيع❌ جدول خاص بيهhardcoded في الـ HTML + lineColRatios
أمر/فاتورة شراء❌ جدول خاصhardcoded في الـ HTML
مرتجعات / عروض أسعار❌ (على الأرجح خاص)hardcoded

المكوّن المشترك مصمَّم صح — وصف تعريفي (descriptor) فيه الأعمدة كـ data، ورندر حسب النوع:

// shared/components/transaction-line-items/transaction-line.types.ts
interface TxColumn {
  key: string;            // اسم الحقل
  type: TxCellType;        // product | select | number | percent | computed | action
  labelKey: string;       // مفتاح الترجمة
  width?: string;          // '26%' أو '120px'
  visible?: () => boolean;  // إظهار/إخفاء تفاعلي
}
المعنى: في أمر البيع الأعمدة «بيانات» يسهل ترتيبها/إخفاؤها برمجيًا. في باقي الشاشات الأعمدة «HTML ثابت» — يعني أي ميزة تحكّم لازم تتكرر يدويًا في كل شاشة. التوحيد شرط أساسي.
لكن انتبه: رغم إن الجدول مش موحّد، حقل البحث عن المنتج (app-product-search) موحّد فعلًا في كل المستندات (19 شاشة). فلو شفت إن كل الشاشات «نفس الشكل في البحث» — ده صح: هو نفس المكوّن المشترك. اللي بيختلف بين الشاشات هو تركيب الأعمدة والخانات حواليه، مش البحث نفسه.

ب) شكل الخانات — في تفاوت بسيط

العنصرالـ padding (رأسي)ملاحظة
حقل البحث عن المنتج .ps-input (مستقل)0.55rem فوق/تحتأطول قليلًا
حقول الكمية/السعر p-inputNumber0.3remأقصر
نفس البحث جوه المكوّن المشترك0.3rem (override)متوافق داخل الجدول الموحّد ✓

يعني جوه المكوّن المشترك الأطوال متوافقة (المكوّن بيعمل override). التفاوت بيظهر في الشاشات اللي مش مستخدماه (لأنها بتطبّق ستايلها الخاص)، وفي الستايل الافتراضي للبحث لما يُستخدم لوحده. حل بسيط: توكِن CSS موحّد لارتفاع/padding خانة الجدول.

ج) حفظ تفضيلات العرض — نصّه موجود فعلًا

القدرةالحالة اليومالتخزين
إظهار/إخفاء حقل (عمود) لكل مستند🟡 موجود — DocConfigServicebackend (إعداد core.document_settings) — لكل الشركة
إلزامية حقل (required) لكل مستند🟡 موجودنفس المكان (لكل الشركة)
إظهار/إخفاء أعمدة شاشات القوائم (مش الأصناف)❌ مؤقت (في الذاكرة)مايتحفظش — يرجع مع الـ reload
ترتيب الأعمدة (سحب reorder)❌ غير موجود
عرض الأعمدة (resize)❌ غير موجود
تفضيلات لكل مستخدم (مش الشركة)❌ غير موجود
خبر كويس: «إظهار/إخفاء الأعمدة لكل مستند ويتحفظ دائم» — موجود فعلًا عبر DocConfigService (محفوظ في الباك-إند لكل الشركة). الناقص للطلب الكامل = الترتيب بالسحب، العرض، والتخصيص لكل مستخدم بدل لكل الشركة.

2 السؤال الأول: توحيد شكل الخانات مع البحث

جهد: منخفض   ممكن وسهل — وجزء منه متحقّق أصلًا.

البحث عن المنتج نفسه متوحّد فعلًا (نفس المكوّن في 19 شاشة) فهو متّسق. اللي بيختلف هو الخانات المجاورة (الكمية/السعر/الخصم) وارتفاع خلية الجدول بين الشاشات اللي بتكتب جدولها يدويًا. الحل: نعرّف توكِن/كلاس CSS موحّد لخانة جدول الأصناف (نفس الارتفاع، نفس الـ padding، نفس الـ border-radius والـ focus) ونطبّقه على حقل البحث .ps-input وحقول p-inputNumber/p-select سواء جوه المكوّن المشترك أو بره. المكوّن المشترك بيعمل ده جزئيًا بالفعل (override لـ 0.3rem) — نعمّمه ونثبّته كمعيار.

التوصية: ننفّذه كجزء من التوحيد (السؤال 2) — لأن أول ما كل الشاشات تستخدم نفس المكوّن، الشكل بيتوحّد تلقائيًا من مكان واحد.

3 السؤال الثاني: أعمدة قابلة للسحب ومحفوظة لكل مكان

ممكن — نعم. بس بيمرّ بثلاث طبقات، والترتيب مهم:

الطبقة 1 — توحيد كل المستندات على المكوّن المشترك جهد: متوسط

نحوّل فاتورة البيع + أوامر/فواتير الشراء + المرتجعات + عروض الأسعار تستخدم TransactionLineItemsComponent بوصف descriptor خاص بكل واحدة (زي أمر البيع بالظبط). كده الأعمدة كلها تبقى data في مكان واحد — وده الأساس لأي تحكّم. مكسب جانبي: توحيد الشكل (السؤال 1) بيحصل مجانًا.

الطبقة 2 — السحب (ترتيب) + إظهار/إخفاء + (اختياري) العرض جهد: متوسط

المكوّن المشترك بيستخدم <table> عادي (مش p-table). نضيف:

الطبقة 3 — الحفظ الدائم لكل مكان (وربما لكل مستخدم) جهد: متوسط

عندنا مسارين للتخزين:

الخيارالمكانالمناسب لـ
أ) توسيع DocConfigService (الموجود)backend — لكل الشركة، لكل مستند«إعداد مرة واحدة للشركة كلها» — أسرع، يبني على الموجود
ب) خدمة تفضيلات لكل مستخدم (جديدة)backend user_ui_preferences (user × document) أو localStorage«كل مستخدم يرتّب جدوله زي ما يحب» — ده اللي بتقصده غالبًا بـ«سحب ويحفظ دائم»

حاليًا التحكّم محفوظ لكل الشركة (DocConfigService). لو عايز كل مستخدم يرتّب أعمدته بشكله الخاص ويتحفظ معاه على أي جهاز → الخيار (ب).

توضيح مهم في «لكل مكان على حدة»: النظام بالفعل بيفرّق بين المستندات (sales.ordersales.invoicepurchases.bill…) في DocConfigService. فـ«تخصيص لكل مكان» متوفّر هيكليًا — ينقص بس نمدّه ليشمل الترتيب/العرض + (اختياريًا) البُعد لكل مستخدم.

4 خطة مقترحة (مرحلية)

1

توحيد + توكِن الشكل

متوسط
نقل فاتورة البيع (أول وأهم) للمكوّن المشترك بوصف descriptor، + توكِن CSS موحّد لخانة الجدول. مكسب فوري: شكل موحّد + أساس للتحكّم. (نكرّرها لباقي المستندات تباعًا.)
2

منتقي أعمدة + سحب الترتيب

متوسط
زرّ ⚙ لإظهار/إخفاء الأعمدة + سحب رؤوس الأعمدة لإعادة الترتيب (CDK DragDrop)، في المكوّن المشترك = يشتغل في كل المستندات مرة واحدة.
3

الحفظ الدائم

متوسط
نبدأ بالأسهل: حفظ ترتيب/إظهار الأعمدة في DocConfigService (لكل الشركة، لكل مستند). لو طُلب لكل مستخدم → خدمة user_ui_preferences.
4

(اختياري) عرض الأعمدة بالسحب

أعلى
resize الأعمدة + حفظ العرض — الأنسب لو حوّلنا المكوّن لـ p-table (يجي بـ resizableColumns جاهز).

الزبدة