تاريخ Material
يعرض هذا المثال تكامل عنصر اختيار التاريخ material date picker الجافاسكربت الموجود بالفعل التالي https://github.com/FreddyFY/material-datepicke ويظهر كيفية استخدام جافاسكربت و CSS خارجيين للحصول على إدخال المستجيب والتحقق من صحة الإدخال مع دعم متعدد اللغات وتنسيق مستند إلى ngSurvey الحالي السمة الذي يختاره مدير الاستبيان.
class MaterialDateWidget extends NGSWidget {
/*
مثال يوضح كيفية دمج امتداد مستند إلى جافاسكربت خارجي
كأداة (widget) في ngSurvey مع دعم للوسوم (label).
يعمل هذا المثال على دمج material date picker
https://github.com/FreddyFY/material-datepicker
يوضح كيفية استخدام جافاسكربت و CSS خارجيين للحصول على إدخال المستجيب
والتحقق من صحة الإدخال مع دعم متعدد اللغات
*/
/* قالب HTML سيتم إنشاؤه قبل إنشاء فئة الأداة (widget)
ستتم إضافة لاحقة uniqueId إلى جميع المعرفات (id's)
المقدمة أثناء إنشاء الودجت */
static get template() {
return `<input class="ngs-question__answer-field ngs-question__answer-field-material-date" type="text" id="materialpicker001">`;
}
/* الأنماط التي ستُطبّق على هذا الودجت، لاحظ أن أسماء أصناف العناصر
ستُحدد نطاقها باستخدام معرف الودجت الفريد */
static get style() {
return `.ngs-question__answer-field-material-date {max-width:100px;}`
}
/* يسمح بتعيين الإجابة كمطلوبة أو لا
من صفحة إعدادات الإجابة لجعل
إجابة الأداة مطلوبة أثناء الاستبيان
*/
static get required() {
return true;
}
/* الخصائص التي يمكن تعيينها من مصمم النموذج لكل
إجابة تستخدم هذه الأداة كنوع إجابة في خصائص الإجابة*/
static get propertiesDef() {
return [{
id: 'color',
label: 'color',
defaultValue: 'var(--ngs-accent-color)',
type: 'text'
},
{
id: 'orientation',
label: 'Orientation',
defaultValue: 'portrait',
type: 'list',
list: [{
name: 'portrait',
value: 'portrait'
},
{
name: 'landscape',
value: 'landscape'
}
]
}
];
}
/* تبعيات كود جافاسكربت الخارجية التي سيتم تحميلها
قبل إنشاء الأداة (widget) */
static get jsDependencies() {
return [{
id: 'moments',
url: 'https://momentjs.com/downloads/moment-with-locales.min.js'
},
{
id: 'materialdate',
url: 'https://cdn.rawgit.com/FreddyFY/material-datepicker/master/dist/material-datepicker.min.js'
}
];
}
/* تبعيات كود CSS الخارجية التي سيتم تحميلها
قبل إنشاء الأداة (widget) */
static get cssDependencies() {
return [{
id: 'googlefonts',
url: 'https://fonts.googleapis.com/icon?family=Material+Icons'
},
{
id: 'materialdatecss',
url: 'https://cdn.rawgit.com/FreddyFY/material-datepicker/master/dist/material-datepicker.css'
}
];
}
init() {
var widget = this;
// الحصول على عنصر الإدخال من القالب
// من المهم دائمًا إضافة لاحقة إلى أي معرف
// في القالب باستخدام uniqueid الخاص بالودجت
this.inputField = this.getWidgetElementById('materialpicker001');
this.getLanguage$(lang => {
// إعداد منتقي التاريخ، من المهم دائمًا إضافة لاحقة لأي معرف (id)
// في القالب باستخدام uniqueid الخاص بالودجت
this.materialPicker001 = new MaterialDatepicker('#materialpicker001' + this.uniqueId, {
lang: lang.languageCode,
color: this.properties.color,
orientation: this.properties.orientation,
onNewDate: function(date) {
// إذا اختار المستخدم تاريخًا، أرسل القيمة إلى النموذج
widget.setAnswer(widget.inputField.value);
}
});
if (this.materialPicker001) {
// الحصول على وضع العرض الحالي لمعرفة كيفية
// إعداد الحالة هنا وجعلها معطلة إذا كان
// الودجت في وضع القراءة فقط
this.isDisabled$(disabled => {
this.inputField.disabled = disabled;
});
// تعيين القيمة الابتدائية عند إنشاء الأداة
if (this.answerContext.initialValue) {
this.inputField.value = this.answerContext.initialValue;
} else if (this.inputField.value) {
this.setAnswer(this.inputField.value);
}
// إذا قام المستخدم بتغيير النص تأكد من حفظ القيمة
// في النموذج
this.inputField.addEventListener('input', (event) => {
this.textChange(this.inputField.value, this);
});
}
});
}
// إرسال القيمة إلى النموذج
textChange(value, widget) {
widget.setAnswer(this.inputField.value);
}
// سيتم استدعاؤها بواسطة النموذج
// لمعرفة ما إذا كانت القيمة صالحة
// إذا لم تكن صالحة يجب إرجاع '' (لا تظهر رسالة خطأ) أو رسالة الخطأ لعرضها
// إذا كانت صالحة أرجع null
isValid() {
var date = new Date(this.inputField.value);
if ((this.inputField.value && !(date instanceof Date && !isNaN(date.valueOf())))) {
return 'InvalidDateDataTypeMessage';
} else {
return null;
}
}
}Last updated
Was this helpful?