انتقل إلى المحتوى

استوديو التطبيقات المخصصة (Custom App Studio)

استوديو التطبيقات المخصصة أداة بناء منخفضة الكود (Low-Code) داخل Teknora EAM، تتيح لك إضافة "تطبيق" جديد بالكامل (نموذج بيانات + شاشة قائمة + شاشة تفاصيل) دون كتابة كود، مع تحديد شكله بالسحب والإفلات، وترجمته إلى أي لغة من لغات النظام الإحدى عشرة.

نظرة عامة على الاستوديو

المكونات الأساسية

تنقسم الشاشة إلى ثلاث مناطق:

المنطقة الوظيفة
الشريط العلوي (لوحة أنواع الحقول) أزرار لإضافة حقل جديد إلى التبويب الحالي: Text, Textarea, Number, Date, Date & Time, Yes/No, Select, Link, Table, Image
لوحة العمل (الوسط) معاينة حية (WYSIWYG) للنموذج - ما تراه هنا هو بالضبط ما سيظهر للمستخدم عند التشغيل
لوحة الخصائص (يمين) تتغيّر تلقائيًا وفق العنصر الذي تنقر عليه في لوحة العمل: النموذج كاملًا، تبويب، قسم، أو حقل

خصائص النموذج (Form Properties)

انقر على شريط "Form Properties" أعلى لوحة العمل لعرض خصائص التطبيق ككل:

  • العنوان: الاسم الأساسي للتطبيق (يظهر في الشريط الجانبي والقائمة العلوية).
  • الترجمات: ترجمة اسم التطبيق إلى أي عدد من اللغات الإحدى عشرة - يرى المستخدم الذي يعمل بلغة مترجمة الاسم المترجم تلقائيًا.
  • الأيقونة: اسم أيقونة من مكتبة lucide-react.
  • الفئة: تصنيف التطبيق ضمن قائمة "Custom Applications".
  • إظهار شريط العنوان في النموذج: التحكم في ظهور اسم التطبيق والحقل الأساسي وحقل الوصف في رأس شاشة التفاصيل.
  • مخفي: يُخفي التطبيق من الشريط الجانبي والقائمة دون حذفه.
  • يقبل مرفقات: يضيف أيقونة مرفقات (📎) في رأس شاشة التفاصيل.
  • يقبل سير عمل (Workflow): علامة نية فقط حاليًا، دون محرك سير عمل فعلي حتى الآن.
  • له تقارير: يفعّل زر "Print Reports" الحقيقي في شاشة التفاصيل، ويجعل التطبيق يظهر كمصدر بيانات قابل للاختيار في Report Designer.
  • يقبل تغيير الحالة: يفعّل نظام تغيير الحالة الحقيقي (نفس النظام المستخدم في شاشتي الأصول وأوامر الشغل)، ويطلب منك اختيار دومين تُستمد منه قيم الحالة (مثل ASSETSTATUS).

التبويبات (Tabs)

خصائص التبويب

انقر على أي تبويب في لوحة العمل لتعديل خصائصه:

  • الاسم: اسم التبويب كما سيظهر للمستخدم.
  • الأيقونة: قائمة منسدلة تضم مجموعة أيقونات جاهزة يمكنك الاختيار منها - تظهر هذه الأيقونة بجانب اسم التبويب في لوحة العمل وفي شاشة التفاصيل عند التشغيل.
  • الترجمات: ترجمة اسم التبويب إلى أي لغة.
  • مخفي: يُخفي التبويب بالكامل من شاشة التفاصيل دون حذف الحقول التي بداخله.

انقر على "+" بجانب آخر تبويب لإضافة تبويب جديد.

الأقسام (Sections)

خصائص القسم

ينقسم كل تبويب إلى أقسام (مجموعات حقول). انقر على عنوان أي قسم من أجل:

  • تغيير اسمه وترجمته.
  • تحديد عدد الأعمدة (1 أو 2 أو 3) - وهذا يتحكم في شبكة الـ CSS Grid الفعلية التي يُرسم بها النموذج، وليس مجرد شكل تقريبي.
  • حذف القسم - تعود الحقول التي بداخله إلى حالة "غير مصنّفة" ولا تُحذف.

الحقول (Fields)

خصائص حقل نصي

