fng-bootstrap-datetime 0.12.0-beta.26 → 0.12.0-beta.261

Sign up to get free protection for your applications and to get access to all the features.
@@ -55,7 +55,7 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
55
55
  hiddenDate: "=",
56
56
  datepickerTemplateUrl: "@",
57
57
  datepickerPopupTemplateUrl: "@",
58
- timepickerTemplateUrl: "@"
58
+ timepickerTemplateUrl: "@",
59
59
  },
60
60
  template: function (elem, attrs) {
61
61
  function dashCase(name) {
@@ -67,9 +67,10 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
67
67
  function createAttr(innerAttr, dateTimeAttrOpt) {
68
68
  var dateTimeAttr = angular.isDefined(dateTimeAttrOpt) ? dateTimeAttrOpt : innerAttr;
69
69
  if (attrs[dateTimeAttr]) {
70
- return dashCase(innerAttr) + "=\"" + dateTimeAttr + "\" ";
71
- } else if (dateTimeAttr in attrs) { // attribute with an empty value such as "required"
72
- return dateTimeAttr + " ";
70
+ return `${dashCase(innerAttr)}="${attrs[dateTimeAttr]}" `;
71
+ } else if (dateTimeAttr in attrs) {
72
+ // attribute with an empty value such as "required"
73
+ return `${dateTimeAttr} `;
73
74
  } else {
74
75
  return '';
75
76
  }
@@ -78,18 +79,18 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
78
79
  function createFuncAttr(innerAttr, funcArgs, dateTimeAttrOpt, defaultImpl) {
79
80
  var dateTimeAttr = angular.isDefined(dateTimeAttrOpt) ? dateTimeAttrOpt : innerAttr;
80
81
  if (attrs[dateTimeAttr]) {
81
- return dashCase(innerAttr) + "=\"" + dateTimeAttr + "({" + funcArgs + "})\" ";
82
+ return `${dashCase(innerAttr)}="${dateTimeAttr}({${funcArgs}})" `;
82
83
  } else {
83
- return angular.isDefined(defaultImpl) ? dashCase(innerAttr) + "=\"" + defaultImpl + "\"" : "";
84
+ return angular.isDefined(defaultImpl) ? `${dashCase(innerAttr)}="${defaultImpl}" ` : "";
84
85
  }
85
86
  }
86
87
 
87
88
  function createEvalAttr(innerAttr, dateTimeAttrOpt) {
88
89
  var dateTimeAttr = angular.isDefined(dateTimeAttrOpt) ? dateTimeAttrOpt : innerAttr;
89
90
  if (attrs[dateTimeAttr]) {
90
- return dashCase(innerAttr) + "=\"" + attrs[dateTimeAttr] + "\" ";
91
+ return `${dashCase(innerAttr)}="${attrs[dateTimeAttr]}" `;
91
92
  } else {
92
- return dashCase(innerAttr) + " ";
93
+ return `${dashCase(innerAttr)} `;
93
94
  }
94
95
  }
95
96
 
@@ -98,8 +99,10 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
98
99
  }
99
100
 
100
101
  var dateTmpl = "<div class=\"datetimepicker-wrapper\">" +
101
- "<input class=\"form-control\" type=\"text\" " +
102
+ "<input class=\"form-control\" " +
103
+ "type=\"text\" " +
102
104
  "name=\"datepicker\"" +
105
+ 'aria-label="' + (attrs.name || attrs.ngModel).replace(/[\.,-]/g, ' ') + '"' +
103
106
  "ng-change=\"date_change($event)\" " +
104
107
  "is-open=\"innerDateOpened\" " +
105
108
  "datepicker-options=\"dateOptions\" " +
@@ -114,9 +117,9 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
114
117
  ["yearRange"],
115
118
  ["required"],
116
119
  ["showButtonBar"],
117
- ["ngHide", "hiddenDate"],
118
- ["ngReadonly", "readonlyDate"],
119
- ["ngDisabled", "disabledDate"]
120
+ ["ngHide", "hiddendate"],
121
+ ["ngReadonly", "readonlydate"],
122
+ ["ngDisabled", "disableddate"]
120
123
  ].reduce(createAttrConcat, '') +
121
124
  createFuncAttr("ngClick",
122
125
  "$event: $event, opened: opened",
@@ -143,8 +146,8 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
143
146
  ["required"],
144
147
  ["meredians"],
145
148
  ["mousewheel"],
146
- ["ngHide", "hiddenTime"],
147
- ["ngDisabled", "readonlyTime"]
149
+ ["ngHide", "hiddentime"],
150
+ ["ngDisabled", "readonlytime"]
148
151
  ].reduce(createAttrConcat, '') +
149
152
  createEvalAttr("showSpinners", "showSpinners") +
150
153
  createEvalAttr("templateUrl", "timepickerTemplateUrl") +
@@ -156,6 +159,35 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
156
159
  },
