isite 2023.1.8 → 2023.8.10

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.
Files changed (38) hide show
  1. package/apps/charts/app.js +1 -1
  2. package/apps/charts/site_files/html/index.html +1 -1
  3. package/apps/charts/site_files/js/chart-animated.js +1 -20
  4. package/apps/charts/site_files/js/charts.js +1 -1
  5. package/apps/charts/site_files/js/custom.js +151 -153
  6. package/apps/client-side/app.js +39 -14
  7. package/apps/client-side/site_files/css/bootstrap5-addon.css +20 -8
  8. package/apps/client-side/site_files/css/effect.css +2 -2
  9. package/apps/client-side/site_files/css/font-awesome.css +6 -6
  10. package/apps/client-side/site_files/css/font-awesome.min.css +1 -1
  11. package/apps/client-side/site_files/css/layout.css +4 -4
  12. package/apps/client-side/site_files/css/modal.css +3 -3
  13. package/apps/client-side/site_files/css/print.css +1 -0
  14. package/apps/client-side/site_files/css/tabs.css +72 -68
  15. package/apps/client-side/site_files/css/treeview.css +49 -48
  16. package/apps/client-side/site_files/html/directive/i-date-old.html +24 -0
  17. package/apps/client-side/site_files/html/directive/i-date.html +19 -15
  18. package/apps/client-side/site_files/html/directive/i-datetime.html +11 -22
  19. package/apps/client-side/site_files/html/require_payments.html +11 -12
  20. package/apps/client-side/site_files/html/require_permissions.html +2 -2
  21. package/apps/client-side/site_files/html/words.html +66 -0
  22. package/apps/client-side/site_files/js/app.js +162 -0
  23. package/apps/client-side/site_files/js/bootstrap-5-directive.js +70 -106
  24. package/apps/client-side/site_files/js/directive-core.js +1 -7
  25. package/apps/client-side/site_files/js/site.js +11 -1
  26. package/index.js +6 -0
  27. package/lib/app.js +379 -0
  28. package/lib/collection.js +12 -4
  29. package/lib/data.js +1 -0
  30. package/lib/fsm.js +398 -387
  31. package/lib/mongodb.js +2 -1
  32. package/lib/parser.js +3 -3
  33. package/lib/routing.js +36 -25
  34. package/lib/security.js +9 -5
  35. package/lib/words.js +17 -30
  36. package/object-options/index.js +11 -11
  37. package/object-options/lib/fn.js +0 -30
  38. package/package.json +2 -1
@@ -1,83 +1,84 @@
1
1
  .treeview {
2
- color: var(--treeview-color);
3
- background: var(--treeview-background-color);
4
- user-select: none;
5
- -webkit-user-select: none;
6
- -moz-user-select: none;
7
- -ms-user-select: none;
2
+ color: var(--treeview-color);
3
+ background: var(--treeview-background-color);
4
+ user-select: none;
5
+ -webkit-user-select: none;
6
+ -moz-user-select: none;
7
+ -ms-user-select: none;
8
8
  }