انقر على أي حقل لتعديل:

  • العنوان واسم الحقل (يُولَّد اسم الحقل تلقائيًا ولا يمكن تعديله).
  • الترجمات - بنفس فكرة ترجمة التبويب.
  • التبويب والقسم اللذين سيظهر فيهما الحقل.
  • مطلوب: يفعّل تحققًا فعليًا (native HTML validation) لا يسمح بالحفظ دونه.
  • يظهر في القائمة: يتحكم في ظهور هذا العمود في شاشة القائمة من عدمه.
  • أساسي (Primary): الحقل الأساسي الذي يمثّل "عنوان" السجل - يظهر في رأس شاشة التفاصيل بدلًا من تكراره في متن النموذج، ويُقفل (لا يمكن تعديله) بعد أول عملية حفظ.
  • للقراءة فقط (Read Only): يُعرض الحقل دون إمكانية تعديله يدويًا - مفيد لحقل يتحكم فيه سكربت إجراء (Action Script)، مثل إجمالي يُحسب تلقائيًا.

خصائص حقل رقمي: للقراءة فقط وصيغة الرقم

إذا كان نوع الحقل رقمًا، يظهر خيار إضافي:

  • صيغة الرقم (Number Format): عدد صحيح (الافتراضي)، أو عشري (Float)، أو عملة (Currency) - يتيح اختيار العشري أو العملة للحقل قبول كسور عادةً (مثل 450.75) دون أن يعتبرها المتصفح قيمة "غير صالحة".

أنواع الحقول

بالإضافة إلى الأنواع البسيطة (نص، رقم، تاريخ، نعم/لا، اختيار من قائمة)، يوجد نوعان متقدمان:

خصائص حقل الرابط

حقل يشير إلى سجل حقيقي في مكان آخر بدلًا من أن يكون نصًا حرًا. يمكنك اختيار أن يشير إلى:

  • دومين: أي دومين من دومينات النظام.
  • جدول من النظام: جدول حقيقي مثل Assets, Locations, Items, Labors...
  • كائن مخصص (Custom Object): تطبيق مخصص آخر أنشأته أنت.

ويوجد خيار "تصفية النتائج حسب الموقع الحالي" - إذا كان مفعّلًا، يعيد البحث نتائج موقع (Site) المستخدم فقط.

حقل الجدول (Table)

خصائص حقل الجدول

حقل يسمح بإضافة صفوف متعددة داخل السجل الواحد (مثل جدول قطع الغيار في شاشة الأصول). توجد ثلاث طرق لتعريفه:

  1. تعريف الأعمدة يدويًا: تضيف الأعمدة بنفسك، وكل عمود يمكن أن يكون نصًا/رقمًا/تاريخًا/نعم أو لا/قائمة (List)، أو حتى رابطًا يشير إلى سجل حقيقي (مثل عمود "الأصل" الذي يفتح بحثًا في جدول Assets).
  2. ربط بكائن: يأخذ الجدول أعمدته تلقائيًا من حقول تطبيق مخصص آخر.
  3. ربط بدومين: يسمح الجدول بإضافة صفوف من قيم دومين معيّن.

خصائص أعمدة الجدول: العرض، للقراءة فقط، قائمة اختيارات، صيغة العملة

لكل عمود مُعرَّف يدويًا، توجد خصائص إضافية:

  • العرض (Width): رقم نسبي (بنفس نظام الأعمدة في ERPNext) - عمود بعرض 2 يأخذ ضعف مساحة عمود بعرض 1، وليس عرضًا ثابتًا بالبكسل.
  • للقراءة فقط: بنفس فكرة الحقل العادي لكن على مستوى العمود - مفيد لعمود يُحسب تلقائيًا بواسطة سكربت (مثل عمود إجمالي السطر).
  • نوع قائمة (List): يمنحك خانة "Choices" تكتب فيها القيم مفصولة بفاصلة - يظهر العمود عند التشغيل كقائمة منسدلة (Dropdown) بنفس هذه القيم.
  • صيغة الرقم: إذا كان العمود رقمًا، يمكنك اختيار عدد صحيح/عشري/عملة كأي حقل رقمي عادي.

الجدول عند التشغيل: صف فيه عمود قائمة وعمود عملة

سكربتات الإجراءات (Action Scripts)

كل تطبيق مخصص يمكن أن يمتلك سكربتات Python مرتبطة بأحداث دورة حياة السجل، تُنفَّذ في بيئة معزولة (Sandboxed) ذات صلاحيات محدودة. تُفتح هذه السكربتات من زر ACTION SCRIPTS أعلى يمين شاشة الاستوديو، لا من داخل تعريف الحقل نفسه.

