isite 2022.5.7 → 2022.8.2

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.
@@ -0,0 +1,1789 @@
1
+ app.directive('iControl', function () {
2
+ return {
3
+ restrict: 'E',
4
+ require: 'ngModel',
5
+ scope: {
6
+ v: '@',
7
+ id2: '@',
8
+ label: '@',
9
+ type: '@',
10
+ class2: '@',
11
+ disabled: '@',
12
+ ngModel: '=',
13
+ ngChange: '&',
14
+ ngKeydown: '&',
15
+ },
16
+ link: function ($scope, element, attrs, ctrl) {
17
+ attrs.type = attrs.type || 'text';
18
+
19
+ if (typeof attrs.disabled !== 'undefined') {
20
+ attrs.disabled = 'disabled';
21
+ } else {
22
+ attrs.disabled = '';
23
+ }
24
+ $scope.class2 = $scope.class2 || '';
25
+ $(element)
26
+ .find('input')
27
+ .focus(() => {
28
+ $('.i-list .dropdown-content').css('display', 'none');
29
+ });
30
+ },
31
+ template: `
32
+ <div class="mb-3 {{class2}}">
33
+ <label for="id2" class="form-label">{{label}}</label>
34
+ <input id="id2" ng-disabled="disabled" autofocus v="{{v}}" type="{{type}}" ng-model="ngModel" ng-change="ngChange()" ngKeydown="ngKeydown()" class="form-control" placeholder="{{placeholder}}" aria-label="{{label}}" />
35
+ <div class="invalid-feedback">
36
+
37
+ </div>
38
+ </div>
39
+ `,
40
+ };
41
+ });
42
+
43
+ app.directive('iCheckbox', function () {
44
+ return {
45
+ restrict: 'E',
46
+ require: 'ngModel',
47
+ scope: {
48
+ label: '@',
49
+ id2: '@',
50
+ ngModel: '=',
51
+ ngChange: '&',
52
+ },
53
+ link: function ($scope, element, attrs, ctrl) {
54
+ if (typeof attrs.disabled !== 'undefined') {
55
+ $scope.disabled = 'disabled';
56
+ } else {
57
+ $scope.disabled = '';
58
+ }
59
+ $scope.id2 = $scope.id2 || 'input_' + Math.random().toString().replace('0.', '');
60
+ },
61
+ template: `
62
+ <div class="form-check">
63
+ <input ng-change="ngChange()" ng-disabled="disabled" class="form-check-input" type="checkbox" ng-model="ngModel" id="{{id2}}">
64
+ <label class="form-check-label" for="{{id2}}">
65
+ {{label}}
66
+ </label>
67
+ </div>
68
+ `,
69
+ };
70
+ });
71
+
72
+ app.directive('iRadio', function () {
73
+ return {
74
+ restrict: 'E',
75
+ require: 'ngModel',
76
+ scope: {
77
+ label: '@',
78
+ group: '@',
79
+ id2: '@',
80
+ ngModel: '=',
81
+ ngChange: '&',
82
+ },
83
+ link: function ($scope, element, attrs, ctrl) {
84
+ if (typeof attrs.disabled !== 'undefined') {
85
+ attrs.disabled = 'disabled';
86
+ } else {
87
+ attrs.disabled = '';
88
+ }
89
+
90
+ $scope.group = $scope.group || attrs.group || attrs.ngModel.replaceAll('.', '_');
91
+ $scope.id2 = $scope.id2 || 'input_' + Math.random().toString().replace('0.', '');
92
+ },
93
+ template: `
94
+ <div class="form-check">
95
+ <input class="form-check-input" type="radio" ng-change="ngChange()" ng-disabled="disabled" ng-model="ngModel" id="{{id2}}" name="{{group}}" >
96
+ <label class="form-check-label" for="exampleRadios1">
97
+ {{label}}
98
+ </label>
99
+ </div>
100
+
101
+ `,
102
+ };
103
+ });
104
+
105
+ app.directive('iButton', function () {
106
+ return {
107
+ restrict: 'E',
108
+ scope: {
109
+ label: '@',
110
+ type: '@',
111
+ busy: '@',
112
+ click: '&',
113
+ fa: '@',
114
+ },
115
+ link: function ($scope, element, attrs, ctrl) {
116
+ attrs.type = attrs.type || '';
117
+ if (attrs.type.like('*exit*') || attrs.type.like('*close*')) {
118
+ attrs.fa = 'times';
119
+ } else if (attrs.type.like('*view*') || attrs.type.like('*details*')) {
120
+ attrs.fa = 'file';
121
+ } else if (attrs.type.like('*add*') || attrs.type.like('*new*')) {
122
+ attrs.fa = 'plus-circle';
123
+ } else if (attrs.type.like('*update*') || attrs.type.like('*edit*')) {
124
+ attrs.fa = 'edit';
125
+ } else if (attrs.type.like('*save*')) {
126
+ attrs.fa = 'save';
127
+ } else if (attrs.type.like('*delete*') || attrs.type.like('*remove*')) {
128
+ attrs.fa = 'trash';
129
+ } else if (attrs.type.like('*print*')) {
130
+ attrs.fa = 'print';
131
+ } else if (attrs.type.like('*search*')) {
132
+ attrs.fa = 'search';
133
+ } else if (attrs.type.like('*export*') || attrs.type.like('*excel*')) {
134
+ attrs.fa = 'table';
135
+ } else {
136
+ $scope.class = 'btn-primary';
137
+ }
138
+
139
+ },
140
+ template: `
141
+ <button class="btn {{class}}" type="button" ng-click="click()" ng-disabled="busy">
142
+ <span ng-show="busy" class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
143
+ {{label}}
144
+ </button>
145
+ `,
146
+ };
147
+ });
148
+ app.directive('iList', [
149
+ '$interval',
150
+ '$timeout',
151
+ 'isite',
152
+ function ($interval, $timeout, isite) {
153
+ return {
154
+ restrict: 'E',
155
+ require: 'ngModel',
156
+ scope: {
157
+ v: '@',
158
+ label: '@',
159
+ display: '@',
160
+ display2: '@',
161
+ disabled: '@',
162
+ css: '@',
163
+ space: '@',
164
+ primary: '@',
165
+ ngValue: '@',
166
+ ngModel: '=',
167
+ ngSearch: '=',
168
+ ngChange: '&',
169
+ ngAdd: '&',
170
+ items: '=',
171
+ },
172
+ link: function ($scope, element, attrs, ctrl) {
173
+ $scope.display = attrs.display = attrs.display || 'name';
174
+ $scope.primary = attrs.primary = attrs.primary || 'id';
175
+ attrs.space = attrs.space || ' ';
176
+ attrs.ngValue = attrs.ngValue || '';
177
+
178
+ $scope.searchElement = $(element).find('.dropdown .search');
179
+ $scope.popupElement = $(element).find('.dropdown .dropdown-content');
180
+
181
+ if (typeof attrs.disabled !== 'undefined') {
182
+ attrs.disabled = 'disabled';
183
+ } else {
184
+ attrs.disabled = '';
185
+ }
186
+
187
+ if (typeof attrs.ngAdd == 'undefined') {
188
+ $scope.fa_add = 'fa-search';
189
+ } else {
190
+ $scope.fa_add = 'fa-plus';
191
+ }
192
+
193
+ if (typeof attrs.ngSearch == 'undefined') {
194
+ $scope.showSearch = !1;
195
+ } else {
196
+ $scope.showSearch = !0;
197
+ }
198
+
199
+ let input = $(element).find('input');
200
+ $(element).hover(
201
+ () => {
202
+ $scope.popupElement.css('display', 'block');
203
+ },
204
+ () => {
205
+ $scope.popupElement.css('display', 'none');
206
+ }
207
+ );
208
+ $scope.focus = function () {
209
+ $('.i-list .dropdown-content').css('display', 'none');
210
+ $scope.popupElement.css('display', 'block');
211
+ $scope.searchElement.focus();
212
+ };
213
+ $scope.hide = function () {
214
+ $scope.popupElement.css('display', 'none');
215
+ };
216
+
217
+ $scope.getValue = function (item) {
218
+ let v = isite.getValue(item, $scope.display);
219
+ return v || '';
220
+ };
221
+
222
+ $scope.getValue2 = function (item) {
223
+ if ($scope.display2) {
224
+ return isite.getValue(item, $scope.display2) || '';
225
+ }
226
+ return '';
227
+ };
228
+
229
+ $scope.getNgModelValue = function (ngModel) {
230
+ if (ngModel && $scope.display && $scope.ngValue) {
231
+ return isite.getValue(ngModel, $scope.display.replace($scope.ngValue + '.', '')) || '';
232
+ } else if (ngModel && $scope.display) {
233
+ return isite.getValue(ngModel, $scope.display) || '';
234
+ }
235
+ return '';
236
+ };
237
+
238
+ $scope.getNgModelValue2 = function (ngModel) {
239
+ if (ngModel && $scope.display2 && $scope.ngValue) {
240
+ return isite.getValue(ngModel, $scope.display2.replace($scope.ngValue + '.', '')) || '';
241
+ } else if (ngModel && $scope.display2) {
242
+ return isite.getValue(ngModel, $scope.display2) || '';
243
+ }
244
+ return '';
245
+ };
246
+
247
+ $scope.getNgValue = function (item) {
248
+ if (item && $scope.ngValue) {
249
+ return isite.getValue(item, $scope.ngValue);
250
+ }
251
+ return item;
252
+ };
253
+
254
+ $scope.$watch('items', (items) => {
255
+ input.val('');
256
+
257
+ if (items) {
258
+ items.forEach((item) => {
259
+ item.$display = $scope.getValue(item) + attrs.space + $scope.getValue2(item);
260
+ });
261
+ }
262
+
263
+ if (items && $scope.ngModel) {
264
+ items.forEach((item) => {
265
+ if (isite.getValue(item, $scope.primary) == isite.getValue($scope.ngModel, $scope.primary)) {
266
+ $scope.ngModel = item;
267
+ item.$display = $scope.getValue(item) + attrs.space + $scope.getValue2(item);
268
+ input.val(item.$display);
269
+ }
270
+ });
271
+ }
272
+ });
273
+
274
+ $scope.$watch('ngModel', (ngModel) => {
275
+ input.val('');
276
+
277
+ $scope.ngModel = ngModel;
278
+
279
+ if (ngModel) {
280
+ input.val(' ' + $scope.getNgModelValue(ngModel) + attrs.space + $scope.getNgModelValue2(ngModel));
281
+ }
282
+ });
283
+
284
+ $scope.updateModel = function (item) {
285
+ $scope.ngModel = $scope.getNgValue(item, $scope.ngValue);
286
+ input.val($scope.getNgModelValue($scope.ngModel) + attrs.space + $scope.getNgModelValue2($scope.ngModel));
287
+ $timeout(() => {
288
+ $scope.ngChange();
289
+ });
290
+ $scope.hide();
291
+ };
292
+ },
293
+ template: `/*##client-side/sub/i-list2.content.html*/`,
294
+ };
295
+ },
296
+ ]);
297
+ app.directive('iDate', function () {
298
+ return {
299
+ link: function (scope, element, attrs) {
300
+ if (typeof attrs.disabled !== 'undefined') {
301
+ attrs.disabled = 'disabled';
302
+ } else {
303
+ attrs.disabled = '';
304
+ }
305
+
306
+ $(element)
307
+ .find('select')
308
+ .focus(() => {
309
+ $('.popup').hide();
310
+ });
311
+
312
+ scope.days1 = [];
313
+ for (let i = 1; i < 32; i++) {
314
+ scope.days1.push(i);
315
+ }
316
+ scope.years1 = [];
317
+ for (let i = 1900; i < 2100; i++) {
318
+ scope.years1.push(i);
319
+ }
320
+ scope.monthes1 = ['يناير', 'فبراير', 'مارس', 'ابريل', 'مايو', 'يونيو', 'يوليو', 'اغسطس', 'سبتمبر', 'اكتوبر', 'نوفمبر', 'ديسمبر'];
321
+ },
322
+ restrict: 'E',
323
+ require: 'ngModel',
324
+ scope: {
325
+ v: '@',
326
+ label: '@',
327
+ disabled: '@',
328
+ ngModel: '=',
329
+ },
330
+ template: `
331
+ <div class="row i-date">
332
+
333
+ <div class=" control">
334
+ <label> {{label}} </label>
335
+ <div class="row">
336
+ <div class="col3 day">
337
+ <select ng-disabled="disabled" v="{{v}}" ng-model="ngModel.day" class="appearance-none no-border-left no-border-radius" >
338
+ <option ng-repeat="d1 in days1" ng-value="d1"> {{d1}} </option>
339
+ </select>
340
+ </div>
341
+ <div class="col5 month">
342
+ <select ng-disabled="disabled" v="{{v}}" ng-model="ngModel.month" class="appearance-none no-border-left no-border-right no-border-radius" >
343
+ <option ng-repeat="m1 in monthes1" ng-value="$index"> {{m1}} </option>
344
+ </select>
345
+ </div>
346
+ <div class="col4 year">
347
+ <select ng-disabled="disabled" v="{{v}}" ng-model="ngModel.year" class="appearance-none no-border-right no-border-radius" >
348
+ <option ng-repeat="y1 in years1" ng-value="y1"> {{y1}} </option>
349
+ </select>
350
+ </div>
351
+ </div>
352
+ </div>
353
+
354
+
355
+ </div>
356
+ `,
357
+ };
358
+ });
359
+
360
+ app.directive('iDate2', function () {
361
+ return {
362
+ link: function ($scope, element, attrs) {
363
+ if (typeof attrs.disabled !== 'undefined') {
364
+ attrs.disabled = 'disabled';
365
+ } else {
366
+ attrs.disabled = '';
367
+ }
368
+
369
+ $scope.y_search = attrs.year || '202';
370
+ $scope.m_search = attrs.month || '';
371
+ $scope.d_search = attrs.day || '';
372
+
373
+ $scope.days1 = [];
374
+ for (let i = 1; i < 32; i++) {
375
+ $scope.days1.push({
376
+ id: i,
377
+ name: i,
378
+ });
379
+ }
380
+ $scope.years1 = [];
381
+ for (let i = 1900; i < 2100; i++) {
382
+ $scope.years1.push({
383
+ id: i,
384
+ name: i,
385
+ });
386
+ }
387
+
388
+ $scope.monthes1 = [
389
+ { id: 0, name: 'يناير / Jan' },
390
+ { id: 1, name: 'فبراير / Feb' },
391
+ { id: 2, name: 'مارس / Mar' },
392
+ { id: 3, name: 'ابريل / Aper' },
393
+ { id: 4, name: 'مايو / May' },
394
+ { id: 5, name: 'يونيو / June' },
395
+ { id: 6, name: 'يوليو / Jule' },
396
+ { id: 7, name: 'اغسطس / Aug' },
397
+ { id: 8, name: 'سبتمبر / Sep' },
398
+ { id: 9, name: 'اكتوبر / Oct' },
399
+ { id: 10, name: 'نوفمبر / Nov' },
400
+ { id: 11, name: 'ديسمبر / Des' },
401
+ ];
402
+
403
+ $scope.model = null;
404
+
405
+ $scope.$watch('ngModel', function (ngModel) {
406
+ if (ngModel) {
407
+ ngModel = new Date(ngModel);
408
+ $scope.model = $scope.model || {};
409
+ $scope.model.day = ngModel.getDate();
410
+ $scope.model.day_name = $scope.model.day;
411
+ $scope.model.month = ngModel.getMonth();
412
+ $scope.model.month_name = $scope.monthes1.find((m) => m.id == $scope.model.month).name;
413
+ $scope.model.year = ngModel.getFullYear();
414
+ $scope.model.year_name = $scope.model.year;
415
+ } else {
416
+ $scope.model = $scope.model || {};
417
+ $scope.model.day = 0;
418
+ $scope.model.day_name = '';
419
+ $scope.model.month = -1;
420
+ $scope.model.month_name = '';
421
+ $scope.model.year = 0;
422
+ $scope.model.year_name = '';
423
+ }
424
+ });
425
+
426
+ $scope.setDay = function () {
427
+ $scope.ngModel = new Date();
428
+ };
429
+ $scope.updateDate = function (date) {
430
+ if (date.year) {
431
+ $scope.model.year = date.year.id;
432
+ $scope.model.year_name = date.year.name;
433
+ } else if (date.month) {
434
+ $scope.model.month = date.month.id;
435
+ $scope.model.month_name = date.month.name;
436
+ } else if (date.day) {
437
+ $scope.model.day = date.day.id;
438
+ $scope.model.day_name = date.day.name;
439
+ }
440
+
441
+ if ($scope.model && $scope.model.year && $scope.model.day && $scope.model.month > -1) {
442
+ $scope.ngModel = new Date($scope.model.year, $scope.model.month, $scope.model.day, 0, 0, 0);
443
+ } else {
444
+ delete $scope.ngModel;
445
+ }
446
+ };
447
+ },
448
+ restrict: 'E',
449
+ require: 'ngModel',
450
+ scope: {
451
+ v: '@',
452
+ disabled: '@',
453
+ label: '@',
454
+ ngModel: '=',
455
+ },
456
+ template: `/*##client-side/sub/i-date2.content.html*/`,
457
+ };
458
+ });
459
+
460
+ app.directive('iTime', function () {
461
+ return {
462
+ link: function ($scope, element, attrs) {
463
+ if (typeof attrs.disabled !== 'undefined') {
464
+ attrs.disabled = 'disabled';
465
+ } else {
466
+ attrs.disabled = '';
467
+ }
468
+
469
+ $scope.model = {};
470
+
471
+ $scope.hours = [];
472
+ for (let i = 1; i < 25; i++) {
473
+ $scope.hours.push(i);
474
+ }
475
+
476
+ $scope.minutes = [];
477
+ for (let i = 0; i < 60; i++) {
478
+ $scope.minutes.push(i);
479
+ }
480
+
481
+ $(element)
482
+ .find('select')
483
+ .focus(() => {
484
+ $('.popup').hide();
485
+ });
486
+
487
+ $scope.$watch('ngModel', function (ngModel) {
488
+ if (ngModel) {
489
+ ngModel.date = new Date(ngModel.date);
490
+ $scope.model = $scope.model || {};
491
+ $scope.model.hour = ngModel.hour;
492
+ $scope.model.minute = ngModel.minute;
493
+ } else {
494
+ $scope.model = $scope.model || {};
495
+ $scope.model.hour = 0;
496
+ $scope.model.minute = 0;
497
+ }
498
+ });
499
+
500
+ $scope.updateTime = function () {
501
+ if ($scope.model) {
502
+ $scope.ngModel = $scope.ngModel || {};
503
+ $scope.ngModel.hour = $scope.model.hour;
504
+ $scope.ngModel.minute = $scope.model.minute;
505
+ $scope.ngModel.date = new Date(null, null, null, $scope.model.hour, $scope.model.minute, null);
506
+ } else {
507
+ delete $scope.ngModel;
508
+ }
509
+ };
510
+ },
511
+ restrict: 'E',
512
+ require: 'ngModel',
513
+ scope: {
514
+ v: '@',
515
+ disabled: '@',
516
+ label: '@',
517
+ ngModel: '=',
518
+ },
519
+ template: `
520
+ <div class="row i-time">
521
+ <div class=" control ">
522
+ <label class="text-center"> {{label}} </label>
523
+ <div class="row">
524
+ <div class="col6 right">
525
+ <div class="row">
526
+ <div class="col2"></div>
527
+ <div class="col8">
528
+ <select ng-disabled="disabled" ng-model="model.minute" ng-change="updateTime()" class="small appearance-none no-border-left no-border-radius" >
529
+ <option ng-repeat="m in minutes" ng-value="m"> {{m}}</option>
530
+ </select>
531
+ </div>
532
+ <div class="col2"></div>
533
+ </div>
534
+
535
+ </div>
536
+ <div class="col6">
537
+ <div class="row">
538
+ <div class="col2 space right">
539
+ <span> : </span>
540
+ </div>
541
+ <div class="col8">
542
+ <select ng-disabled="disabled" ng-model="model.hour" ng-change="updateTime()" class="large blue appearance-none no-border-left no-border-radius" >
543
+ <option ng-repeat="h in hours" ng-value="h"> {{h}} </option>
544
+ </select>
545
+ </div>
546
+
547
+ </div>
548
+
549
+ </div>
550
+ </div>
551
+ </div>
552
+ `,
553
+ };
554
+ });
555
+
556
+ app.directive('iDatetime2', function () {
557
+ return {
558
+ link: function ($scope, element, attrs) {
559
+ if (typeof attrs.disabled !== 'undefined') {
560
+ attrs.disabled = 'disabled';
561
+ } else {
562
+ attrs.disabled = '';
563
+ }
564
+
565
+ $scope.hour1 = [];
566
+ for (let i = 1; i < 25; i++) {
567
+ $scope.hour1.push(i);
568
+ }
569
+
570
+ $scope.minute_list = [];
571
+ for (let i = 1; i < 60; i++) {
572
+ $scope.minute_list.push({
573
+ name: i,
574
+ });
575
+ }
576
+
577
+ $scope.days1 = [];
578
+ for (let i = 1; i < 32; i++) {
579
+ $scope.days1.push(i);
580
+ }
581
+ $scope.years1 = [];
582
+ for (let i = 1900; i < 2100; i++) {
583
+ $scope.years1.push(i);
584
+ }
585
+ $scope.monthes1 = ['يناير', 'فبراير', 'مارس', 'ابريل', 'مايو', 'يونيو', 'يوليو', 'اغسطس', 'سبتمبر', 'اكتوبر', 'نوفمبر', 'ديسمبر'];
586
+
587
+ $scope.model = null;
588
+
589
+ $(element)
590
+ .find('select')
591
+ .focus(() => {
592
+ $('.popup').hide();
593
+ });
594
+
595
+ $scope.$watch('ngModel', function (ngModel) {
596
+ if (ngModel) {
597
+ ngModel = new Date(ngModel);
598
+ $scope.model = $scope.model || {};
599
+ $scope.model.hour = ngModel.getHours();
600
+ $scope.model.minute = ngModel.getMinutes();
601
+ $scope.model.day = ngModel.getDate();
602
+ $scope.model.month = ngModel.getMonth();
603
+ $scope.model.year = ngModel.getFullYear();
604
+ } else {
605
+ $scope.model = $scope.model || {};
606
+ $scope.model.hour = 0;
607
+ $scope.model.minute = 0;
608
+ $scope.model.day = 0;
609
+ $scope.model.month = -1;
610
+ $scope.model.year = 0;
611
+ }
612
+ });
613
+
614
+ $scope.updateDate = function () {
615
+ if ($scope.model && $scope.model.year && $scope.model.day) {
616
+ $scope.ngModel = new Date($scope.model.year, $scope.model.month, $scope.model.day, $scope.model.hour, $scope.model.minute);
617
+ } else {
618
+ delete $scope.ngModel;
619
+ }
620
+ };
621
+ },
622
+ restrict: 'E',
623
+ require: 'ngModel',
624
+ scope: {
625
+ v: '@',
626
+ disabled: '@',
627
+ label: '@',
628
+ ngModel: '=',
629
+ },
630
+ template: `
631
+ <div class="row i-datetime2">
632
+
633
+ <div class=" control">
634
+ <label> {{label}} </label>
635
+ <div class="row">
636
+
637
+ <div class="col2 day">
638
+ <select v="{{v}}" ng-disabled="disabled" ng-model="model.day" ng-change="updateDate()" class="appearance-none no-border-left no-border-radius" >
639
+ <option ng-repeat="d1 in days1" ng-value="d1"> {{d1}} </option>
640
+ </select>
641
+ </div>
642
+ <div class="col5 month">
643
+ <select v="{{v}}" ng-disabled="disabled" ng-model="model.month" ng-change="updateDate()" class="appearance-none no-border-left no-border-right no-border-radius" >
644
+ <option ng-repeat="m1 in monthes1" ng-value="$index"> {{m1}} </option>
645
+ </select>
646
+ </div>
647
+ <div class="col3 year">
648
+ <select v="{{v}}" ng-disabled="disabled" ng-model="model.year" ng-change="updateDate()" class="appearance-none no-border-right no-border-radius" >
649
+ <option ng-repeat="y1 in years1" ng-value="y1"> {{y1}} </option>
650
+ </select>
651
+ </div>
652
+
653
+ <div class="col1 hour">
654
+ <select v="{{v}}" ng-disabled="disabled" ng-model="model.hour" ng-change="updateDate()" class="appearance-none no-border-radius" >
655
+ <option ng-repeat="h1 in hour1" ng-value="h1"> {{h1}} </option>
656
+ </select>
657
+ </div>
658
+ <div class="col1 minute">
659
+ <select v="{{v}}" ng-disabled="disabled" ng-model="model.minute" ng-change="updateDate()" class="green appearance-none no-border-right no-border-radius" >
660
+ <option ng-repeat="m1 in minute_list" ng-value="m1.name" class="green"> {{m1.name}} </option>
661
+ </select>
662
+ </div>
663
+
664
+ </div>
665
+ </div>
666
+
667
+
668
+ </div>
669
+ `,
670
+ };
671
+ });
672
+
673
+ app.directive('iMonth2', function () {
674
+ return {
675
+ link: function ($scope, element, attrs) {
676
+ if (typeof attrs.disabled !== 'undefined') {
677
+ attrs.disabled = 'disabled';
678
+ } else {
679
+ attrs.disabled = '';
680
+ }
681
+
682
+ $scope.years = [];
683
+ for (let i = 1900; i < 2100; i++) {
684
+ $scope.years.push(i);
685
+ }
686
+ $scope.monthes = ['يناير', 'فبراير', 'مارس', 'ابريل', 'مايو', 'يونيو', 'يوليو', 'اغسطس', 'سبتمبر', 'اكتوبر', 'نوفمبر', 'ديسمبر'];
687
+
688
+ $scope.model = null;
689
+
690
+ $(element)
691
+ .find('select')
692
+ .focus(() => {
693
+ $('.popup').hide();
694
+ });
695
+
696
+ $scope.$watch('ngModel', function (ngModel) {
697
+ if (ngModel) {
698
+ ngModel = new Date(ngModel);
699
+ $scope.model = $scope.model || {};
700
+ $scope.model.day = 1;
701
+ $scope.model.month = ngModel.getMonth();
702
+ $scope.model.year = ngModel.getFullYear();
703
+ } else {
704
+ $scope.model = $scope.model || {};
705
+ $scope.model.day = 0;
706
+ $scope.model.month = -1;
707
+ $scope.model.year = 0;
708
+ }
709
+ });
710
+
711
+ $scope.updateDate = function () {
712
+ if ($scope.model && $scope.model.year) {
713
+ $scope.ngModel = new Date($scope.model.year, $scope.model.month, 1);
714
+ } else {
715
+ delete $scope.ngModel;
716
+ }
717
+ };
718
+ },
719
+ restrict: 'E',
720
+ require: 'ngModel',
721
+ scope: {
722
+ v: '@',
723
+ label: '@',
724
+ disabled: '@',
725
+ ngModel: '=',
726
+ },
727
+ template: `
728
+ <div class="row i-date2">
729
+
730
+ <div class=" control">
731
+ <label> {{label}} </label>
732
+ <div class="row">
733
+
734
+ <div class="col7 month">
735
+ <select ng-disabled="disabled" v="{{v}}" ng-model="model.month" ng-change="updateDate()" class="appearance-none no-border-left no-border-radius" >
736
+ <option ng-repeat="m1 in monthes" ng-value="$index"> {{m1}} </option>
737
+ </select>
738
+ </div>
739
+
740
+ <div class="col5 year">
741
+ <select ng-disabled="disabled" v="{{v}}" ng-model="model.year" ng-change="updateDate()" class="appearance-none no-border-right no-border-radius" >
742
+ <option ng-repeat="y1 in years" ng-value="y1"> {{y1}} </option>
743
+ </select>
744
+ </div>
745
+
746
+ </div>
747
+ </div>
748
+
749
+
750
+ </div>
751
+ `,
752
+ };
753
+ });
754
+
755
+ app.directive('iFulldate', [
756
+ '$http',
757
+ function ($http) {
758
+ return {
759
+ link: function ($scope, element, attrs, ngModel) {
760
+ let _busy = !1;
761
+
762
+ if (typeof attrs.disabled !== 'undefined') {
763
+ attrs.disabled = 'disabled';
764
+ } else {
765
+ attrs.disabled = '';
766
+ }
767
+
768
+ $(element)
769
+ .find('select')
770
+ .focus(() => {
771
+ $('.popup').hide();
772
+ });
773
+
774
+ $scope.days1 = [];
775
+ for (let i = 1; i < 32; i++) {
776
+ $scope.days1.push(i);
777
+ }
778
+ $scope.years1 = [];
779
+ for (let i = 1950; i < 2030; i++) {
780
+ $scope.years1.push(i);
781
+ }
782
+
783
+ $scope.monthes1 = ['يناير', 'فبراير', 'مارس', 'ابريل', 'مايو', 'يونيو', 'يوليو', 'اغسطس', 'سبتمبر', 'اكتوبر', 'نوفمبر', 'ديسمبر'];
784
+
785
+ $scope.days2 = [];
786
+ for (let i = 1; i < 31; i++) {
787
+ $scope.days2.push(i);
788
+ }
789
+ $scope.years2 = [];
790
+ for (let i = 1370; i < 1450; i++) {
791
+ $scope.years2.push(i);
792
+ }
793
+ $scope.monthes2 = ['محرم', 'صفر', 'ربيع اول', 'ربيع ثان', 'جمادى اول', 'جمادى ثان', 'رجب', 'شعبان', 'رمضان', 'شوال', 'ذى القعدة', 'ذى الحجة'];
794
+
795
+ $scope.model = {};
796
+
797
+ $scope.$watch('ngModel', function (ngModel) {
798
+ if (ngModel) {
799
+ $scope.model = ngModel;
800
+ } else {
801
+ $scope.model = {};
802
+ }
803
+ });
804
+
805
+ $scope.$watch('ngModel.date', function (date) {
806
+ if (date) {
807
+ if (typeof date == 'string') {
808
+ date = new Date(date);
809
+ }
810
+ $scope.model = $scope.model || {};
811
+ $scope.model.date = date;
812
+ $scope.model.day = date.getDate();
813
+ $scope.model.month = date.getMonth();
814
+ $scope.model.year = date.getFullYear();
815
+ $scope.get_hijri_date();
816
+ }
817
+ });
818
+
819
+ $scope.get_hijri_date = function () {
820
+ if ($scope.model && $scope.model.year && $scope.model.day) {
821
+ ngModel.$setViewValue($scope.model);
822
+ if (_busy) {
823
+ return;
824
+ }
825
+ _busy = !0;
826
+ $scope.model.date = new Date($scope.model.year, $scope.model.month, $scope.model.day);
827
+ $http({
828
+ method: 'POST',
829
+ url: '/api/get_hijri_date',
830
+ data: {
831
+ date: $scope.model.year + '/' + ($scope.model.month + 1) + '/' + $scope.model.day,
832
+ },
833
+ })
834
+ .then((response) => {
835
+ if (response.data.done) {
836
+ $scope.model.hijri = response.data.hijri;
837
+ $scope.model.day2 = parseInt($scope.model.hijri.split('/')[2]);
838
+ $scope.model.month2 = parseInt($scope.model.hijri.split('/')[1]) - 1;
839
+ $scope.model.year2 = parseInt($scope.model.hijri.split('/')[0]);
840
+ ngModel.$setViewValue($scope.model);
841
+ _busy = !1;
842
+ }
843
+ })
844
+ .catch(() => {
845
+ _busy = !1;
846
+ });
847
+ }
848
+ };
849
+
850
+ $scope.get_normal_date = function () {
851
+ if ($scope.model && $scope.model.year2 && $scope.model.day2) {
852
+ ngModel.$setViewValue($scope.model);
853
+ if (_busy) {
854
+ return;
855
+ }
856
+ _busy = !0;
857
+ $http({
858
+ method: 'POST',
859
+ url: '/api/get_normal_date',
860
+ data: {
861
+ hijri: $scope.model.year2 + '/' + ($scope.model.month2 + 1) + '/' + $scope.model.day2,
862
+ },
863
+ })
864
+ .then((response) => {
865
+ if (response.data.done) {
866
+ $scope.model.date = new Date(response.data.date);
867
+ $scope.model.day = parseInt(response.data.date.split('/')[2]);
868
+ $scope.model.month = parseInt(response.data.date.split('/')[1]) - 1;
869
+ $scope.model.year = parseInt(response.data.date.split('/')[0]);
870
+ ngModel.$setViewValue($scope.model);
871
+ _busy = !1;
872
+ }
873
+ })
874
+ .catch(() => {
875
+ _busy = !1;
876
+ });
877
+ }
878
+ };
879
+ },
880
+ restrict: 'E',
881
+ require: 'ngModel',
882
+ scope: {
883
+ v: '@',
884
+ label1: '@',
885
+ label2: '@',
886
+ disabled: '@',
887
+ ngModel: '=',
888
+ ngChange: '&',
889
+ },
890
+ template: `
891
+ <div class="row i-date">
892
+
893
+ <div class="col6 control">
894
+ <label> {{label1}} </label>
895
+ <div class="row">
896
+ <div class="col3 day">
897
+ <select ng-change="get_hijri_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.day" class="appearance-none no-border-left no-border-radius">
898
+ <option ng-repeat="d1 in days1" ng-value="d1"> {{d1}} </option>
899
+ </select>
900
+ </div>
901
+ <div class="col5 month">
902
+ <select ng-change="get_hijri_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.month" class="appearance-none no-border-left no-border-right no-border-radius">
903
+ <option ng-repeat="m1 in monthes1" ng-value="$index"> {{m1}} </option>
904
+ </select>
905
+ </div>
906
+ <div class="col4 year">
907
+ <select ng-change="get_hijri_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.year" class="appearance-none no-border-right no-border-radius">
908
+ <option ng-repeat="y1 in years1" ng-value="y1"> {{y1}} </option>
909
+ </select>
910
+ </div>
911
+ </div>
912
+ </div>
913
+
914
+ <div class="col6 control">
915
+ <label> {{label2}} </label>
916
+ <div class="row">
917
+ <div class="col3 day">
918
+ <select ng-change="get_normal_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.day2" class="appearance-none no-border-left no-border-radius">
919
+ <option ng-repeat="d2 in days2" ng-value="d2"> {{d2}} </option>
920
+ </select>
921
+ </div>
922
+ <div class="col5 month">
923
+ <select ng-change="get_normal_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.month2" class="appearance-none no-border-left no-border-right no-border-radius">
924
+ <option ng-repeat="m2 in monthes2" ng-value="$index"> {{m2}} </option>
925
+ </select>
926
+ </div>
927
+ <div class="col4 year">
928
+ <select ng-change="get_normal_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.year2" class="appearance-none no-border-right no-border-radius">
929
+ <option ng-repeat="y2 in years2" ng-value="y2"> {{y2}} </option>
930
+ </select>
931
+ </div>
932
+ </div>
933
+ </div>
934
+
935
+ </div>
936
+ `,
937
+ };
938
+ },
939
+ ]);
940
+
941
+ app.directive('iTextarea', function () {
942
+ return {
943
+ restrict: 'E',
944
+ require: 'ngModel',
945
+ scope: {
946
+ v: '@',
947
+ label: '@',
948
+ disabled: '@',
949
+ rows: '@',
950
+ ngModel: '=',
951
+ ngChange: '&',
952
+ },
953
+ link: function (scope, element, attrs, ctrl) {
954
+ if (typeof attrs.disabled !== 'undefined') {
955
+ attrs.disabled = 'disabled';
956
+ } else {
957
+ attrs.disabled = '';
958
+ }
959
+ scope.rows = scope.rows || 4;
960
+
961
+ $(element)
962
+ .find('textarea')
963
+ .focus(() => {
964
+ $('.popup').hide();
965
+ });
966
+ },
967
+ template: `
968
+ <div class="control">
969
+ <label> {{label}} </label>
970
+ <textarea ng-disabled="disabled" rows="{{rows}}" v="{{v}}" ng-model="ngModel" ng-change="ngChange()"></textarea>
971
+ </div>
972
+ `,
973
+ };
974
+ });
975
+
976
+
977
+
978
+ app.directive('iChecklist', [
979
+ '$interval',
980
+ function ($interval) {
981
+ return {
982
+ restrict: 'E',
983
+ required: 'ngModel',
984
+ scope: {
985
+ label: '@',
986
+ primary: '@',
987
+ display: '@',
988
+ ngModel: '=',
989
+ items: '=',
990
+ like: '&',
991
+ },
992
+ link: function ($scope, element, attrs, ctrl) {
993
+ attrs.primary = attrs.primary || 'id';
994
+
995
+ $scope.selectedItems = [];
996
+
997
+ $scope.$watch('ngModel', (ngModel) => {
998
+ $scope.reload();
999
+ });
1000
+
1001
+ $scope.reload = function () {
1002
+ $scope.selectedItems = [];
1003
+
1004
+ if ($scope.ngModel) {
1005
+ $scope.ngModel.forEach((mitem) => {
1006
+ $scope.selectedItems.push(mitem);
1007
+ });
1008
+
1009
+ if ($scope.items) {
1010
+ $scope.items.forEach((mitem) => {
1011
+ let exist = !1;
1012
+ $scope.selectedItems.forEach((sitem) => {
1013
+ if (mitem[$scope.primary] === sitem[$scope.primary]) {
1014
+ exist = !0;
1015
+ }
1016
+ });
1017
+ if (exist) {
1018
+ mitem.$selected = !0;
1019
+ } else {
1020
+ mitem.$selected = !1;
1021
+ }
1022
+ });
1023
+ }
1024
+ }
1025
+ if (!$scope.ngModel) {
1026
+ $scope.selectedItems = [];
1027
+ if ($scope.items) {
1028
+ $scope.items.forEach((mitem) => {
1029
+ mitem.$selected = !1;
1030
+ });
1031
+ }
1032
+ }
1033
+ };
1034
+
1035
+ $scope.change = function (item) {
1036
+ item.$selected = !item.$selected;
1037
+
1038
+ if (item.$selected) {
1039
+ let exsits = !1;
1040
+ $scope.selectedItems.forEach((sitem) => {
1041
+ if (sitem[$scope.primary] === item[$scope.primary]) {
1042
+ exsits = !0;
1043
+ }
1044
+ });
1045
+ if (!exsits) {
1046
+ $scope.selectedItems.push(item);
1047
+ }
1048
+ } else {
1049
+ $scope.selectedItems.forEach((sitem, index) => {
1050
+ if (sitem[$scope.primary] === item[$scope.primary]) {
1051
+ $scope.selectedItems.splice(index, 1);
1052
+ }
1053
+ });
1054
+ }
1055
+
1056
+ $scope.ngModel = $scope.selectedItems;
1057
+ };
1058
+ },
1059
+ template: `
1060
+ <div class="row padding check-list">
1061
+ <label class="title"> {{label}} </label>
1062
+ <div ng-repeat="item in items" ng-click="change(item);ngChange($event , item);" class="selector" ng-class="{'selected' : item.$selected , 'un-selected' : !item.$selected }" >
1063
+ <i ng-show="!item.$selected" class="fa fa-square"></i> <i ng-show="item.$selected" class="fa fa-check"></i> {{item[display]}}
1064
+ </div>
1065
+ </div>
1066
+ `,
1067
+ };
1068
+ },
1069
+ ]);
1070
+
1071
+ app.directive('iChecklist2', [
1072
+ '$interval',
1073
+ function ($interval) {
1074
+ return {
1075
+ restrict: 'E',
1076
+ required: 'ngModel',
1077
+ scope: {
1078
+ label: '@',
1079
+ primary: '@',
1080
+ display: '@',
1081
+ ngModel: '=',
1082
+ items: '=',
1083
+ like: '&',
1084
+ },
1085
+ link: function ($scope, element, attrs, ctrl) {
1086
+ attrs.primary = attrs.primary || 'id';
1087
+
1088
+ $scope.selectedItems = [];
1089
+
1090
+ $scope.$watch('ngModel', (ngModel) => {
1091
+ $scope.reload();
1092
+ });
1093
+
1094
+ $scope.reload = function () {
1095
+ $scope.selectedItems = [];
1096
+
1097
+ if ($scope.ngModel) {
1098
+ $scope.ngModel.forEach((mitem) => {
1099
+ $scope.selectedItems.push(mitem);
1100
+ });
1101
+
1102
+ if ($scope.items) {
1103
+ $scope.items.forEach((mitem) => {
1104
+ let exist = !1;
1105
+ $scope.selectedItems.forEach((sitem) => {
1106
+ if (mitem[$scope.primary] === sitem[$scope.primary]) {
1107
+ exist = !0;
1108
+ }
1109
+ });
1110
+ if (exist) {
1111
+ mitem.$selected = !0;
1112
+ } else {
1113
+ mitem.$selected = !1;
1114
+ }
1115
+ });
1116
+ }
1117
+ }
1118
+ if (!$scope.ngModel) {
1119
+ $scope.selectedItems = [];
1120
+ if ($scope.items) {
1121
+ $scope.items.forEach((mitem) => {
1122
+ mitem.$selected = !1;
1123
+ });
1124
+ }
1125
+ }
1126
+ };
1127
+
1128
+ $scope.change = function (item) {
1129
+ if (item.$selected) {
1130
+ let exsits = !1;
1131
+ $scope.selectedItems.forEach((sitem) => {
1132
+ if (sitem[$scope.primary] === item[$scope.primary]) {
1133
+ exsits = !0;
1134
+ }
1135
+ });
1136
+ if (!exsits) {
1137
+ $scope.selectedItems.push(item);
1138
+ }
1139
+ } else {
1140
+ $scope.selectedItems.forEach((sitem, index) => {
1141
+ if (sitem[$scope.primary] === item[$scope.primary]) {
1142
+ $scope.selectedItems.splice(index, 1);
1143
+ }
1144
+ });
1145
+ }
1146
+
1147
+ $scope.ngModel = $scope.selectedItems;
1148
+ };
1149
+ },
1150
+ template: `
1151
+ <div class="row padding check-list">
1152
+ <label class="title"> {{label}} </label>
1153
+ <div class="control" ng-repeat="item in items">
1154
+ <label class="checkbox" >
1155
+ <span > {{item[display]}} </span>
1156
+ <input type="checkbox" ng-model="item.$selected" ng-change="change(item)" >
1157
+ <span class="checkmark"></span>
1158
+ </label>
1159
+ </div>
1160
+ </div>
1161
+ `,
1162
+ };
1163
+ },
1164
+ ]);
1165
+
1166
+ app.directive('iRadiolist', [
1167
+ '$interval',
1168
+ function ($interval) {
1169
+ return {
1170
+ restrict: 'E',
1171
+ required: 'ngModel',
1172
+ scope: {
1173
+ label: '@',
1174
+ display: '@',
1175
+ ngModel: '=',
1176
+ items: '=',
1177
+ },
1178
+ link: function (scope, element, attrs) {
1179
+ scope.model = scope.ngModel;
1180
+
1181
+ scope.code = 'radio_' + Math.random();
1182
+
1183
+ scope.change = function (item) {
1184
+ scope.ngModel = item;
1185
+ };
1186
+
1187
+ scope.isChecked = function (item) {
1188
+ if (item && scope.ngModel && scope.ngModel.id === item.id) {
1189
+ return !0;
1190
+ }
1191
+ return !1;
1192
+ };
1193
+ },
1194
+ template: `
1195
+ <div class="row padding radio-list">
1196
+ <label class="title"> {{label}} </label>
1197
+ <div class="control" ng-repeat="item in items">
1198
+ <label class="radio" >
1199
+ <span > {{item[display]}} </span>
1200
+ <input name="{{code}}" type="radio" ng-model="model" ng-checked="isChecked(item)" ng-click="change(item)" ng-change="change(item)" >
1201
+ <span class="checkmark"></span>
1202
+ </label>
1203
+ </div>
1204
+ </div>
1205
+ `,
1206
+ };
1207
+ },
1208
+ ]);
1209
+
1210
+ app.directive('iFile', [
1211
+ '$interval',
1212
+ 'isite',
1213
+ function ($interval, isite) {
1214
+ return {
1215
+ restrict: 'E',
1216
+ required: 'ngModel',
1217
+ scope: {
1218
+ label: '@',
1219
+ type: '@',
1220
+ ngModel: '=',
1221
+ ngClick: '&',
1222
+ onSelected: '&',
1223
+ },
1224
+ link: function (scope, element, attrs, ctrl) {
1225
+ scope.type = scope.type || 'bg-green';
1226
+
1227
+ let input = $(element).find('input')[0];
1228
+ let a = $(element).find('a')[0];
1229
+
1230
+ if (attrs.view !== '') {
1231
+ a.addEventListener('click', function () {
1232
+ input.click();
1233
+ });
1234
+ }
1235
+
1236
+ input.addEventListener('change', function () {
1237
+ scope.ngModel = this.files[0].path;
1238
+ scope.onSelected(this.files[0].path);
1239
+ scope.$applyAsync();
1240
+ });
1241
+
1242
+ scope.$watch('ngModel', (ngModel) => {
1243
+ if (ngModel) {
1244
+ a.setAttribute('url', ngModel);
1245
+ }
1246
+ });
1247
+ },
1248
+ template: `
1249
+ <form class="form text-center pointer">
1250
+ <input class="hidden" type="file" name="file" />
1251
+ <a class="btn {{type}}" ngClick="ngClick()" url="{{ngModel}}"> {{label}} </a>
1252
+ </form>
1253
+ `,
1254
+ };
1255
+ },
1256
+ ]);
1257
+
1258
+ app.directive('iImage', [
1259
+ '$interval',
1260
+ 'isite',
1261
+ function ($interval, isite) {
1262
+ return {
1263
+ restrict: 'E',
1264
+ required: 'ngModel',
1265
+ scope: {
1266
+ category: '@',
1267
+ ngModel: '=',
1268
+ ngClick: '&',
1269
+ },
1270
+ link: function (scope, element, attrs, ctrl) {
1271
+ scope.category = scope.category || 'default';
1272
+
1273
+ let input = $(element).find('input')[0];
1274
+ let img = $(element).find('img')[0];
1275
+ let progress = $(element).find('progress')[0];
1276
+ $(progress).hide();
1277
+
1278
+ if (attrs.view !== '') {
1279
+ img.addEventListener('click', function () {
1280
+ input.click();
1281
+ });
1282
+ }
1283
+
1284
+ input.addEventListener('change', function () {
1285
+ isite.uploadImage(
1286
+ this.files,
1287
+ {
1288
+ category: scope.category,
1289
+ },
1290
+ (err, image_url, e) => {
1291
+ if (e) {
1292
+ $(progress).show();
1293
+ progress.value = e.loaded;
1294
+ progress.max = e.total;
1295
+ }
1296
+
1297
+ if (image_url) {
1298
+ scope.ngModel = image_url;
1299
+ }
1300
+ }
1301
+ );
1302
+ });
1303
+
1304
+ scope.$watch('ngModel', (ngModel) => {
1305
+ if (ngModel) {
1306
+ img.setAttribute('src', ngModel);
1307
+ }
1308
+ });
1309
+ },
1310
+ template: `
1311
+ <form class="form text-center pointer">
1312
+ <input class="hidden" type="file" name="file" />
1313
+ <img class="bg-white" ng-src="{{ngModel}}" ngClick="ngClick()" onerror="this.src='/images/no.jpg'" />
1314
+ <progress class="row"></progress>
1315
+ </form>
1316
+ `,
1317
+ };
1318
+ },
1319
+ ]);
1320
+
1321
+ app.directive('iUpload', [
1322
+ '$interval',
1323
+ 'isite',
1324
+ function ($interval, isite) {
1325
+ return {
1326
+ restrict: 'E',
1327
+ required: 'ngModel',
1328
+ scope: {
1329
+ label: '@',
1330
+ api: '@',
1331
+ type: '@',
1332
+ ngModel: '=',
1333
+ ngClick: '&',
1334
+ onUploaded: '&',
1335
+ },
1336
+ link: function (scope, element, attrs, ctrl) {
1337
+ scope.type = scope.type || 'bg-green';
1338
+
1339
+ let input = $(element).find('input')[0];
1340
+ let a = $(element).find('a')[0];
1341
+ let progress = $(element).find('progress')[0];
1342
+ $(progress).hide();
1343
+
1344
+ if (attrs.view !== '') {
1345
+ a.addEventListener('click', function () {
1346
+ input.click();
1347
+ });
1348
+ }
1349
+
1350
+ input.addEventListener('change', function () {
1351
+ isite.upload(
1352
+ this.files,
1353
+ {
1354
+ api: scope.api,
1355
+ },
1356
+ (err, file, e) => {
1357
+ if (e) {
1358
+ $(progress).show();
1359
+ progress.value = e.loaded;
1360
+ progress.max = e.total;
1361
+ }
1362
+
1363
+ if (file) {
1364
+ scope.ngModel = file;
1365
+ scope.onUploaded();
1366
+ }
1367
+ }
1368
+ );
1369
+ });
1370
+
1371
+ scope.$watch('ngModel', (ngModel) => {
1372
+ if (ngModel) {
1373
+ a.setAttribute('url', ngModel);
1374
+ }
1375
+ });
1376
+ },
1377
+ template: `
1378
+ <form class="form text-center pointer">
1379
+ <input class="hidden" type="file" name="file" />
1380
+ <a class="btn {{type}}" ngClick="ngClick()" url="{{ngModel}}"> {{label}} </a>
1381
+ <progress class="row"></progress>
1382
+ </form>
1383
+ `,
1384
+ };
1385
+ },
1386
+ ]);
1387
+
1388
+ app.directive('iFiles', [
1389
+ '$interval',
1390
+ 'isite',
1391
+ function ($interval, isite) {
1392
+ return {
1393
+ restrict: 'E',
1394
+ required: 'ngModel',
1395
+ scope: {
1396
+ category: '@',
1397
+ label: '@',
1398
+ ngModel: '=',
1399
+ },
1400
+ link: function (scope, element, attrs, ctrl) {
1401
+ if (attrs.view === '') {
1402
+ scope.viewOnly = !0;
1403
+ }
1404
+
1405
+ let progress = $(element).find('progress')[0];
1406
+
1407
+ scope.category = scope.category || 'default';
1408
+ scope.id = Math.random().toString().replace('.', '_');
1409
+ scope.deleteFile = function (file) {
1410
+ isite.deleteFile(file, () => {
1411
+ for (let i = 0; i < scope.ngModel.length; i++) {
1412
+ let f = scope.ngModel[i];
1413
+ if (f.url === file.url) {
1414
+ scope.ngModel.splice(i, 1);
1415
+ return;
1416
+ }
1417
+ }
1418
+ });
1419
+ };
1420
+
1421
+ let setEvent = !1;
1422
+ $interval(() => {
1423
+ if (setEvent) {
1424
+ return;
1425
+ }
1426
+
1427
+ if (attrs.view !== '') {
1428
+ let btn = document.querySelector('#btn_' + scope.id);
1429
+ if (btn) {
1430
+ setEvent = !0;
1431
+ btn.addEventListener('click', function () {
1432
+ document.querySelector('#input_' + scope.id).click();
1433
+ });
1434
+ }
1435
+
1436
+ let input = document.querySelector('#input_' + scope.id);
1437
+ if (input) {
1438
+ input.addEventListener('change', function () {
1439
+ isite.uploadFile(
1440
+ this.files,
1441
+ {
1442
+ category: scope.category,
1443
+ },
1444
+ (err, file, e) => {
1445
+ if (e) {
1446
+ $(progress).show();
1447
+ progress.value = e.loaded;
1448
+ progress.max = e.total;
1449
+ }
1450
+
1451
+ if (file) {
1452
+ if (typeof scope.ngModel === 'undefined') {
1453
+ scope.ngModel = [];
1454
+ }
1455
+ scope.ngModel.push(file);
1456
+ }
1457
+ }
1458
+ );
1459
+ });
1460
+ }
1461
+ } else {
1462
+ setEvent = !0;
1463
+ }
1464
+ }, 500);
1465
+ },
1466
+ template: `
1467
+ <div class="files">
1468
+ <label> {{label}} </label>
1469
+ <form ng-if="viewOnly !== !0" id="img_{{id}}" class="form text-center pointer">
1470
+ <input id="input_{{id}}" class="hidden" type="file" name="file" />
1471
+ <a id="btn_{{id}}" class="btn bg-green"> <i class="fa fa-upload white"></i> </a>
1472
+ </form>
1473
+ <progress class="row"></progress>
1474
+ <div class="padding">
1475
+
1476
+ <div class="row padding" ng-repeat="f in ngModel">
1477
+ <h2>
1478
+ <a class="btn default bg-blue" href="{{f.url}}"> <i class="fa fa-2x fa-download white"></i> </a>
1479
+ <a ng-if="viewOnly !== !0" class="btn default bg-red" ng-click="deleteFile(f)"> <i class="fa fa-trash white"></i> </a>
1480
+ <span> {{f.name}} </span>
1481
+ </h2>
1482
+ </div>
1483
+ </div>
1484
+ </div>
1485
+
1486
+ `,
1487
+ };
1488
+ },
1489
+ ]);
1490
+
1491
+ app.directive('iDrag', [
1492
+ '$document',
1493
+ function ($document) {
1494
+ return function (scope, element, attr) {
1495
+ var startX = 0,
1496
+ startY = 0,
1497
+ x = 0,
1498
+ y = 0;
1499
+
1500
+ element.css({
1501
+ position: 'relative',
1502
+ });
1503
+
1504
+ element.on('mousedown', function (event) {
1505
+ event.preventDefault();
1506
+ startX = event.screenX - x;
1507
+ startY = event.screenY - y;
1508
+ $document.on('mousemove', mousemove);
1509
+ $document.on('mouseup', mouseup);
1510
+ });
1511
+
1512
+ function mousemove(event) {
1513
+ y = event.screenY - startY;
1514
+ x = event.screenX - startX;
1515
+ element.css({
1516
+ top: y + 'px',
1517
+ left: x + 'px',
1518
+ });
1519
+ }
1520
+
1521
+ function mouseup() {
1522
+ $document.off('mousemove', mousemove);
1523
+ $document.off('mouseup', mouseup);
1524
+ }
1525
+ };
1526
+ },
1527
+ ]);
1528
+
1529
+ app.directive('iTreeview', [
1530
+ '$interval',
1531
+ '$timeout',
1532
+ 'isite',
1533
+ function ($interval, $timeout, isite) {
1534
+ return {
1535
+ restrict: 'E',
1536
+ require: 'ngModel',
1537
+ scope: {
1538
+ v: '@',
1539
+ label: '@',
1540
+ display: '@',
1541
+ display2: '@',
1542
+ disabled: '@',
1543
+ space: '@',
1544
+ primary: '@',
1545
+ ngValue: '@',
1546
+ ngModel: '=',
1547
+ ngSearch: '=',
1548
+ ngChange: '&',
1549
+ ngClick: '&',
1550
+ ngAdd: '&',
1551
+ ngNode: '&',
1552
+ ngEdit: '&',
1553
+ ngDelete: '&',
1554
+ nodes: '=',
1555
+ },
1556
+ link: function ($scope, element, attrs, ctrl) {
1557
+ attrs.display = attrs.display || 'name';
1558
+ attrs.primary = attrs.primary || 'id';
1559
+ attrs.space = attrs.space || ' ';
1560
+ attrs.ngValue = attrs.ngValue || '';
1561
+
1562
+ $scope.source = {};
1563
+
1564
+ $scope.setNodes = function (v_node) {
1565
+ v_node.nodes.forEach((v_node2) => {
1566
+ v_node2.nodes = v_node2.nodes || [];
1567
+ $scope.nodes.forEach((node) => {
1568
+ if (node.$parent_id == v_node2.id) {
1569
+ node.v_display = node.v_display || '';
1570
+ node.v_display += node[attrs.display];
1571
+
1572
+ let exist = !1;
1573
+ v_node2.nodes.forEach((n) => {
1574
+ if (n.id == node.id) {
1575
+ exist = !0;
1576
+ }
1577
+ });
1578
+ if (!exist) {
1579
+ v_node2.nodes.push(node);
1580
+ }
1581
+ }
1582
+ });
1583
+ $scope.setNodes(v_node2);
1584
+ });
1585
+ };
1586
+
1587
+ $scope.v_nodes = [];
1588
+
1589
+ $scope.$watch('ngModel', (ngModel) => {
1590
+ if (ngModel) {
1591
+ $scope.ngModel = ngModel;
1592
+ $scope.ngModel.v_display = $scope.ngModel.v_display || ngModel[attrs.display];
1593
+ }
1594
+ });
1595
+
1596
+ $scope.$watch('nodes', (nodes) => {
1597
+ $scope.v_nodes = [];
1598
+ if (nodes) {
1599
+ nodes.forEach((node) => {
1600
+ node.$parent_id = node.parent_id || 0;
1601
+ node.v_display = node.v_display || '';
1602
+ node.v_display += node[attrs.display];
1603
+ if (node.$parent_id == 0) {
1604
+ let exist = !1;
1605
+ $scope.v_nodes.forEach((n) => {
1606
+ if (n.id == node.id) {
1607
+ exist = !0;
1608
+ }
1609
+ });
1610
+ if (!exist) {
1611
+ $scope.v_nodes.push(node);
1612
+ }
1613
+ }
1614
+ });
1615
+
1616
+ $scope.v_nodes.forEach((v_node) => {
1617
+ v_node.nodes = v_node.nodes || [];
1618
+
1619
+ nodes.forEach((node) => {
1620
+ node.$parent_id = node.parent_id || 0;
1621
+ if (node.$parent_id == v_node.id) {
1622
+ node.v_display = node.v_display || '';
1623
+ node.v_display += node[attrs.display];
1624
+
1625
+ let exist = !1;
1626
+ v_node.nodes.forEach((n) => {
1627
+ if (n.id == node.id) {
1628
+ exist = !0;
1629
+ }
1630
+ });
1631
+ if (!exist) {
1632
+ v_node.nodes.push(node);
1633
+ }
1634
+ }
1635
+ });
1636
+
1637
+ $scope.setNodes(v_node);
1638
+ });
1639
+ }
1640
+ });
1641
+ },
1642
+ template: `
1643
+ <div class="treeview">
1644
+ <ul >
1645
+ <li ng-dblclick="$event.preventDefault();$event.stopPropagation();source.$actions = !0" ng-mouseleave="source.$actions = !1">
1646
+
1647
+ <i ng-hide="openTree" class="fa fa-folder"></i> <i ng-show="openTree" class="fa fa-folder"></i>
1648
+
1649
+
1650
+ <span ng-click="openTree = !openTree" class="title"> {{label}} <small class="display"> [ {{ngModel.v_display}} ] </small> </span>
1651
+ <div class="actions" ng-show="source.$actions === !0">
1652
+ <i-button type="add default" ng-click="ngClick($event , ngModel);ngNode($event , ngModel)"></i-button>
1653
+ </div>
1654
+ <i-treenode display="{{display}}" ng-click="ngClick($event)" ng-add="ngAdd()" ng-edit="ngEdit()" ng-delete="ngDelete()" ng-show="openTree" ng-model="ngModel" nodes="v_nodes" ></i-treenode>
1655
+ </li>
1656
+ </ul>
1657
+ </div>
1658
+ `,
1659
+ };
1660
+ },
1661
+ ]);
1662
+
1663
+ app.directive('iTreenode', [
1664
+ '$interval',
1665
+ '$timeout',
1666
+ 'isite',
1667
+ function ($interval, $timeout, isite) {
1668
+ return {
1669
+ restrict: 'E',
1670
+ require: 'ngModel',
1671
+ scope: {
1672
+ v: '@',
1673
+ label: '@',
1674
+ display: '@',
1675
+ display2: '@',
1676
+ disabled: '@',
1677
+ space: '@',
1678
+ primary: '@',
1679
+ ngValue: '@',
1680
+ ngChange: '&',
1681
+ ngClick: '&',
1682
+ ngAdd: '&',
1683
+ ngEdit: '&',
1684
+ ngDelete: '&',
1685
+ ngModel: '=',
1686
+ ngSearch: '=',
1687
+ nodes: '=',
1688
+ nodes: '=',
1689
+ },
1690
+ link: function ($scope, element, attrs, ctrl) {
1691
+ attrs.display = attrs.display || 'name';
1692
+ attrs.primary = attrs.primary || 'id';
1693
+ attrs.space = attrs.space || ' ';
1694
+ attrs.ngValue = attrs.ngValue || '';
1695
+ $scope.nodes = $scope.nodes || [];
1696
+
1697
+ $scope.v_nodes = [];
1698
+
1699
+ $scope.$watch('nodes', (nodes) => {
1700
+ $scope.v_nodes = [];
1701
+ if (nodes) {
1702
+ nodes.forEach((node, i) => {
1703
+ if (node.nodes) {
1704
+ node.nodes.forEach((node2, i) => {
1705
+ node2.$parent_id = node2.parent_id || node.id;
1706
+ node2.v_display = node.v_display || ' ';
1707
+ node2.v_display += ' - ' + node2[attrs.display];
1708
+ });
1709
+ }
1710
+ });
1711
+ }
1712
+ });
1713
+
1714
+ $scope.updateParentModal = function (parent, node) {
1715
+ if (parent) {
1716
+ parent.ngModel = node;
1717
+ if (parent.$parent) {
1718
+ $scope.updateParentModal(parent.$parent, node);
1719
+ }
1720
+ }
1721
+ };
1722
+
1723
+ $scope.unSelectParent = function (parent) {
1724
+ if (parent && parent.nodes) {
1725
+ parent.nodes.forEach((node) => {
1726
+ node.$selected = !1;
1727
+ });
1728
+ if (parent.$parent) {
1729
+ $scope.unSelectParent(parent.$parent);
1730
+ }
1731
+ }
1732
+ };
1733
+
1734
+ $scope.unSelectNodes = function (nodes) {
1735
+ if (nodes) {
1736
+ nodes.forEach((node) => {
1737
+ node.$selected = !1;
1738
+ if (node.nodes) {
1739
+ $scope.unSelectNodes(node.nodes);
1740
+ }
1741
+ });
1742
+ }
1743
+ };
1744
+
1745
+ $scope.updateModal = function (node) {
1746
+ $scope.ngModel = node;
1747
+ $scope.updateParentModal($scope.$parent, node);
1748
+ };
1749
+
1750
+ $scope.selected = function (node) {
1751
+ $scope.unSelectParent($scope.$parent);
1752
+ $scope.unSelectNodes($scope.nodes);
1753
+
1754
+ if (node.nodes) {
1755
+ node.nodes.forEach((itm) => {
1756
+ itm.$selected = !1;
1757
+ });
1758
+ }
1759
+
1760
+ node.$selected = !0;
1761
+ };
1762
+ },
1763
+ template: `
1764
+ <div class="treenode">
1765
+ <ul >
1766
+ <li ng-repeat="node in nodes" >
1767
+ <div class="row" ng-dblclick="$event.preventDefault();$event.stopPropagation();node.$actions = !0;source.$actions = !1" ng-mouseleave="node.$actions = !1">
1768
+ <span ng-show="node.nodes.length > 0" ng-click="node.$expand = !node.$expand;">
1769
+ <i ng-hide="node.$expand" class="fa fa-caret-left"></i> <i ng-show="node.$expand" class="fa fa-caret-down"></i>
1770
+ </span>
1771
+ <span ng-hide="node.nodes.length > 0" >
1772
+ <i class="fa fa-file"></i>
1773
+ </span>
1774
+
1775
+ <span class="text" ng-class="{'selected' : node.$selected == !0}" ng-click="ngClick($event , node);node.$expand = !node.$expand;selected(node);updateModal(node)" > {{node[display]}} </span>
1776
+ <div class="actions" ng-show="node.$actions === !0">
1777
+ <i-button type="add default" ng-click="ngAdd(node)"></i-button>
1778
+ <i-button type="edit default" ng-click="ngEdit(node)"></i-button>
1779
+ <i-button type="delete default" ng-click="ngDelete(node)"></i-button>
1780
+ </div>
1781
+ </div>
1782
+ <i-treenode display="{{display}}" ng-click="ngClick($event)" ng-add="ngAdd()" ng-edit="ngEdit()" ng-delete="ngDelete()" ng-show="node.$expand" ng-model="ngModel" nodes="node.nodes" nodes="node.nodes"></i-treenode>
1783
+ </li>
1784
+ </ul>
1785
+ </div>
1786
+ `,
1787
+ };
1788
+ },
1789
+ ]);