fng-bootstrap-datetime 0.12.0-beta.21 → 0.12.0-beta.211

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,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,13 @@ 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
+ form.$setDirty();
169
202
  };
170
203
  $scope.time_change = function () {
171
204
  if ($scope.ngModel && $scope.time) {
172
205
  $scope.ngModel.setHours($scope.time.getHours(), $scope.time.getMinutes(), 0, 0);
173
206
  $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)
207
+ form.$setDirty();
174
208
  } // else the time is invalid, keep the current Date value in datepicker
175
209
  };
176
210
  $scope.open = function ($event) {
@@ -349,8 +383,8 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
349
383
  uiBootstrapDateModule.controller('fngUiBootstrapDatetimePickerCtrl',['$scope', function($scope) {
350
384
  $scope.dateOptions = {};
351
385
  }])
352
- .directive('fngUiBootstrapDatetimePicker', ['$compile', '$filter', 'pluginHelper', 'formMarkupHelper', 'cssFrameworkService',
353
- function ($compile, $filter, pluginHelper) {
386
+ .directive('fngUiBootstrapDatetimePicker', ['$compile', 'pluginHelper',
387
+ function ($compile, pluginHelper) {
354
388
  return {
355
389
  restrict: 'E',
356
390
  replace: true,
@@ -358,8 +392,8 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
358
392
  priority: 1,
359
393
  link: function (scope, element, attrs) {
360
394
  var template;
361
- var processedAttr = pluginHelper.extractFromAttr(attrs, 'fngUiBootstrapDatetimePicker');
362
- var overRiddenDefaults = {
395
+ var processedAttrs = pluginHelper.extractFromAttr(attrs, 'fngUiBootstrapDatetimePicker');
396
+ var overriddenDefaults = {
363
397
  'show-button-bar': false,
364
398
  'show-meridian': false,
365
399
  'date-format': 'dd/MM/yyyy'
@@ -378,25 +412,37 @@ angular.module('ui.bootstrap.datetimepicker', ["ui.bootstrap.dateparser", "ui.bo
378
412
  }
379
413
  });
380
414
 
381
- overRiddenDefaults = Object.assign({}, overRiddenDefaults, processedAttr.directiveOptions);
382
- var overRiddenDateDefaults = {
415
+ overriddenDefaults = Object.assign({}, overriddenDefaults, processedAttrs.directiveOptions);
416
+ var overriddenDateDefaults = {
383
417
  showWeeks: false
384
418
  };
385
419
  var jsonDateOptions = {};
386
- if (processedAttr.directiveOptions['date-options']) {
387
- jsonDateOptions = JSON.parse(processedAttr.directiveOptions['date-options'].replace(/'/g, '"'));
420
+ if (processedAttrs.directiveOptions['date-options']) {
421
+ jsonDateOptions = JSON.parse(processedAttrs.directiveOptions['date-options'].replace(/'/g, '"'));
388
422
  }
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] + '"';
423
+ scope.dateOptions = Object.assign({}, overriddenDateDefaults, jsonDateOptions);
424
+
425
+ const isArray = processedAttrs.info.array;
426
+ template = pluginHelper.buildInputMarkup(
427
+ scope,
428
+ attrs,
429
+ {
430
+ processedAttrs,
431
+ addButtons: isArray,
432
+ needsX: isArray,
433
+ },
434
+ function (buildingBlocks) {
435
+ var str = '<div class="dtwrap"><datetimepicker ' + buildingBlocks.common.trim();
436
+ for (var opt in overriddenDefaults) {
437
+ if (opt !== 'date-options') {
438
+ str += ` ${opt}="${overriddenDefaults[opt]}"`;
439
+ }
395
440
  }
441
+ str += " " + pluginHelper.genDateTimePickerDisabledStr(scope, processedAttrs, "");
442
+ str += ' date-options="dateOptions"></datetimepicker></div>';
443
+ return str;
396
444
  }
397
- str += ' date-options="dateOptions"></datetimepicker></div>';
398
- return str;
399
- });
445
+ );
400
446
  element.replaceWith($compile(template)(scope));
401
447
  }
402
448
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fng-bootstrap-datetime",
3
- "version": "0.12.0-beta.21",
3
+ "version": "0.12.0-beta.211",
4
4
  "description": "datetime input plugin for forms-angular",
5
5
  "main": "fng-bootstrap-datetime.js",
6
6
  "scripts": {