قائمة سكربتات الإجراءات لتطبيق الشاحنات، تضم سكربتًا قبل الحفظ وآخر عند التغيير

تعرض هذه القائمة اسم كل سكربت، والحدث المرتبط به، وحالته (نشط/غير نشط)، وتتيح تعديله أو حذفه، بالإضافة إلى زر CREATE NEW SCRIPT لإنشاء سكربت جديد.

الأحداث (Events)

عند فتح أو إنشاء سكربت، تختار من قائمة EVENT أحد الأحداث الخمسة التالية:

  • before_save: يُنفَّذ قبل حفظ السجل مباشرة - مناسب لحساب قيم أو رفض الحفظ عند خطأ في البيانات.
  • after_save: يُنفَّذ بعد نجاح الحفظ.
  • before_delete: يُنفَّذ قبل حذف السجل.
  • after_delete: يُنفَّذ بعد الحذف.
  • on_change: يُنفَّذ مباشرة في واجهة المستخدم عندما يغيّر المستخدم قيمة حقل معيّن، دون الحاجة لحفظ السجل أولًا. عند اختيار هذا الحدث، يظهر منتقٍ إضافي باسم TRIGGER FIELD لتحديد الحقل الذي يُشغّل السكربت عند تغييره.

محرر السكربت

محرر سكربت "High Mileage Alert" على حقل قراءة العداد

يوفّر المحرر لوحتين جانبيتين للمساعدة أثناء الكتابة:

  • ACTION: مقتطفات جاهزة للإجراءات المتاحة داخل السكربت - action.log(...) لتسجيل رسالة في وحدة التحكم، action.toast(...) لعرض إشعار منبثق (Toast) للمستخدم، وaction.prompt(...) لعرض رسالة تأكيد.
  • RECORD FIELDS: قائمة بأسماء حقول السجل الفعلية (مثل text_1, number_3, table_7...) لاستخدامها داخل الكود عبر record.get("اسم_الحقل").

بعد كتابة الكود، يحفظه زر SAVE & DEPLOY وينشره فورًا.

مثال عملي

على تطبيق "الشاحنات"، أُنشئ سكربت باسم "High Mileage Alert" على الحدث on_change مع حقل التشغيل number_3 (قراءة العداد):

reading = record.get("number_3") or 0
if reading > 100000:
    action.toast("This truck may need major service soon", "warning")

بما أن الحدث on_change ينفَّذ في واجهة المستخدم مباشرة، يظهر الإشعار فور تغيير المستخدم لقيمة الحقل، دون الحاجة لحفظ السجل:

إشعار تحذيري يظهر فور تجاوز قراءة العداد 100000

خطوات عملية

1. إنشاء تطبيق مخصص جديد

من قائمة "Custom Applications"، اضغط تطبيق جديد، واملأ الاسم والفئة، ثم ابدأ بإضافة الحقول من الشريط العلوي.

2. تنظيم النموذج

اسحب الحقول وأعد ترتيبها، ونظّمها في تبويبات وأقسام منطقية، وحدد عدد أعمدة كل قسم.

3. الترجمة

لكل حقل أو تبويب أو قسم يراه أكثر من مستخدم بلغات مختلفة، اضغط "+ Add language" وأضف الترجمات المطلوبة - لست مضطرًا لترجمة كل اللغات الإحدى عشرة، اختر فقط ما تحتاجه.

4. النشر

عند الانتهاء، اضغط منشور (Published) أعلى الشاشة - لن يظهر التطبيق في الشريط الجانبي أو القائمة العلوية للمستخدمين إلا بعد النشر.

5. الصلاحيات

يجب إضافة صلاحيات القراءة/الإضافة/التعديل/الحذف للتطبيق الجديد من شاشة الأدوار (Roles) - يأخذ كل تطبيق مخصص مفتاح صلاحية تلقائيًا بالصيغة custom_<اسم_التطبيق>.

قبل النشر

تأكد من أن جميع الحقول المطلوبة (Required) والحقل الأساسي (Primary) مُحدَّدة بشكل صحيح قبل النشر - فتغييرها بعد بدء المستخدمين بإدخال البيانات قد يسبب لبسًا.


ارجع إلى: التطبيقات المخصصة ←