LightSwitch HTML Client–falsche Wochentag-Berechnung

Der neue HTML Client von LightSwitch verleitet gerade dazu, einfache Datenerfassungsapps zu erstellen. Bei den meisten Frameworks findet man früher oder später eine scheinbar einfache Aufgabe, die zuvor schon sicher hundert andere auch hatten, die jedoch nicht sauber umgesetzt wurde und daher einiges an Nacharbeit benötigt.

Im HTML Client war es ein einfacher Dialog mit einem Date-Time Picker Feld. Bei einfacher Betrachtung fällt im Screenshot das Problem nicht gleich auf. Meinem Beta-Test ist es sofort aufgefallen. Mir konnte es nicht auffallen – auf der Development-Maschine trat der Fehler nicht auf.

TagBerechnung

Fehler gefunden?

Die Wochentage stimmen nicht. Der 1.7.2013 ist ein Montag und nicht Dienstag.

Das Problem liegt in einer falschen Berechnung des Wochentages im JavaScript Code und tritt nur in Verbindung mit bestimmten Kultureinstellungen auf.

der originale Javascript Code sieht wie folgt aus:

   1:      function _buildMonthCalendar(me, firstDayOfMonth, daysInMonth) {
   2:          var monthCalendar,
   3:              format = me._format,
   4:              standard = format.culture.calendars.standard,
   5:              firstDayOfWeek = standard.firstDay,
   6:              days = standard.days,
   7:              daysOfWeekAbbreviated = days.namesAbbr,
   8:              day,
   9:              monthCalendarTemplate = _monthCalendarCache[firstDayOfMonth];
  10:   
  11:          if (!monthCalendarTemplate) {
  12:              _monthCalendarCache[firstDayOfMonth] = monthCalendarTemplate = document.createDocumentFragment();
  13:   
  14:              for (day = 1; day <= 31; day++) {
  15:                  var dayNumberString = _padStringWithLeadingZeros(day.toString(), 2),
  16:                      daysOfWeekIndex = (firstDayOfMonth + day - 1 + firstDayOfWeek) % daysOfWeekAbbreviated.length,
  17:                      optionValue = day.toString(),
  18:                      optionText = msls_getResourceString("dateTimePicker_dayNumberAndDayPattern", dayNumberString, daysOfWeekAbbreviated[daysOfWeekIndex]);
  19:   
  20:                  monthCalendarTemplate.appendChild(_buildOption(optionText, optionValue));
  21:              }
  22:          }
  23:   
  24:          monthCalendar = monthCalendarTemplate.cloneNode(true);
  25:          for (day = 31; day > daysInMonth; day--) {
  26:              monthCalendar.removeChild(monthCalendar.lastChild);
  27:          }
  28:          return monthCalendar;
  29:      }
 
 

In Zeile 16 wird der Wert für “firstDayOfWeek” hinzuaddiert und das bewirkt bei falsch eingestellter Kultur (in unserem Fall “deutsch”)  die Verschiebung um einen Tag. Diese Code ist in der Datei “msls-1.0.0.js” im Ordner Scripts zu finden.

Um dieses Problem zu beheben ist es notwendig die dazu passende .min.js Datei anzupassen.

image

Die passende Stelle im minimierten Code ist mit einer Textsuche leicht zu finden. Der zu suchende Code-Teil ist “(t+r+1+l)%”

image

und ist auf (t+r-1)% anzupassen. D.h. das +l ist die Addition des FirstDayOfWeek. Die angepasste Stelle sieht danach wie folgt aus:

image

 

das fertige Ergebnis im Browser ist nun eine richtige Anzeige der Wochentage. So wie es bei einem professionellem Framework bei der simplen Eingabe eines Datumsfeldes zu erwarten wäre:

image

Kommentare sind geschlossen