fng-bootstrap-datetime 0.12.0-beta.32 → 0.12.0-beta.321

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,6 +160,35 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
156
160
  },
157
161
  controller: ['$scope', '$attrs',
158
162
  function ($scope, $attrs) {
163
+ var form;
164
+ function getForm() {
165
+ if (!form) {
166
+ var workingScope = $scope;
167
+ while (typeof workingScope.topLevelFormName !== "string" && workingScope.$parent) {
168
+ workingScope = workingScope.$parent;
169
+ }
170
+ form = workingScope[workingScope.topLevelFormName];
171
+ }
172
+ }
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
+ // ****************************************************
159
192
  $scope.date_change = function () {
160
193
  // If we changed the date only, set the time (h,m) on it.
161
194
  // This is important in case the previous date was null.
@@ -166,11 +199,19 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
166
199
  $scope.ngModel.setHours(time.getHours(), time.getMinutes(), 0, 0);
167
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)
168
201
  }
202
+ getForm();
203
+ if (form) {
204
+ form.$setDirty();
205
+ }
169
206
  };
170
207
  $scope.time_change = function () {
171
208
  if ($scope.ngModel && $scope.time) {
172
209
  $scope.ngModel.setHours($scope.time.getHours(), $scope.time.getMinutes(), 0, 0);
173
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)
211
+ getForm();
212
+ if (form) {
213
+ form.$setDirty();
214
+ }
174
215
  } // else the time is invalid, keep the current Date value in datepicker
175
216
  };
176
217
  $scope.open = function ($event) {
@@ -349,8 +390,8 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
349
390
  uiBootstrapDateModule.controller('fngUiBootstrapDatetimePickerCtrl',['$scope', function($scope) {
350
391
  $scope.dateOptions = {};
351
392
  }])
352
- .directive('fngUiBootstrapDatetimePicker', ['$compile', '$filter', 'pluginHelper', 'formMarkupHelper', 'cssFrameworkService',
353
- function ($compile, $filter, pluginHelper) {
393
+ .directive('fngUiBootstrapDatetimePicker', ['$compile', 'PluginHelperService',
394
+ function ($compile, PluginHelperService) {
354
395
  return {
355
396
  restrict: 'E',
356
397
  replace: true,
@@ -358,8 +399,8 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
358
399
  priority: 1,
359
400
  link: function (scope, element, attrs) {
360
401
  var template;
361
- var processedAttr = pluginHelper.extractFromAttr(attrs, 'fngUiBootstrapDatetimePicker');
362
- var overRiddenDefaults = {
402
+ var processedAttrs = PluginHelperService.extractFromAttr(attrs, 'fngUiBootstrapDatetimePicker', scope);
403
+ var overriddenDefaults = {
363
404
  'show-button-bar': false,
364
405
  'show-meridian': false,
365
406
  'date-format': 'dd/MM/yyyy'
@@ -378,25 +419,37 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
378
419
  }
379
420
  });
380
421
 
381
- overRiddenDefaults = Object.assign({}, overRiddenDefaults, processedAttr.directiveOptions);
382
- var overRiddenDateDefaults = {
422
+ overriddenDefaults = Object.assign({}, overriddenDefaults, processedAttrs.directiveOptions);
423
+ var overriddenDateDefaults = {
383
424
  showWeeks: false
384
425
  };
385
426
  var jsonDateOptions = {};
386
- if (processedAttr.directiveOptions['date-options']) {
387
- 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, '"'));
388
429
  }
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] + '"';
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
+ }
395
447
  }
448
+ str += " " + PluginHelperService.genDateTimePickerDisabledStr(scope, processedAttrs, "");
449
+ str += ' date-options="dateOptions"></datetimepicker></div>';
450
+ return str;
396
451
  }
397
- str += ' date-options="dateOptions"></datetimepicker></div>';
398
- return str;
399
- });
452
+ );
400
453
  element.replaceWith($compile(template)(scope));
401
454
  }
402
455
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fng-bootstrap-datetime",
3
- "version": "0.12.0-beta.32",
3
+ "version": "0.12.0-beta.321",
4
4
  "description": "datetime input plugin for forms-angular",
5
5
  "main": "fng-bootstrap-datetime.js",
6
6
  "scripts": {