diff --git a/src/mobile/pages/fields/field/field.js b/src/mobile/pages/fields/field/field.js index 112998cd..9a690676 100644 --- a/src/mobile/pages/fields/field/field.js +++ b/src/mobile/pages/fields/field/field.js @@ -308,9 +308,46 @@ export const FieldVM = DefineMap.extend('FieldVM', { } else if (field.type === 'useravatar') { // TODO: validate the JSON string here? value = JSON.stringify(this.userAvatar.serialize()) } else if (field.type === 'datemdy') { + if ($el.val().length < 6) { + value = '' + } else { // format date to (mm/dd/yyyy) from acceptable inputs - value = this.normalizeDateInput($el.val()) + value = this.normalizeDateInput($el.val()) + } + + // date bounds are in 6 or 8 digit texts + // need to change to same format as value + // it would be sensible to keep bounds in this + // format but we need to support it to properly + // support older released guides without adding + // more complex code + + if (value.length) { + if (field.hasOwnProperty('max')) { + let maxDate = + field.max.substr(0, 2) + '/' + + field.max.substr(2, 2) + '/' + + field.max.substr(4) + + if (Date.parse(value) > Date.parse(maxDate)) { + value = maxDate + } + } + + if (field.hasOwnProperty('min')) { + let minDate = + field.min.substr(0, 2) + '/' + + field.min.substr(2, 2) + '/' + + field.min.substr(4) + + if (Date.parse(value) < Date.parse(minDate)) { + value = minDate + } + } + } + // render formatted date for end user + $el.val(value) } else { value = $el.val() @@ -318,6 +355,8 @@ export const FieldVM = DefineMap.extend('FieldVM', { _answerVm.values = value + console.log('answer value: ' + _answerVm.values) + let errors = _answerVm.errors field.hasError = errors // update group validation for radio buttons @@ -328,6 +367,10 @@ export const FieldVM = DefineMap.extend('FieldVM', { this.debugPanelMessage(field, value) } + if (((field.type === 'datemdy') && (value.length < 6))) { + _answerVm = undefined + } + return errors }, diff --git a/src/mobile/pages/pages-vm.js b/src/mobile/pages/pages-vm.js index 182d5abb..5f4a1a86 100644 --- a/src/mobile/pages/pages-vm.js +++ b/src/mobile/pages/pages-vm.js @@ -480,6 +480,11 @@ export default DefineMap.extend('PagesVM', { return // these buttons skip rest of navigate } + if (button.next === constants.qMESSAGE) { + vm.handleMessage(button, ev) + return + } + vm.handleCodeAfter(button, vm, page, logic) // afterLogic fired, but GOTO resolves later vm.setRepeatVariable(button) // set counting variables if exist @@ -680,6 +685,14 @@ export default DefineMap.extend('PagesVM', { } }, + handleMessage (button, ev) { + ev && ev.preventDefault() + this.appState.modalContent = { + title: 'Author note:', + text: button.message || 'You have completed this A2J Guided Interview. Please close your browser window to exit.' + } + }, + handlePreviewResponses (button, ev) { ev && ev.preventDefault() switch (button.next) { @@ -725,6 +738,7 @@ export default DefineMap.extend('PagesVM', { break } }, + /** Track special button clicks in Matomo analytics * @param button button id */ diff --git a/src/mobile/pages/pages.js b/src/mobile/pages/pages.js index db43527a..ca51e74f 100644 --- a/src/mobile/pages/pages.js +++ b/src/mobile/pages/pages.js @@ -94,15 +94,15 @@ export default Component.extend({ const pages = this.viewModel.interview.pages const pageName = this.viewModel.currentPage.name // vm.appState.page - + if (pages && pageName) { const page = pages.find(pageName) - + // piwik tracking of learn-more clicks if (window._paq) { analytics.trackCustomEvent('Learn-More', 'from: ' + pageName, page.learn) } - + vm.appState.modalContent = { // name undefined prevents stache warnings title: page.learn, diff --git a/src/mobile/util/tlang.js b/src/mobile/util/tlang.js index 93b513ea..519467ab 100644 --- a/src/mobile/util/tlang.js +++ b/src/mobile/util/tlang.js @@ -22,6 +22,7 @@ export default function (lang, makestr) { Dutch English French + Hebrew Hmong Korean Mon Khmer @@ -161,6 +162,9 @@ export default function (lang, makestr) { Ordinals_12: 'twelfth', Ordinals_13: '13th', RepeatAnd: 'and', + Show_Navigation: 'Show Navigation', + Navigation_Panel: 'Navigation Panel', + Open: 'Open', // Authoring system, non-translated elements. // Tab names @@ -1297,5 +1301,80 @@ export default function (lang, makestr) { RepeatAnd: 'และ' } + Languages.regional.he = { + locale: 'he', + Language: 'עברית', + LanguageEN: 'Hebrew', + AskYesNo_Yes: 'כן', + AskYesNo_No: 'לא', + Close: 'סגור', + Comment: 'הערה', + GoBack: 'חזרה', + GoNext: 'הבא', + LearnMore: 'קריאה נוספת', + MyProgress: 'ההתקדמות שלי', + ProvideFeedbackOrComment: 'משוב על עמוד זה', + SaveAndExit: 'שמור וצא', + ResumeExit: 'התחלה מחדש', + SendFeedback: 'שלח משוב', + SoundIsOff: 'צליל מושתק', + SoundIsOn: 'צליל פועל', + SoundPlay: 'הפעל', + SoundStop: 'עצור', + WhatDoYouMean: 'מה הכוונה?', + Continue: 'המשך', + Exit: 'יציאה ללא שמירה', + Male: 'זכר', + Female: 'נקבה', + ChooseListNumber: 'בחירה: ', + ChooseListText: 'בחר מרשימה זו: ', + CheckBoxNOTALabel: 'אף אחד מהתשובות', + ZoomNormal: 'גודל רגיל', + ZoomFull: 'מסך מלא', + TextEnlarge: 'הגדל תיבת טקסט', + TextShrink: 'הקטן תיבת טקסט', + TextSizeLetter: 'א', + UploadAnswers: 'יוצא, נא להמתין...', + CalcClear: 'נקה', + CalcEnter: 'הכנס', + MonthNamesShort: "ינו', פבר', מרץ, אפר', מאי, יוני, יולי, אוג', ספט', אוק', נוב', דצמ'", + MonthNamesLong: 'ינואר, פברואר, מרץ, אפריל, מאי, יוני, יולי, ספטמבר, אוקטובר, נובמבר, דצמבר', + FieldPrompts_ResponseRequired: 'חובה למלא תשובה בקווים הריקים ליד התיוג האדום לפני שממשיכים.', + FieldPrompts_SelectionRequired: 'חובה לבצע בחירה לפני שממשיכים.', + FieldPrompts_text: 'חובה להקליד תשובה במקומות הממורקרים לפני שממשיכים.', + FieldPrompts_textlong: 'חובה להקליד תשובה במקומות הממורקרים לפני שממשיכים.', + FieldPrompts_textpick: 'חובה לבחור מתוך המקום הממורקר לפני שממשיכים.', + FieldPrompts_number: 'חובה הלקליד מספר במקום הממורקר לפני שממשיכים.', + FieldPrompts_numberdollar: 'חובה להכניס סימן דולר במקום הממורקר לפני שממשיכים.', + FieldPrompts_numberssn: "חובה להכניס מס' תעודת זהות במקום הממורקר לפני שממשיכים.", + FieldPrompts_numberphone: "חובה להקליד מס' טלפון במקום הממורקר לפני שממשיכים.", + FieldPrompts_numberzip: 'חובה להקליד מיקוד במקום הממורקר לפני שממשיכים.', + FieldPrompts_numberpick: 'חובה לבחור מספר מתוך המקום הממורקר לפני שממשיכים.', + FieldPrompts_datemdy: 'חובה להקליד חודש, יום ושנה במקום הממורקר לפני שממשיכים.', + FieldPrompts_gender: 'בחרו אוואטר שייצג אותך.', + FieldPrompts_radio: 'חובה לבחור תגובה מתוך הבחירה הממורקרת לפני שממשיכים.', + FieldPrompts_checkbox: 'חובה לבחור אפשרות אחת או כמה לפני שממשיכים.', + FieldPrompts_checkboxNOTA: 'בחרו בבקשה אפשרות אחת או יותר או "אף אחת מהתשובות" לפני שממשיכים.', + Ordinals_1: 'ראשון', + Ordinals_2: 'שני', + Ordinals_3: 'שלישי', + Ordinals_4: 'רביעי', + Ordinals_5: 'חמישי', + Ordinals_6: 'שישי', + Ordinals_7: 'שביעי', + Ordinals_8: 'שמיני', + Ordinals_9: 'תשיעי', + Ordinals_10: 'עשירי', + Ordinals_11: 'אחד עשר', + Ordinals_12: 'שנים עשר', + Ordinals_13: 'שלושה עשר', + RepeatAnd: 'וגם', + Required: 'חובה', + Show_Navigation: 'הראה ניווט', + Navigation_Panel: 'לוח ניווט', + Open: 'לִפְתוֹחַ' + + } + return Languages }