157
160
  controller: ['$scope', '$attrs',
158
161
  function ($scope, $attrs) {
162
+ var form;
163
+ function getForm() {
164
+ if (!form) {
165
+ var workingScope = $scope;
166
+ while (typeof workingScope.topLevelFormName !== "string" && workingScope.$parent) {
167
+ workingScope = workingScope.$parent;
168
+ }
169
+ form = workingScope[workingScope.topLevelFormName];
170
+ }
171
+ }
172
+ getForm();
173
+ // ****************************************************
174
+ // HACK RIGHT HERE!
175
+ // For cases where formsAngular.elemSecurityFuncBinding is set to either "one-time" or "normal", the
176
+ // result of the call to handleReadOnlyDisabled() made by the fngUiBootstrapDatetimePicker directive might
177
+ // include reference(s) to two functions which our ancestor form scope should have been decorated with -
178
+ // isSecurelyDisabled and requiresDisabledChildren. Because our scope is isolated, these will be
179
+ // inaccessible to us unless we do the following...:
180
+ if (formsAngular.disabledSecurityFuncName) {
181
+ $scope.isSecurelyDisabled = $scope.$parent.isSecurelyDisabled;
182
+ $scope.requiresDisabledChildren = $scope.$parent.requiresDisabledChildren;
183
+ }
184
+ // as this is only going to work for disabled state arising from fng security, and not the case
185
+ // where an fng field has a string-valued readonly attribute that refers to a function on the parent
186
+ // scope, it's only a partial solution. the general solution would presumably be to replace our isolated
187
+ // scope definition with "scope:true", thus giving it full ancestor access. however, I gave
188
+ // that a quick try and found that it broke things, and it doesn't seem worth spending any more time
189
+ // on that right now.
190
+ // ****************************************************
159
191
  $scope.date_change = function () {
160
192
  // If we changed the date only, set the time (h,m) on it.
161
193
  // This is important in case the previous date was null.
@@ -166,11 +198,19 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
166
198
  $scope.ngModel.setHours(time.getHours(), time.getMinutes(), 0, 0);
167
199
  $scope.ngModel = new Date($scope.ngModel); // By default, ngModel watches the model by reference, not value. This is important to know when binding inputs to models that are objects (e.g. Date) (from: https://docs.angularjs.org/api/ng/directive/ngModel)
168
200
  }
201
+ getForm();
202
+ if (form) {
203
+ form.$setDirty();
204
+ }
169
205
  };
170
206
  $scope.time_change = function () {
171
207
  if ($scope.ngModel && $scope.time) {
172
208
  $scope.ngModel.setHours($scope.time.getHours(), $scope.time.getMinutes(), 0, 0);
173
209
  $scope.ngModel = new Date($scope.ngModel); // By default, ngModel watches the model by reference, not value. This is important to know when binding inputs to models that are objects (e.g. Date) (from: https://docs.angularjs.org/api/ng/directive/ngModel)
210
+ getForm();
211
+ if (form) {
212
+ form.$setDirty();
213
+ }
174
214
  } // else the time is invalid, keep the current Date value in datepicker
175
215
  };
176
216
  $scope.open = function ($event) {
@@ -349,8 +389,8 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
349
389
  uiBootstrapDateModule.controller('fngUiBootstrapDatetimePickerCtrl',['$scope', function($scope) {
350
390
  $scope.dateOptions = {};
351
391
  }])
352
- .directive('fngUiBootstrapDatetimePicker', ['$compile', '$filter', 'pluginHelper', 'formMarkupHelper', 'cssFrameworkService',
353
- function ($compile, $filter, pluginHelper) {
392
+ .directive('fngUiBootstrapDatetimePicker', ['$compile', 'PluginHelperService',
393
+ function ($compile, PluginHelperService) {
354
394
  return {
355
395
  restrict: 'E',
356
396
  replace: true,
@@ -358,8 +398,8 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
358
398
  priority: 1,
359
399
  link: function (scope, element, attrs) {
360
400
  var template;
361
- var processedAttr = pluginHelper.extractFromAttr(attrs, 'fngUiBootstrapDatetimePicker');
362
- var overRiddenDefaults = {
401
+ var processedAttrs = PluginHelperService.extractFromAttr(attrs, 'fngUiBootstrapDatetimePicker', scope);
402
+ var overriddenDefaults = {
363
403
  'show-button-bar': false,
364
404
  'show-meridian': false,
365
405
  'date-format': 'dd/MM/yyyy'
@@ -378,25 +418,37 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
378
418
  }
379
419
  });
380
420
 
381
- overRiddenDefaults = Object.assign({}, overRiddenDefaults, processedAttr.directiveOptions);
382
- var overRiddenDateDefaults = {
421
+ overriddenDefaults = Object.assign({}, overriddenDefaults, processedAttrs.directiveOptions);
422
+ var overriddenDateDefaults = {
383
423
  showWeeks: false
384
424
  };
385
425
  var jsonDateOptions = {};
386
- if (processedAttr.directiveOptions['date-options']) {
387
- jsonDateOptions = JSON.parse(processedAttr.directiveOptions['date-options'].replace(/'/g, '"'));
426
+ if (processedAttrs.directiveOptions['date-options']) {
427
+ jsonDateOptions = JSON.parse(processedAttrs.directiveOptions['date-options'].replace(/'/g, '"'));
388
428
  }
389
- scope.dateOptions = Object.assign({}, overRiddenDateDefaults, jsonDateOptions);
390
- template = pluginHelper.buildInputMarkup(scope, attrs.model, processedAttr.info, processedAttr.options, false, false, function (buildingBlocks) {
391
- var str = '<div class="dtwrap"><datetimepicker ' + buildingBlocks.common;
392
- for (var opt in overRiddenDefaults) {
393
- if (opt !== 'date-options') {
394
- str += ' ' + opt + '="' + overRiddenDefaults[opt] + '"';
429
+ scope.dateOptions = Object.assign({}, overriddenDateDefaults, jsonDateOptions);
430
+
431
+ const isArray = processedAttrs.info.array;
432
+ template = PluginHelperService.buildInputMarkup(
433
+ scope,
434
+ attrs,
435
+ {
436
+ processedAttrs,
437
+ addButtons: isArray,
438
+ needsX: isArray,
439
+ },
440
+ function (buildingBlocks) {
441
+ var str = '<div class="dtwrap"><datetimepicker ' + buildingBlocks.common.trim();
442
+ for (var opt in overriddenDefaults) {
443
+ if (opt !== 'date-options') {
444
+ str += ` ${opt}="${overriddenDefaults[opt]}"`;
445
+ }
395
446
  }
447
+ str += " " + PluginHelperService.genDateTimePickerDisabledStr(scope, processedAttrs, "");
448
+ str += ' date-options="dateOptions"></datetimepicker></div>';
449
+ return str;
396
450
  }
397
- str += ' date-options="dateOptions"></datetimepicker></div>';
398
- return str;
399
- });
451
+ );
400
452
  element.replaceWith($compile(template)(scope));
401
453
  }
402
454
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fng-bootstrap-datetime",
3
- "version": "0.12.0-beta.26",
3
+ "version": "0.12.0-beta.261",
4
4
  "description": "datetime input plugin for forms-angular",
5
5
  "main": "fng-bootstrap-datetime.js",
6
6
  "scripts": {