Che 5 years ago
parent
commit
e3d72fa8f0
4 changed files with 39 additions and 13 deletions
  1. 1 1
      include/calendar.hrl
  2. 33 7
      priv/js/calendar.js
  3. 4 4
      src/elements/combo/element_calendar.erl
  4. 1 1
      src/nitro.app.src

+ 1 - 1
include/calendar.hrl

@@ -6,7 +6,7 @@
 -record(calendar, {?ELEMENT_BASE(element_calendar),
   autocomplete=true, autofocus=false, disabled=false, form=[], list=[], maxDate={2019,2,2},
     minDate, format="DD.MM.YYYY", pattern=[], name=[], step=[], readonly=[], required=[],
-    value={2020,2,2}, placeholder=[], onSelect=[], disableDayFn=[], position=[],
+    value={2020,2,2}, placeholder=[], onSelect=[], disableDayFn=[], firstDay=0, position=[],
     reposition=[], yearRange=100}).
 
 -endif.

+ 33 - 7
priv/js/calendar.js

@@ -70,14 +70,39 @@ function formatter(date, format) {
     return value;
 }
 
-function parseDateFromInput(value) {
-    if(isNaN(Date.parse(value))) {
-        var res = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/.exec(value);
-        if(res && res.length == 4) { return new Date(res[3],(res[2]-1),res[1]); }
-        else { return null; }
-    }else{ return new Date(Date.parse(value)); }
+function parser(str, format) {
+    format = format || "DD.MM.YYYY";
+    var signs = format.match(/(Y{2,4})|(M{2})|(D{2})/g);
+    var reStr = "(";
+    for(var i=0; i<signs.length; ++i) {
+        reStr += ".".repeat(signs[i].length) + (((i+1) != signs.length) ? ").(" : ")");
+    }
+    var re = new RegExp(reStr,'g');
+    var values = re.exec(str);
+    var year, month, day;
+    if (signs.length+1 == values.length) {
+        values = values.slice(1);
+        for(var i=0; i<signs.length; ++i) {
+            switch(signs[i].slice(0,1)){
+                case "Y": year = values[i]; break;
+                case "M": month = values[i]; break;
+                case "D": day = values[i]; break;
+            }
+        }
+        const res = new Date(year, month-1, day);
+        return res;
+    }
+    return null;
 }
 
+// function parseDateFromInput(value) {
+//     if(isNaN(Date.parse(value))) {
+//         var res = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/.exec(value);
+//         if(res && res.length == 4) { return new Date(res[3],(res[2]-1),res[1]); }
+//         else { return null; }
+//     }else{ return new Date(Date.parse(value)); }
+// }
+
 
 (function (root, factory)
 {
@@ -546,7 +571,8 @@ function parseDateFromInput(value) {
                 date = (date && date.isValid()) ? date.toDate() : null;
             }
             else {
-                date = parseDateFromInput(opts.field.value);
+                // date = parseDateFromInput(opts.field.value);
+                date = parser(opts.field.value, opts.format);
             }
             if (isDate(date)) {
                 self.setDate(date);

+ 4 - 4
src/elements/combo/element_calendar.erl

@@ -52,11 +52,10 @@ render_element(Record) ->
     wf_tags:emit_tag(<<"input">>, nitro:render(Record#calendar.body), List).
 
 init(Id,#calendar{minDate=Min,maxDate=Max,lang=Lang,format=Form,
-        value=Value,onSelect=SelectFn,disableDayFn=DisDayFn,
+        value=Value,onSelect=SelectFn,disableDayFn=DisDayFn,firstDay=FirstDay,
         position=Pos,reposition=Repos,yearRange=YearRange} = Calendar) ->
     ID = nitro:to_list(Id),
     I18n =        "clLangs.ua",
-    Format =      "DD.MM.YYYY",
     DefaultDate = case Value of
        {Yv,Mv,Dv} -> nitro:f("new Date(~s,~s,~s)",[nitro:to_list(Yv),nitro:to_list(Mv-1),nitro:to_list(Dv)]);
         _ -> "''" end,
@@ -66,13 +65,14 @@ init(Id,#calendar{minDate=Min,maxDate=Max,lang=Lang,format=Form,
     DisDay =      "null",
     Position =    "bottom left",
     Reposition =  "true",
+    WeekFirstDay = nitro:to_list(FirstDay),
     nitro:wire(nitro:f(
         "pickers['~s'] = new Pikaday({
             field: document.getElementById('~s'),
-            firstDay: 0,
             i18n: ~s,
             defaultDate: ~s,
             setDefaultDate: true,
+            firstDay: ~s,
             minDate: ~s,
             maxDate: ~s,
             format: '~s',
@@ -82,7 +82,7 @@ init(Id,#calendar{minDate=Min,maxDate=Max,lang=Lang,format=Form,
             reposition: ~s,
             yearRange: ~s
         });",
-        [ID,ID,I18n,DefaultDate,MinDate,MaxDate,Format,OnSelect,DisDay,
+        [ID,ID,I18n,DefaultDate,WeekFirstDay,MinDate,MaxDate,Form,OnSelect,DisDay,
          Position,Reposition,nitro:to_list(YearRange)]
     )).
 

+ 1 - 1
src/nitro.app.src

@@ -1,6 +1,6 @@
 {application, nitro, [
     {description,  "NITRO Nitrogen Web Framework"},
-    {vsn,          "5.4.2"},
+    {vsn,          "5.4.3"},
     {applications, [kernel, stdlib]},
     {modules, []},
     {registered,   []},