isite 2022.5.6 → 2022.8.1

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