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.
- package/fng-bootstrap-datetime.js +84 -31
- 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,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', '
|
|
353
|
-
function ($compile,
|
|
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
|
|
362
|
-
var
|
|
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
|
-
|
|
382
|
-
var
|
|
422
|
+
overriddenDefaults = Object.assign({}, overriddenDefaults, processedAttrs.directiveOptions);
|
|
423
|
+
var overriddenDateDefaults = {
|
|
383
424
|
showWeeks: false
|
|
384
425
|
};
|
|
385
426
|
var jsonDateOptions = {};
|
|
386
|
-
if (
|
|
387
|
-
jsonDateOptions = JSON.parse(
|
|
427
|
+
if (processedAttrs.directiveOptions['date-options']) {
|
|
428
|
+
jsonDateOptions = JSON.parse(processedAttrs.directiveOptions['date-options'].replace(/'/g, '"'));
|
|
388
429
|
}
|
|
389
|
-
scope.dateOptions = Object.assign({},
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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
|
-
|
|
398
|
-
return str;
|
|
399
|
-
});
|
|
452
|
+
);
|
|
400
453
|
element.replaceWith($compile(template)(scope));
|
|
401
454
|
}
|
|
402
455
|
};
|