fng-bootstrap-datetime 0.12.0-beta.34 → 0.12.0-beta.341

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,11 @@ 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
+ "autocomplete=\"off\"" +
106
+ 'aria-label="' + (attrs.name || attrs.ngModel).replace(/[\.,-]/g, ' ') + '"' +
103
107
  "ng-change=\"date_change($event)\" " +
104
108
  "is-open=\"innerDateOpened\" " +
105
109
  "datepicker-options=\"dateOptions\" " +
@@ -114,9 +118,9 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
114
118
  ["yearRange"],
115
119
  ["required"],
116
120
  ["showButtonBar"],
117
- ["ngHide", "hiddenDate"],
118
- ["ngReadonly", "readonlyDate"],
119
- ["ngDisabled", "disabledDate"]
121
+ ["ngHide", "hiddendate"],
122
+ ["ngReadonly", "readonlydate"],
123
+ ["ngDisabled", "disableddate"]
120
124
  ].reduce(createAttrConcat, '') +
121
125
  createFuncAttr("ngClick",
122
126
  "$event: $event, opened: opened",
@@ -143,8 +147,8 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
143
147
  ["required"],
144
148
  ["meredians"],
145
149
  ["mousewheel"],
146
- ["ngHide", "hiddenTime"],
147
- ["ngDisabled", "readonlyTime"]
150
+ ["ngHide", "hiddentime"],
151
+ ["ngDisabled", "readonlytime"]
148
152
  ].reduce(createAttrConcat, '') +
149
153
  createEvalAttr("showSpinners", "showSpinners") +
150
154
  createEvalAttr("templateUrl", "timepickerTemplateUrl") +
@@ -156,17 +160,35 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
156
160
  },
157
161
  controller: ['$scope', '$attrs',
158
162
  function ($scope, $attrs) {
159
- let form;
163
+ var form;
160
164
  function getForm() {
161
165
  if (!form) {
162
- let workingScope = $scope;
163
- while (typeof workingScope.topLevelFormName !== "string") {
166
+ var workingScope = $scope;
167
+ while (typeof workingScope.topLevelFormName !== "string" && workingScope.$parent) {
164
168
  workingScope = workingScope.$parent;
165
169
  }
166
170
  form = workingScope[workingScope.topLevelFormName];
167
171
  }
168
172
  }
169
173
  getForm();
174
+ // ****************************************************
175
+ // HACK RIGHT HERE!
176
+ // For cases where formsAngular.elemSecurityFuncBinding is set to either "one-time" or "normal", the
177
+ // result of the call to handleReadOnlyDisabled() made by the fngUiBootstrapDatetimePicker directive might
178
+ // include reference(s) to two functions which our ancestor form scope should have been decorated with -
179
+ // isSecurelyDisabled and requiresDisabledChildren. Because our scope is isolated, these will be
180
+ // inaccessible to us unless we do the following...:
181
+ if (formsAngular.disabledSecurityFuncName) {
182
+ $scope.isSecurelyDisabled = $scope.$parent.isSecurelyDisabled;
183
+ $scope.requiresDisabledChildren = $scope.$parent.requiresDisabledChildren;
184
+ }
185
+ // as this is only going to work for disabled state arising from fng security, and not the case
186
+ // where an fng field has a string-valued readonly attribute that refers to a function on the parent
187
+ // scope, it's only a partial solution. the general solution would presumably be to replace our isolated
188
+ // scope definition with "scope:true", thus giving it full ancestor access. however, I gave
189
+ // that a quick try and found that it broke things, and it doesn't seem worth spending any more time
190
+ // on that right now.
191
+ // ****************************************************
170
192
  $scope.date_change = function () {
171
193
  // If we changed the date only, set the time (h,m) on it.
172
194
  // This is important in case the previous date was null.
@@ -177,13 +199,19 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
177
199
  $scope.ngModel.setHours(time.getHours(), time.getMinutes(), 0, 0);
178
200
  $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)
179
201
  }
180
- form.$setDirty();
202
+ getForm();
203
+ if (form) {
204
+ form.$setDirty();
205
+ }
181
206
  };
182
207
  $scope.time_change = function () {
183
208
  if ($scope.ngModel && $scope.time) {
184
209
  $scope.ngModel.setHours($scope.time.getHours(), $scope.time.getMinutes(), 0, 0);
185
210
  $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)
186
- form.$setDirty();
211
+ getForm();
212
+ if (form) {
213
+ form.$setDirty();
214
+ }
187
215
  } // else the time is invalid, keep the current Date value in datepicker
188
216
  };