9
- .treeview .main-node{
10
- display: block;
9
+ .treeview .main-node {
10
+ display: block;
11
11
  }
12
- .treeview .main-node > i{
13
- display: inline-block;
12
+ .treeview .main-node > i {
13
+ display: inline-block;
14
14
  }
15
- .treeview .main-node > h2{
16
- display: inline-block;
15
+ .treeview .main-node > h2 {
16
+ display: inline-block;
17
17
  }
18
- .treeview .main-node > i-button{
19
- display: inline-block;
18
+ .treeview .main-node > i-button {
19
+ display: inline-block;
20
20
  }
21
21
 
22
- .treeview i-treenode ul{
23
- transition: all linear .3s;
24
- -webkit-transition:all linear .3s;
22
+ .treeview i-treenode ul {
23
+ transition: all linear 0.3s;
24
+ -webkit-transition: all linear 0.3s;
25
25
  }
26
26
 
27
27
  .treeview i-treenode.ng-hide ul {
28
- opacity:0;
28
+ opacity: 0;
29
29
  }
30
30
 
31
31
  .treeview .actions {
32
- display: inline-block;
33
- width: auto;
32
+ display: inline-block;
33
+ width: auto;
34
34
  }
35
35
 
36
36
  .treeview ul {
37
- list-style: none;
38
- margin-top: 10px;
37
+ list-style: none;
38
+ margin-top: 10px;
39
39
  }
40
40
 
41
41
  .treeview .title {
42
- cursor: pointer;
43
- padding-bottom: 10px;
44
- font-size: 16px;
45
- font-weight: bold;
42
+ cursor: pointer;
43
+ padding-bottom: 10px;
44
+ font-size: 16px;
45
+ font-weight: bold;
46
46
  }
47
47
 
48
48
  .treeview .display {
49
- color: var(--treeview-display-color);
49
+ color: var(--treeview-display-color);
50
50
  }
51
51
 
52
52
  .treenode li {
53
- display: block;
54
- margin: 10px;
55
- padding: 3px;
56
- cursor: pointer;
57
- border-left: 1px solid var(--treeview-border-color);
53
+ display: block;
54
+ margin: 10px;
55
+ padding: 3px;
56
+ cursor: pointer;
58
57
  }
59
58
  .ar .treenode li {
60
- border-right: 1px solid var(--treeview-border-color);
59
+ border-right: 1px solid var(--treeview-border-color);
60
+ }
61
+ .en .treenode li {
62
+ border-left: 1px solid var(--treeview-border-color);
61
63
  }
62
-
63
64
  .treenode li span {
64
- font-size: 14px;
65
- font-weight: bold;
66
- cursor: pointer;
67
- padding: 10px 10px;
68
- border-radius: 5px;
69
- transition: all ease-out .2s;
70
- -webkit-transition: all ease-out .2s;
71
- display: inline-block;
72
- width: auto;
65
+ font-size: 14px;
66
+ font-weight: bold;
67
+ cursor: pointer;
68
+ padding: 10px 10px;
69
+ border-radius: 5px;
70
+ transition: all ease-out 0.2s;
71
+ -webkit-transition: all ease-out 0.2s;
72
+ display: inline-block;
73
+ width: auto;
73
74
  }
74
75
 
75
76
  .treenode li span.text:hover {
76
- background: var(--treeview-background-color2);
77
- color: var(--treeview-color2);
77
+ background: var(--treeview-background-color2);
78
+ color: var(--treeview-color2);
78
79
  }
79
80
 
80
81
  .treenode li .selected {
81
- background: var(--treeview-background-color2);
82
- color: var(--treeview-color2);
83
- }
82
+ background: var(--treeview-background-color2);
83
+ color: var(--treeview-color2);
84
+ }
@@ -0,0 +1,24 @@
1
+ <div class="mb-3">
2
+ <label> {{label}} </label>
3
+ <div class="row" ng-hide="editOnly">
4
+ <p ng-click="editOnly = true" class="blue border padding pointer">
5
+ <span>{{model.selectedDay.name || '__'}} </span> / <span>{{model.selectedMonth.name || '______'}}</span> / <span>{{model.selectedYear.name || '____'}}</span>
6
+ </p>
7
+ </div>
8
+ <div class="row dashed padding margin" ng-show="editOnly">
9
+ <div class="col3">
10
+ <i-list label="{{dayTitle}}" v="{{v}}" items="days" ng-search="$selectedDay" ng-model="model.selectedDay"></i-list>
11
+ </div>
12
+ <div class="col4">
13
+ <i-list label="{{monthTitle}}" v="{{v}}" items="monthes" ng-search="$selectedMonth" ng-model="model.selectedMonth"></i-list>
14
+ </div>
15
+ <div class="col3">
16
+ <i-list label="{{yearTitle}}" v="{{v}}" items="years" ng-search="$selectedYear" ng-model="model.selectedYear" active-value="model.activeYear"></i-list>
17
+ </div>
18
+
19
+ <div class="col2">
20
+ <br />
21
+ <i-button type="save default" ng-click="updateDate()"></i-button>
22
+ </div>
23
+ </div>
24
+ </div>
@@ -1,24 +1,28 @@
1
1
  <div class="mb-3">
2
- <label> {{label}} </label>
2
+ <label for="{{id2}}" class="form-label"> <span class="red bold"> {{requird}} </span> {{label}}</label>
3
3
  <div class="row" ng-hide="editOnly">
4
- <p ng-click="editOnly = true" class="blue border padding pointer">
5
- <span>{{model.selectedDay.name || '__'}} </span> / <span>{{model.selectedMonth.name || '______'}}</span> / <span>{{model.selectedYear.name || '____'}}</span>
4
+ <p ng-click="editOnly = true" class="blue bold border padding pointer">
5
+ <span class="bold">{{model.selectedDay || '__'}} </span> <span class="orange"> / </span> <span class="bold">{{model.selectedMonth.name || '______'}}</span> <span class="orange"> / </span> <span class="bold">{{model.selectedYear || '____'}}</span>
6
6
  </p>
7
7
  </div>
8
- <div class="row dashed padding margin" ng-show="editOnly">
9
- <div class="col3">
10
- <i-list label="{{dayTitle}}" v="{{v}}" items="days" ng-search="$selectedDay" ng-model="model.selectedDay"></i-list>
8
+ <div class="row" ng-show="editOnly">
9
+ <div class="col10">
10
+ <input
11
+ id="{{id2}}"
12
+ ng-disabled="disabled"
13
+ autofocus
14
+ type="date"
15
+ ng-model="ngModel1"
16
+ ng-change="ngChange()"
17
+ ngKeydown="ngKeydown()"
18
+ class="form-control"
19
+ placeholder="{{placeholder}}"
20
+ aria-label="{{label}}"
21
+ />
11
22
  </div>
12
- <div class="col4">
13
- <i-list label="{{monthTitle}}" v="{{v}}" items="monthes" ng-search="$selectedMonth" ng-model="model.selectedMonth"></i-list>
14
- </div>
15
- <div class="col3">
16
- <i-list label="{{yearTitle}}" v="{{v}}" items="years" ng-search="$selectedYear" ng-model="model.selectedYear" active-value="model.activeYear"></i-list>
17
- </div>
18
-
19
23
  <div class="col2">
20
- <br />
21
- <i-button type="save default" ng-click="updateDate()"></i-button>
24
+ <i class="fas fa-save" ng-click="updateDate()"></i>
22
25
  </div>
26
+ <div class="invalid-feedback"></div>
23
27
  </div>
24
28
  </div>
@@ -1,32 +1,21 @@
1
1
  <div class="mb-3">
2
- <label> {{label}} </label>
2
+ <label for="{{id2}}" class="form-label"> <span class="red bold"> {{requird}} </span> {{label}}</label>
3
3
  <div class="row" ng-hide="editOnly">
4
- <p ng-click="editOnly = true" class="blue border padding pointer">
5
- <span>{{model.selectedDay.name || '__'}} </span> / <span>{{model.selectedMonth.name || '______'}}</span> / <span>{{model.selectedYear.name || '____'}}</span> <span class="bold green">{{model.selectedHour.name || '--'}} </span> :
6
- <span class="bold green">{{model.selectedMinute.name || '--'}}</span>
4
+ <p ng-click="editOnly = true" class="blue border padding pointer">
5
+ <span class="bold">{{model.selectedDay || '__'}} </span> <span class="orange"> / </span> <span class="bold">{{model.selectedMonth.name || '______'}}</span> <span class="orange"> / </span> <span class="bold">{{model.selectedYear || '____'}}</span>
6
+ <span class="black left-10"> ( </span> <span class="bold green">{{model.selectedHour || '__'}}</span> <span class="orange"> : </span> <span class="green bold">{{model.selectedMinute || '__'}} </span> <span class="black"> ) </span>
7
7
  </p>
8
8
  </div>
9
- <div class="row dashed padding margin" ng-show="editOnly">
10
- <div class="col2">
11
- <i-list label="{{dayTitle}}" items="days" ng-search="$selectedDay" ng-model="model.selectedDay"></i-list>
12
- </div>
13
- <div class="col3">
14
- <i-list label="{{monthTitle}}" items="monthes" ng-search="$selectedMonth" ng-model="model.selectedMonth"></i-list>
9
+ <div class="row" ng-show="editOnly">
10
+ <div class="col6">
11
+ <input id="date_{{id2}}" ng-disabled="disabled" autofocus type="date" ng-model="ngModel1" class="form-control" aria-label="{{label}}" />
15
12
  </div>
16
- <div class="col3">
17
- <i-list label="{{yearTitle}}" items="years" ng-search="$selectedYear" ng-model="model.selectedYear"></i-list>
13
+ <div class="col4">
14
+ <input id="time_{{id2}}" ng-disabled="disabled" autofocus min="00:00" max="23:59" type="time" ng-model="ngModel2" class="form-control" aria-label="{{label}}" />
18
15
  </div>
19
-
20
16
  <div class="col2">
21
- <i-list label="{{hourTitle}}" items="hours" ng-search="$selectedHour" ng-model="model.selectedHour"></i-list>
22
- </div>
23
- <div class="col2">
24
- <i-list label="{{minuteTitle}}" items="minutes" ng-search="$selectedMinute" ng-model="model.selectedMinute"></i-list>
25
- </div>
26
- <div class="row">
27
- <br />
28
- <i-button type="save default" ng-click="updateDate()"></i-button>
17
+ <i class="fas fa-save" ng-click="updateDate()"></i>
29
18
  </div>
19
+ <div class="invalid-feedback"></div>
30
20
  </div>
31
- <div class="invalid-feedback"></div>
32
21
  </div>
@@ -1,16 +1,15 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>Require Payments</title>
7
- <link rel="stylesheet" href="/x-css/all.css" />
8
- </head>
9
- <body>
10
- <h1 class="center bold red">Require Payments</h1>
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Server Error</title>
7
+ <link rel="stylesheet" href="/x-css/all.css" />
8
+ </head>
9
+ <body>
10
+ <h1 class="text-center bold red">DNS Server Error</h1>
11
11
 
12
- <br /><br />
13
- <p>call us on facebook <a href="https://www.facebook.com/SmartCodeCompany"> Smart Code Company Page </a></p>
14
- <p>call us on what's up ( +966568118373 )</p>
15
- </body>
12
+ <br /><br />
13
+ <h2 class="text-center">Call Site Administrator or Development Team</h2>
14
+ </body>
16
15
  </html>
@@ -7,7 +7,7 @@
7
7
  <link rel="stylesheet" href="/x-css/all.css" />
8
8
  </head>
9
9
  <body>
10
- <h1 class="center bold red">Require Permissions</h1>
11
- <h2 class="center">##data.permissions##</h2>
10
+ <h1 class="text-center bold red">Require Permissions</h1>
11
+ <h2 class="text-center">##data.permissions##</h2>
12
12
  </body>
13
13
  </html>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" ng-app="myApp">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Document</title>
7
+ <link rel="stylesheet" href="/x-css/bootstrap-5-support.css" />
8
+ </head>
9
+ <body ng-controller="mainController" class="container loaded">
10
+ <h1 class="center">##word.counts## : {{words.length}}</h1>
11
+ <div class="row padding margin border">
12
+ <div class="col9">
13
+ <i-control ng-model="nameSearch" label="Search Words"></i-control>
14
+ </div>
15
+ <div class="col3">
16
+ <i-button type="save" ng-click="saveWords()" label="Save All Words"></i-button>
17
+ </div>
18
+ </div>
19
+
20
+ <table class="table">
21
+ <tr>
22
+ <th>ID</th>
23
+ <th>Name</th>
24
+ <th>En</th>
25
+ <th>Ar</th>
26
+ </tr>
27
+ <tr ng-repeat="word in words | filter:nameSearch">
28
+ <td>{{$index+1}}</td>
29
+ <td>{{word.name}}</td>
30
+ <td>
31
+ <i-control ng-model="word.En"></i-control>
32
+ </td>
33
+ <td><i-control ng-model="word.Ar"></i-control></td>
34
+ </tr>
35
+ </table>
36
+
37
+ <script src="/x-js/bootstrap-5-support.js"></script>
38
+ <script>
39
+ site.connectScope({}, ($scope, $http) => {
40
+ $scope.name = 'Amr Barakat';
41
+ $scope.loadWords = function () {
42
+ $http({
43
+ method: 'get',
44
+ url: '/x-api/words',
45
+ }).then(function (response) {
46
+ if (response.data.done) {
47
+ $scope.words = response.data.words;
48
+ }
49
+ });
50
+ };
51
+ $scope.saveWords = function () {
52
+ $http({
53
+ method: 'POST',
54
+ url: '/x-api/words/save',
55
+ data: $scope.words,
56
+ }).then(function (response) {
57
+ if (response.data.done) {
58
+ console.log(response.data);
59
+ }
60
+ });
61
+ };
62
+ $scope.loadWords();
63
+ });
64
+ </script>
65
+ </body>
66
+ </html>
@@ -2,3 +2,165 @@ var app = angular.module('myApp', []);
2
2
  app.config(function ($sceDelegateProvider) {
3
3
  $sceDelegateProvider.resourceUrlWhitelist(['self', 'https://www.youtube.com/**']);
4
4
  });
5
+
6
+ site.connectScope = app.connectScope = function (_scope, callback) {
7
+ if (!_scope) {
8
+ _scope = {};
9
+ }
10
+ if (!_scope.name) {
11
+ if ((elem = document.querySelector('[ng-controller]'))) {
12
+ _scope.name = elem.getAttribute('ng-controller');
13
+ } else {
14
+ _scope.name = 'mainController';
15
+ }
16
+ }
17
+ if (!_scope.app) {
18
+ _scope.app = _scope.name;
19
+ }
20
+ if (typeof _scope.app === 'string') {
21
+ _scope.apps = [{ name: _scope.app, as: _scope.app, modal: '#' + _scope.app + 'Modal' }];
22
+ }
23
+ if (typeof _scope.app === 'object') {
24
+ _scope.apps = [{ ..._scope.app }];
25
+ }
26
+ if (Array.isArray(_scope.app)) {
27
+ _scope.apps = [..._scope.app];
28
+ }
29
+
30
+ app.controller(_scope.name, function ($scope, $http, $timeout, $interval) {
31
+ $scope.onError = function () {};
32
+ if (Array.isArray(_scope.apps)) {
33
+ _scope.apps.forEach((_app, index) => {
34
+ $scope[_app.as + 'DefaultItem'] = {};
35
+ $scope[_app.as + 'Item'] = {};
36
+ $scope[_app.as + 'List'] = [];
37
+
38
+ $scope[_app.as + 'Display'] = function () {
39
+ $scope.error = '';
40
+ $scope[_app.as + 'Item'] = { ...$scope[_app.as + 'DefaultItem'] };
41
+ site.showModal(_app.modal);
42
+ };
43
+
44
+ $scope[_app.as + 'Add'] = function () {
45
+ $scope.error = '';
46
+ const v = site.validated(_app.modal);
47
+ if (!v.ok) {
48
+ $scope.error = v.messages[0].ar;
49
+ return;
50
+ }
51
+ $scope.busy = true;
52
+ $http({
53
+ method: 'POST',
54
+ url: `/api/${_app.name}/add`,
55
+ data: $scope[_app.as + 'Item'],
56
+ }).then(
57
+ function (response) {
58
+ $scope.busy = false;
59
+ if (response.data.done) {
60
+ $scope[_app.as + 'List'].push(response.data.doc);
61
+ $scope[_app.as + 'Item'] = { ...$scope[_app.as + 'DefaultItem'] };
62
+ } else {
63
+ $scope.error = 'Please Login First';
64
+ }
65
+ },
66
+ function (err) {
67
+ $scope.onError({ error: err, func: _app.as + 'Add' });
68
+ }
69
+ );
70
+ };
71
+ $scope[_app.as + 'Update'] = function (selectedItem) {
72
+ $scope.error = '';
73
+ const v = site.validated(_app.modal);
74
+ if (!v.ok) {
75
+ $scope.error = v.messages[0].ar;
76
+ return;
77
+ }
78
+ $scope.busy = true;
79
+ $http({
80
+ method: 'POST',
81
+ url: `/api/${_app.name}/update`,
82
+ data: selectedItem,
83
+ }).then(
84
+ function (response) {
85
+ $scope.busy = false;
86
+ if (response.data.done) {
87
+ let index = $scope[_app.as + 'List'].findIndex((ss) => ss.id === selectedItem.id);
88
+ if (index > -1) {
89
+ $scope[_app.as + 'List'][index] = response.data.doc;
90
+ }
91
+ $scope[_app.as + 'Item'] = { ...$scope[_app.as + 'DefaultItem'] };
92
+ } else {
93
+ $scope.error = 'Please Login First';
94
+ }
95
+ },
96
+ function (err) {
97
+ $scope.onError({ error: err, func: _app.as + 'Update' });
98
+ }
99
+ );
100
+ };
101
+ $scope[_app.as + 'Delete'] = function (selectedItem) {
102
+ $scope.error = '';
103
+ const v = site.validated(_app.modal);
104
+ if (!v.ok) {
105
+ $scope.error = v.messages[0].ar;
106
+ return;
107
+ }
108
+ $scope.busy = true;
109
+ $http({
110
+ method: 'POST',
111
+ url: `/api/${_app.name}/delete`,
112
+ data: selectedItem,
113
+ }).then(
114
+ function (response) {
115
+ $scope.busy = false;
116
+ if (response.data.done) {
117
+ let index = $scope[_app.as + 'List'].findIndex((ss) => ss.id === selectedItem.id);
118
+ if (index > -1) {
119
+ $scope[_app.as + 'List'].splice(index, 1);
120
+ }
121
+ } else {
122
+ $scope.error = 'Please Login First';
123
+ }
124
+ },
125
+ function (err) {
126
+ $scope.onError({ error: err, func: _app.as + 'Delete' });
127
+ }
128
+ );
129
+ };
130
+ $scope[_app.as + 'LoadAll'] = function () {
131
+ $scope.busy = true;
132
+ $http({
133
+ method: 'POST',
134
+ url: `/api/${_app.name}/all`,
135
+ data: {
136
+ where: {},
137
+ select: {},
138
+ },
139
+ }).then(
140
+ function (response) {
141
+ $scope.busy = false;
142
+ if (response.data.done && response.data.list.length > 0) {
143
+ $scope[_app.as + 'List'] = response.data.list;
144
+ }
145
+ },
146
+ function (err) {
147
+ $scope.busy = false;
148
+ $scope.onError({ error: err, func: _app.as + 'LoadAll' });
149
+ }
150
+ );
151
+ };
152
+
153
+ if (index === 0) {
154
+ $scope.display = $scope[_app.as + 'Display'];
155
+ $scope.add = $scope[_app.as + 'Add'];
156
+ $scope.update = $scope[_app.as + 'Update'];
157
+ $scope.delete = $scope[_app.as + 'Delete'];
158
+ $scope.loadAll = $scope[_app.as + 'LoadAll'];
159
+ }
160
+ });
161
+ }
162
+ if (callback) {
163
+ callback($scope, $http, $timeout, $interval);
164
+ }
165
+ });
166
+ };