# رمز النموذج

## 👨‍💻️ ما هو form code ؟

يتيح لك form code تشغيل وتنفيذ بعض أكواد JavaScript مخصصة أثناء بدء الاستبيان وتشغيله.

يجب أن تمتد الأكواد المخصصة لديك إلى **NGSFormCode** لكي يتم تنفيذها.

```javascript
/*
 مثال يوضح كيفية إرسال إجابات المستجيب 
 إلى REST API تابع لجهة خارجية.

 يمكن أيضًا استخدام Form code لإدراج أكواد جهة خارجية 
 API إلى صفحة النموذج الخاصة بك باستخدام حدثي onInit أو onLoaded
*/
class CustomFormCode extends NGSFormCode { 
  /* تم تحميل النموذج */
  onInit() {}

  /* سيتم استدعاء عنصر أمان يتطلب المصادقة 
     عندما يتطلب استبيان مصادقة من عنصر أمان  
  */
  onAuthenticate(securityItem) {}

  /* سيتم استدعاء عنصر أمان يتطلب المصادقة 
     تمت مصادقة عنصر أمان بنجاح. 
     إرجاع سلسلة نصية من هذه الطريقة سيمنع 
     الوصول إلى الاستبيان بالرسالة المحددة بواسطة 
     السلسلة النصية المُعادة.  
  */
  onAuthenticated(securityItem, securityItemAuthorization) {}

  /* تمت الموافقة على النموذج من جميع عناصر الأمان وتم تحميله  
    بأسئلة الصفحة المرئية الأولى الخاصة به */
  onLoaded() {}

  /* يتم التشغيل عند تحميل صفحة جديدة، وتشير القيمة null للصفحة 
    إلى أنه يتم تحميل صفحة النهاية/شكراً */ 
  */
  onPageLoad(page) {}

  /* يتم التشغيل بمجرد حفظ إجابات جلسة المستجيب على الخادم.
  يحدد action الإجراء الذي أدى إلى حفظ التقدم، ويمكن أن تكون أيًا من القيم التالية
  None = 0, Button = 1, PageChange = 2, QuestionChange = 3, Email = 4, Auto = 5 
  */
  onSaveProgress(ngsRespondent, action) {}

  /* يتم التشغيل بمجرد حفظ إجابات المستجيب على الخادم. */
  onSubmit(ngsRespondent) {
    // تفاصيل المستجيب
    console.log(ngsRespondent.respondent);

    // إجابات المستجيب
    console.log(ngsRespondent.answers);

    // قيم سمات البيانات الخاصة بعناصر الأمان
    console.log(ngsRespondent.dataAttributes);
    
    this.formContext.httpClient.post('http://www.yourrestsite.com/yourapi/saveanswers', 
        ngsRespondent.answers, {}).subscribe();
  }

  /* يتم التشغيل بمجرد تحديث إجابات المستجيب على الخادم. */
  onUpdate(ngsRespondent) {console.log('update', ngsRespondent);}
}
```

الـ **NGSForm** يوفر الصف الأساسي الخصائص التالية التي يمكنك إعادة استخدامها في الصف المشتق.&#x20;

```javascript
class NGSFormCode {
    // الاستبيان الحالي
    survey;
    // صف مساعد سياق النموذج
    formContext;
    // إجابات المستجيب الحالية
    respondentAnswers;
    // المستجيب الحالي
    respondent;
    // رمز اللغة الجاري استخدامه حاليًا
    language;
    // قيم سمات البيانات الحالية من عناصر الأمان
    dataAttributesValues;
 }
```

**FormContext** يوفر الخصائص التالية التي يمكنك استخدامها من الصف المشتق من NGSFormCode عبر الخاصية formContext.

```javascript
export class FormContext {
    // إجابات المستجيب الحالية
    private respondentAnswers$: Observable<RespondentAnswer[]>,
    // سمات البيانات الحالية لعناصر الأمان
    private dataAttributesValues$: Observable<RespondentAnswer[]>,
    // لغة المستجيب الحالية
    private language$: Observable<Language>,
    // عميل HTTP في Angular
    private httpClient: HttpClient,
}
```

**Respondent** هي خصائص المستجيب

```javascript
export interface Respondent {
  id: string;
  surveyId?: string;
  panelistId?: string;
  contextUsername?: string;
  resumeUId?: string;
  resumePageId?: string;
  resumeQuestionId?: string;
  startDate: Date;
  voteDate?: Date;
  archiveDate?: Date;
  iPSource?: string;
  changeUID?: string;
  progressSaveDate?: Date;
  languageCode: string;
  timeToEnd?: number;
  validated: boolean;
  userAgent?: string;
  platform?: string;
  platformOS?: number;
  mobileOS?: boolean;
  longitude?: number;
  latitude?: number;
}
```

**Respondent** هي خصائص المستجيب

```javascript
export interface Respondent {
  id: string;
  surveyId?: string;
  panelistId?: string;
  contextUsername?: string;
  resumeUId?: string;
  resumePageId?: string;
  resumeQuestionId?: string;
  startDate: Date;
  voteDate?: Date;
  archiveDate?: Date;
  iPSource?: string;
  changeUID?: string;
  progressSaveDate?: Date;
  languageCode: string;
  timeToEnd?: number;
  validated: boolean;
  userAgent?: string;
  platform?: string;
  platformOS?: number;
  mobileOS?: boolean;
  longitude?: number;
  latitude?: number;
}
```

&#x20;**SecurityItemAuthorization** يتتبع جميع الخصائص التي يُرجعها عنصر أمان تمت مصادقته.

```javascript
export interface SecurityItemAuthorization {
  securityItemId?: string;
  authorizationToken?: string;
  sessionCode?: string;
  sessionRespondent?: NGSRespondent;
  sessionPanelist: NGSPanelist;
  dataAttributesValues?: SecurityItemDataAttributeValue[];
}
```
