Merge pull request #19174 from eileenmcnaughton/conttype
[civicrm-core.git] / ext / search / ang / crmSearchActions / crmSearchInput / crmMultiSelectDate.directive.js
CommitLineData
014174e7
CW
1(function(angular, $, _) {
2 "use strict";
3
4 angular.module('crmSearchActions')
5 .directive('crmMultiSelectDate', function () {
6 return {
7 restrict: 'A',
8 require: 'ngModel',
9 link: function (scope, element, attrs, ngModel) {
10
11 var defaultDate = null;
12
13 function getDisplayDate(date) {
14 return $.datepicker.formatDate(CRM.config.dateInputFormat, $.datepicker.parseDate('yy-mm-dd', date));
15 }
16
17 ngModel.$render = function () {
18 element.val(_.isArray(ngModel.$viewValue) ? ngModel.$viewValue.join(',') : ngModel.$viewValue).change();
19 };
20
21 element
22 .crmSelect2({
23 multiple: true,
24 data: [],
25 initSelection: function(element, callback) {
26 var values = [];
27 $.each($(element).val().split(','), function(k, v) {
28 values.push({
29 text: getDisplayDate(v),
30 id: v
31 });
32 });
33 callback(values);
34 }
35 })
36 .on('select2-opening', function(e) {
37 var $el = $(this),
38 $input = $('.select2-search-field input', $el.select2('container'));
39 // Prevent select2 from opening and show a datepicker instead
40 e.preventDefault();
41 if (!$input.data('datepicker')) {
42 $input
43 .datepicker({
44 beforeShow: function() {
45 var existingSelections = _.pluck($el.select2('data') || [], 'id');
46 return {
47 changeMonth: true,
48 changeYear: true,
49 defaultDate: defaultDate,
50 beforeShowDay: function(date) {
51 // Don't allow the same date to be selected twice
52 var dateStr = $.datepicker.formatDate('yy-mm-dd', date);
53 if (_.includes(existingSelections, dateStr)) {
54 return [false, '', ''];
55 }
56 return [true, '', ''];
57 }
58 };
59 }
60 })
61 .datepicker('show')
62 .on('change.crmDate', function() {
63 if ($(this).val()) {
64 var data = $el.select2('data') || [];
65 defaultDate = $(this).datepicker('getDate');
66 data.push({
67 text: $.datepicker.formatDate(CRM.config.dateInputFormat, defaultDate),
68 id: $.datepicker.formatDate('yy-mm-dd', defaultDate)
69 });
70 $el.select2('data', data, true);
71 }
72 })
73 .on('keyup', function() {
74 $(this).val('').datepicker('show');
75 });
76 }
77 })
78 // Don't leave datepicker open when clearing selections
79 .on('select2-removed', function() {
80 $('input.hasDatepicker', $(this).select2('container'))
81 .datepicker('hide');
82 })
83 .on('change', function() {
84 ngModel.$setViewValue(element.val().split(','));
85 });
86 }
87 };
88 });
89})(angular, CRM.$, CRM._);