X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=js%2Fangular-crm-ui.js;h=d9f590678aefecb2c1b60a95790bce78b6f54d7e;hb=29468114469beefe8f88946215d768d0483f9305;hp=44b19bdb280e104578148adaf1efc952ad5a764e;hpb=3afb86ef3703af3a1280cebeb11da0b2d94335f0;p=civicrm-core.git diff --git a/js/angular-crm-ui.js b/js/angular-crm-ui.js index 44b19bdb28..d9f590678a 100644 --- a/js/angular-crm-ui.js +++ b/js/angular-crm-ui.js @@ -23,73 +23,93 @@ }; }) - // example: - // example: + // Display a date widget. + // example: + // example: .directive('crmUiDate', function ($parse, $timeout) { return { restrict: 'AE', + require: 'ngModel', scope: { - crmUiDate: '@', // expression, model binding crmUiDateFormat: '@' // expression, date format (default: "yy-mm-dd") }, - link: function (scope, element, attrs) { + link: function (scope, element, attrs, ngModel) { var fmt = attrs.crmUiDateFormat ? $parse(attrs.crmUiDateFormat)() : "yy-mm-dd"; - var model = $parse(attrs.crmUiDate); element.addClass('dateplugin'); $(element).datepicker({ dateFormat: fmt }); - var updateChildren = (function() { - element.off('change', updateParent); - $(element).datepicker('setDate', model(scope.$parent)); - element.on('change', updateParent); - }); + ngModel.$render = function $render() { + $(element).datepicker('setDate', ngModel.$viewValue); + }; var updateParent = (function() { $timeout(function () { - model.assign(scope.$parent, $(element).val()); + ngModel.$setViewValue(element.val()); }); }); - updateChildren(); - scope.$parent.$watch(attrs.crmUiDate, updateChildren); element.on('change', updateParent); } }; }) - // example:
+ // Display a date-time widget. + // example:
.directive('crmUiDateTime', function ($parse) { return { restrict: 'AE', + require: 'ngModel', scope: { - crmUiDateTime: '@' + ngRequired: '@' }, - template: ' ', - link: function (scope, element, attrs) { - var model = $parse(attrs.crmUiDateTime); + templateUrl: '~/crmUi/datetime.html', + link: function (scope, element, attrs, ngModel) { + var ts = scope.ts = CRM.ts(null); scope.dateLabel = ts('Date'); scope.timeLabel = ts('Time'); + element.addClass('crm-ui-datetime'); - var updateChildren = (function () { - var value = model(scope.$parent); - if (value) { - var dtparts = value.split(/ /); + ngModel.$render = function $render() { + if (!_.isEmpty(ngModel.$viewValue)) { + var dtparts = ngModel.$viewValue.split(/ /); scope.dtparts = {date: dtparts[0], time: dtparts[1]}; } else { scope.dtparts = {date: '', time: ''}; } - }); - var updateParent = (function () { - model.assign(scope.$parent, scope.dtparts.date + " " + scope.dtparts.time); - }); + }; + + function updateParent() { + var incompleteDateTime = _.isEmpty(scope.dtparts.date) ^ _.isEmpty(scope.dtparts.time); + ngModel.$setValidity('incompleteDateTime', !incompleteDateTime); + + if (_.isEmpty(scope.dtparts.date) && _.isEmpty(scope.dtparts.time)) { + ngModel.$setViewValue(' '); + } + else { + //ngModel.$setViewValue(scope.dtparts.date + ' ' + scope.dtparts.time); + ngModel.$setViewValue((scope.dtparts.date ? scope.dtparts.date : '') + ' ' + (scope.dtparts.time ? scope.dtparts.time : '')); + } + } - updateChildren(); - scope.$parent.$watch(attrs.crmUiDateTime, updateChildren); scope.$watch('dtparts.date', updateParent); scope.$watch('dtparts.time', updateParent); + + function updateRequired() { + scope.required = scope.$parent.$eval(attrs.ngRequired); + } + + if (attrs.ngRequired) { + updateRequired(); + scope.$parent.$watch(attrs.ngRequired, updateRequired); + } + + scope.reset = function reset() { + scope.dtparts = {date: '', time: ''}; + ngModel.$setViewValue(''); + }; } }; }) @@ -203,6 +223,7 @@ }; }) + // Define a scope in which a name like "subform.foo" maps to a unique ID. // example:
.directive('crmUiIdScope', function () { return { @@ -222,6 +243,7 @@ }; }) + // Display an HTML blurb inside an IFRAME. // example: .directive('crmUiIframe', function ($parse) { return { @@ -251,12 +273,13 @@ }; scope.$parent.$watch(attrs.crmUiIframe, refresh); - //setTimeout(function () { refresh(); }, 50); } }; }) + // Define a rich text editor. // example: + // WISHLIST: use ngModel .directive('crmUiRichtext', function ($timeout) { return { require: '?ngModel', @@ -286,6 +309,7 @@ }; }) + // Display a lock icon (based on a boolean). // example: // example: .directive('crmUiSelect', function ($parse, $timeout) { return { @@ -427,40 +452,35 @@ }; }) - // example: + // Display a time-entry field. + // example: .directive('crmUiTime', function ($parse, $timeout) { return { restrict: 'AE', + require: 'ngModel', scope: { - crmUiTime: '@' }, - link: function (scope, element, attrs) { - var model = $parse(attrs.crmUiTime); - + link: function (scope, element, attrs, ngModel) { element.addClass('crm-form-text six'); - $(element).timeEntry({show24Hours: true}); + element.timeEntry({show24Hours: true}); + + ngModel.$render = function $render() { + element.timeEntry('setTime', ngModel.$viewValue); + }; - var updateChildren = (function() { - element.off('change', updateParent); - $(element).timeEntry('setTime', model(scope.$parent)); - element.on('change', updateParent); - }); var updateParent = (function () { $timeout(function () { - model.assign(scope.$parent, element.val()); + ngModel.$setViewValue(element.val()); }); }); - - updateChildren(); - scope.$parent.$watch(attrs.crmUiTime, updateChildren); element.on('change', updateParent); } }; }) + // Generic, field-independent form validator. // example: // example: - // Generic, field-independent validator. .directive('crmUiValidate', function() { return { restrict: 'EA',