fng-bootstrap-datetime 0.12.0-beta.34 → 0.12.0-beta.340
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.
- package/fng-bootstrap-datetime.js +76 -36
- package/package.json +1 -1
|
@@ -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)
|
|
71
|
-
} else if (dateTimeAttr in attrs) {
|
|
72
|
-
|
|
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)
|
|
82
|
+
return `${dashCase(innerAttr)}="${dateTimeAttr}({${funcArgs}})" `;
|
|
82
83
|
} else {
|
|
83
|
-
return angular.isDefined(defaultImpl) ? dashCase(innerAttr)
|
|
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)
|
|
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\"
|
|
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", "
|
|
118
|
-
["ngReadonly", "
|
|
119
|
-
["ngDisabled", "
|
|
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", "
|
|
147
|
-
["ngDisabled", "
|
|
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
|
-
|
|
163
|
+
var form;
|
|
160
164
|
function getForm() {
|
|
161
165
|
if (!form) {
|
|
162
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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', '
|
|
366
|
-
function ($compile,
|
|
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
|
|
375
|
-
var
|
|
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
|
-
|
|
395
|
-
var
|
|
422
|
+
overriddenDefaults = Object.assign({}, overriddenDefaults, processedAttrs.directiveOptions);
|
|
423
|
+
var overriddenDateDefaults = {
|
|
396
424
|
showWeeks: false
|
|
397
425
|
};
|
|
398
426
|
var jsonDateOptions = {};
|
|
399
|
-
if (
|
|
400
|
-
jsonDateOptions = JSON.parse(
|
|
427
|
+
if (processedAttrs.directiveOptions['date-options']) {
|
|
428
|
+
jsonDateOptions = JSON.parse(processedAttrs.directiveOptions['date-options'].replace(/'/g, '"'));
|
|
401
429
|
}
|
|
402
|
-
scope.dateOptions = Object.assign({},
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
411
|
-
return str;
|
|
412
|
-
});
|
|
452
|
+
);
|
|
413
453
|
element.replaceWith($compile(template)(scope));
|
|
414
454
|
}
|
|
415
455
|
};
|