@visns-studio/visns-components 1.7.1 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/crm/visns-data-grid.jsx +1735 -1735
- package/components/crm/visns-navigation.jsx +264 -262
- package/package.json +1 -1
|
@@ -1,298 +1,300 @@
|
|
|
1
1
|
import React, { useEffect, useState } from "react";
|
|
2
2
|
import { Link, useLocation, useNavigate } from "react-router-dom";
|
|
3
3
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
4
|
+
ArrowCycle,
|
|
5
|
+
BookClose,
|
|
6
|
+
Briefcase,
|
|
7
|
+
Bug,
|
|
8
|
+
Calendar,
|
|
9
|
+
Clipboard,
|
|
10
|
+
DoubleSword,
|
|
11
|
+
Draft,
|
|
12
|
+
Grid,
|
|
13
|
+
Home,
|
|
14
|
+
LightBulb,
|
|
15
|
+
Newspaper,
|
|
16
|
+
PeopleGroup,
|
|
17
|
+
PeopleMultiple,
|
|
18
|
+
Person,
|
|
19
|
+
SettingsVertical,
|
|
20
|
+
SignOut,
|
|
21
|
+
Shield,
|
|
22
|
+
StatisticUp,
|
|
23
|
+
Ticket,
|
|
24
|
+
Utensils,
|
|
24
25
|
} from "akar-icons";
|
|
25
26
|
|
|
26
27
|
import CustomFetch from "./visns-fetch";
|
|
27
28
|
import Notification from "./visns-notification";
|
|
28
29
|
|
|
29
30
|
function Navigation({ logo, logout, navConfig, setSystemAuth, userProfile }) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
const location = useLocation();
|
|
32
|
+
const navigate = useNavigate();
|
|
33
|
+
const currentPage = location.pathname.substr(1) || "dashboard";
|
|
34
|
+
const [navData, setNavData] = useState(navConfig);
|
|
35
|
+
const [isScrolled, setIsScrolled] = useState(false);
|
|
36
|
+
const appNavClasses = `app-nav ${isScrolled ? "navscrolled" : ""}`;
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
const handleLogout = () => {
|
|
39
|
+
CustomFetch("/logout", "GET", {}, () => {
|
|
40
|
+
setSystemAuth(false);
|
|
41
|
+
navigate("/login");
|
|
42
|
+
});
|
|
43
|
+
};
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
45
|
+
const renderSetting = (n) => {
|
|
46
|
+
const iconComponents = {
|
|
47
|
+
bug: Bug,
|
|
48
|
+
calendar: Calendar,
|
|
49
|
+
person: Person,
|
|
50
|
+
shield: Shield,
|
|
51
|
+
signOut: SignOut,
|
|
52
|
+
};
|
|
52
53
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
54
|
+
if (n.id === "notifications") {
|
|
55
|
+
return (
|
|
56
|
+
<li>
|
|
57
|
+
<Notification setSystemAuth={setSystemAuth} />
|
|
58
|
+
</li>
|
|
59
|
+
);
|
|
60
|
+
} else if (n.id === "logout") {
|
|
61
|
+
const IconComponent = iconComponents[n.icon];
|
|
62
|
+
return (
|
|
63
|
+
<li>
|
|
64
|
+
<button
|
|
65
|
+
title={n.label}
|
|
66
|
+
data-tooltip-id="system-tooltip"
|
|
67
|
+
data-tooltip-content={n.label}
|
|
68
|
+
onClick={handleLogout}
|
|
69
|
+
>
|
|
70
|
+
<IconComponent size={19} strokeWidth={2} />
|
|
71
|
+
</button>
|
|
72
|
+
</li>
|
|
73
|
+
);
|
|
74
|
+
} else {
|
|
75
|
+
const IconComponent = iconComponents[n.icon];
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
77
|
+
return (
|
|
78
|
+
<li>
|
|
79
|
+
<Link
|
|
80
|
+
to={n.url}
|
|
81
|
+
data-tooltip-id="system-tooltip"
|
|
82
|
+
data-tooltip-content={n.label}
|
|
83
|
+
className="tooltip"
|
|
84
|
+
target={n.target ? n.target : "_self"}
|
|
85
|
+
>
|
|
86
|
+
<IconComponent size={19} strokeWidth={2} />
|
|
87
|
+
</Link>
|
|
88
|
+
</li>
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
91
92
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
93
|
+
const renderNav = (n) => {
|
|
94
|
+
const iconComponents = {
|
|
95
|
+
arrowCycle: ArrowCycle,
|
|
96
|
+
bookClose: BookClose,
|
|
97
|
+
briefcase: Briefcase,
|
|
98
|
+
calendar: Calendar,
|
|
99
|
+
clipboard: Clipboard,
|
|
100
|
+
doubleSword: DoubleSword,
|
|
101
|
+
draft: Draft,
|
|
102
|
+
grid: Grid,
|
|
103
|
+
home: Home,
|
|
104
|
+
lightBulb: LightBulb,
|
|
105
|
+
newspaper: Newspaper,
|
|
106
|
+
peopleGroup: PeopleGroup,
|
|
107
|
+
peopleMultiple: PeopleMultiple,
|
|
108
|
+
settingsVertical: SettingsVertical,
|
|
109
|
+
statisticUp: StatisticUp,
|
|
110
|
+
ticket: Ticket,
|
|
111
|
+
utensils: Utensils,
|
|
112
|
+
};
|
|
111
113
|
|
|
112
|
-
|
|
114
|
+
const IconComponent = iconComponents[n.icon];
|
|
113
115
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
116
|
+
const renderChildren = () => {
|
|
117
|
+
if (n.children && n.children.length > 0) {
|
|
118
|
+
return (
|
|
119
|
+
<ul>
|
|
120
|
+
{n.children.map(
|
|
121
|
+
(child, childKey) =>
|
|
122
|
+
child.permission === true && (
|
|
123
|
+
<li
|
|
124
|
+
className="sub-nav-item"
|
|
125
|
+
key={`nav-child-${childKey}`}
|
|
126
|
+
>
|
|
127
|
+
<Link
|
|
128
|
+
to={child.url}
|
|
129
|
+
title={child.label}
|
|
130
|
+
>
|
|
131
|
+
{child.label}
|
|
132
|
+
</Link>
|
|
133
|
+
</li>
|
|
134
|
+
)
|
|
135
|
+
)}
|
|
136
|
+
</ul>
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
};
|
|
139
141
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
142
|
+
return (
|
|
143
|
+
<li className={n.class}>
|
|
144
|
+
{n.url ? (
|
|
145
|
+
<Link to={n.url}>
|
|
146
|
+
<IconComponent strokeWidth={2} size={18} />
|
|
147
|
+
{n.label}
|
|
148
|
+
</Link>
|
|
149
|
+
) : (
|
|
150
|
+
<span title={n.label}>
|
|
151
|
+
<IconComponent strokeWidth={2} size={18} />
|
|
152
|
+
{n.label}
|
|
153
|
+
</span>
|
|
154
|
+
)}
|
|
155
|
+
{renderChildren()}
|
|
156
|
+
</li>
|
|
157
|
+
);
|
|
158
|
+
};
|
|
157
159
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
const permissions = userProfile.roles[0].permissions.map(
|
|
162
|
+
(permission) => permission.name
|
|
163
|
+
);
|
|
162
164
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
165
|
+
setNavData((prevNavData) => {
|
|
166
|
+
const updatePermissions = (nav) => {
|
|
167
|
+
if (nav.children && nav.children.length > 0) {
|
|
168
|
+
const updatedChildren = nav.children
|
|
169
|
+
.map(updatePermissions)
|
|
170
|
+
.filter(Boolean);
|
|
171
|
+
const childPermission = updatedChildren.length > 0;
|
|
170
172
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
173
|
+
if (nav.permissionKey) {
|
|
174
|
+
const matchingPermission = permissions.includes(
|
|
175
|
+
nav.permissionKey
|
|
176
|
+
);
|
|
175
177
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
178
|
+
return {
|
|
179
|
+
...nav,
|
|
180
|
+
permission: matchingPermission,
|
|
181
|
+
children: updatedChildren,
|
|
182
|
+
};
|
|
183
|
+
} else {
|
|
184
|
+
return {
|
|
185
|
+
...nav,
|
|
186
|
+
permission: childPermission,
|
|
187
|
+
children: updatedChildren,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
189
191
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
192
|
+
if (nav.permissionKey) {
|
|
193
|
+
const matchingPermission = permissions.includes(
|
|
194
|
+
nav.permissionKey
|
|
195
|
+
);
|
|
194
196
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
197
|
+
return {
|
|
198
|
+
...nav,
|
|
199
|
+
permission: matchingPermission,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
200
202
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
203
|
+
return {
|
|
204
|
+
...nav,
|
|
205
|
+
permission: true,
|
|
206
|
+
};
|
|
207
|
+
};
|
|
206
208
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
209
|
+
const updatedNavigations = prevNavData.navigations
|
|
210
|
+
.map(updatePermissions)
|
|
211
|
+
.filter(Boolean);
|
|
212
|
+
const updatedSettings = prevNavData.settings
|
|
213
|
+
.map(updatePermissions)
|
|
214
|
+
.filter(Boolean);
|
|
213
215
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
216
|
+
return {
|
|
217
|
+
...prevNavData,
|
|
218
|
+
navigations: updatedNavigations,
|
|
219
|
+
settings: updatedSettings,
|
|
220
|
+
};
|
|
221
|
+
});
|
|
222
|
+
}, [userProfile]);
|
|
221
223
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
224
|
+
useEffect(() => {
|
|
225
|
+
setNavData((prevNavData) => {
|
|
226
|
+
const updateNavItems = (nav) => {
|
|
227
|
+
const cleanUrl = (url) => {
|
|
228
|
+
return url && url.startsWith("/") ? url.substr(1) : url;
|
|
229
|
+
};
|
|
228
230
|
|
|
229
|
-
|
|
231
|
+
const currentUrl = cleanUrl(currentPage);
|
|
230
232
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
233
|
+
if (
|
|
234
|
+
cleanUrl(nav.url) === currentUrl ||
|
|
235
|
+
(nav.children &&
|
|
236
|
+
nav.children.some(
|
|
237
|
+
(child) => cleanUrl(child.url) === currentUrl
|
|
238
|
+
))
|
|
239
|
+
) {
|
|
240
|
+
return { ...nav, class: "nav-item active" };
|
|
241
|
+
} else {
|
|
242
|
+
return { ...nav, class: "nav-item" };
|
|
243
|
+
}
|
|
244
|
+
};
|
|
243
245
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
246
|
+
return {
|
|
247
|
+
...prevNavData,
|
|
248
|
+
navigations: prevNavData.navigations.map(updateNavItems),
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
}, [currentPage]);
|
|
250
252
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
253
|
+
useEffect(() => {
|
|
254
|
+
function handleScroll() {
|
|
255
|
+
setIsScrolled(window.scrollY > 0);
|
|
256
|
+
}
|
|
255
257
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
258
|
+
window.addEventListener("scroll", handleScroll);
|
|
259
|
+
return () => {
|
|
260
|
+
window.removeEventListener("scroll", handleScroll);
|
|
261
|
+
};
|
|
262
|
+
}, []);
|
|
261
263
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
264
|
+
return (
|
|
265
|
+
<header className="header">
|
|
266
|
+
<div className="hwrap">
|
|
267
|
+
<div className="logo">
|
|
268
|
+
<Link to="/">
|
|
269
|
+
<img src={logo} alt="Visns Studio CRM" />
|
|
270
|
+
</Link>
|
|
271
|
+
</div>
|
|
272
|
+
<div className="navwrap">
|
|
273
|
+
<ul className={appNavClasses}>
|
|
274
|
+
{navData.navigations.map((nav, navKey) =>
|
|
275
|
+
nav.permission === true ||
|
|
276
|
+
nav.permissionKey === "" ? (
|
|
277
|
+
<React.Fragment key={`nav-item-${navKey}`}>
|
|
278
|
+
{renderNav(nav)}
|
|
279
|
+
</React.Fragment>
|
|
280
|
+
) : null
|
|
281
|
+
)}
|
|
282
|
+
</ul>
|
|
283
|
+
</div>
|
|
284
|
+
<div className="hactions">
|
|
285
|
+
<ul>
|
|
286
|
+
{navData.settings.map((setting, settingKey) =>
|
|
287
|
+
setting.permission === true ? (
|
|
288
|
+
<React.Fragment key={`setting-${settingKey}`}>
|
|
289
|
+
{renderSetting(setting)}
|
|
290
|
+
</React.Fragment>
|
|
291
|
+
) : null
|
|
292
|
+
)}
|
|
293
|
+
</ul>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
</header>
|
|
297
|
+
);
|
|
296
298
|
}
|
|
297
299
|
|
|
298
300
|
export default Navigation;
|
package/package.json
CHANGED
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"react-dom": "^17.0.1"
|
|
35
35
|
},
|
|
36
36
|
"name": "@visns-studio/visns-components",
|
|
37
|
-
"version": "1.7.
|
|
37
|
+
"version": "1.7.2",
|
|
38
38
|
"description": "Various packages to assist in the development of our Custom Applications.",
|
|
39
39
|
"main": "index.js",
|
|
40
40
|
"devDependencies": {},
|