189
217
  $scope.open = function ($event) {
@@ -362,8 +390,8 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
362
390
  uiBootstrapDateModule.controller('fngUiBootstrapDatetimePickerCtrl',['$scope', function($scope) {
363
391
  $scope.dateOptions = {};
364
392
  }])
365
- .directive('fngUiBootstrapDatetimePicker', ['$compile', '$filter', 'pluginHelper', 'formMarkupHelper', 'cssFrameworkService',
366
- function ($compile, $filter, pluginHelper) {
393
+ .directive('fngUiBootstrapDatetimePicker', ['$compile', 'PluginHelperService',
394
+ function ($compile, PluginHelperService) {
367
395
  return {
368
396
  restrict: 'E',
369
397
  replace: true,
@@ -371,8 +399,8 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
371
399
  priority: 1,
372
400
  link: function (scope, element, attrs) {
373
401
  var template;
374
- var processedAttr = pluginHelper.extractFromAttr(attrs, 'fngUiBootstrapDatetimePicker');
375
- var overRiddenDefaults = {
402
+ var processedAttrs = PluginHelperService.extractFromAttr(attrs, 'fngUiBootstrapDatetimePicker', scope);
403
+ var overriddenDefaults = {
376
404
  'show-button-bar': false,
377
405
  'show-meridian': false,
378
406
  'date-format': 'dd/MM/yyyy'
@@ -391,25 +419,37 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
391
419
  }
392
420
  });
393
421
 
394
- overRiddenDefaults = Object.assign({}, overRiddenDefaults, processedAttr.directiveOptions);
395
- var overRiddenDateDefaults = {
422
+ overriddenDefaults = Object.assign({}, overriddenDefaults, processedAttrs.directiveOptions);
423
+ var overriddenDateDefaults = {
396
424
  showWeeks: false
397
425
  };
398
426
  var jsonDateOptions = {};
399
- if (processedAttr.directiveOptions['date-options']) {
400
- jsonDateOptions = JSON.parse(processedAttr.directiveOptions['date-options'].replace(/'/g, '"'));
427
+ if (processedAttrs.directiveOptions['date-options']) {
428
+ jsonDateOptions = JSON.parse(processedAttrs.directiveOptions['date-options'].replace(/'/g, '"'));
401
429
  }
402
- scope.dateOptions = Object.assign({}, overRiddenDateDefaults, jsonDateOptions);
403
- template = pluginHelper.buildInputMarkup(scope, attrs.model, processedAttr.info, processedAttr.options, false, false, function (buildingBlocks) {
404
- var str = '<div class="dtwrap"><datetimepicker ' + buildingBlocks.common;
405
- for (var opt in overRiddenDefaults) {
406
- if (opt !== 'date-options') {
407
- str += ' ' + opt + '="' + overRiddenDefaults[opt] + '"';
430
+ scope.dateOptions = Object.assign({}, overriddenDateDefaults, jsonDateOptions);
431
+
432
+ const isArray = processedAttrs.info.array;
433
+ template = PluginHelperService.buildInputMarkup(
434
+ scope,
435
+ attrs,
436
+ {
437
+ processedAttrs,
438
+ addButtons: isArray,
439
+ needsX: isArray,
440
+ },
441
+ function (buildingBlocks) {
442
+ var str = '<div class="dtwrap"><datetimepicker ' + buildingBlocks.common.trim();
443
+ for (var opt in overriddenDefaults) {
444
+ if (opt !== 'date-options') {
445
+ str += ` ${opt}="${overriddenDefaults[opt]}"`;
446
+ }
408
447
  }
448
+ str += " " + PluginHelperService.genDateTimePickerDisabledStr(scope, processedAttrs, "");
449
+ str += ' date-options="dateOptions"></datetimepicker></div>';
450
+ return str;
409
451
  }
410
- str += ' date-options="dateOptions"></datetimepicker></div>';
411
- return str;
412
- });
452
+ );
413
453
  element.replaceWith($compile(template)(scope));
414
454
  }
415
455
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fng-bootstrap-datetime",
3
- "version": "0.12.0-beta.34",
3
+ "version": "0.12.0-beta.341",
4
4
  "description": "datetime input plugin for forms-angular",
5
5
  "main": "fng-bootstrap-datetime.js",
6
6
  "scripts": {