@visns-studio/visns-components 5.7.5 → 5.7.7

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/package.json CHANGED
@@ -20,12 +20,12 @@
20
20
  "dayjs": "^1.11.13",
21
21
  "fabric": "^6.6.4",
22
22
  "file-saver": "^2.0.5",
23
- "framer-motion": "^12.9.2",
23
+ "framer-motion": "^12.9.4",
24
24
  "html-react-parser": "^5.2.3",
25
25
  "lodash": "^4.17.21",
26
26
  "lodash.debounce": "^4.0.8",
27
27
  "moment": "^2.30.1",
28
- "motion": "^12.9.2",
28
+ "motion": "^12.9.4",
29
29
  "numeral": "^2.0.6",
30
30
  "pluralize": "^8.0.0",
31
31
  "qrcode.react": "^4.2.0",
@@ -63,10 +63,10 @@
63
63
  "yet-another-react-lightbox": "^3.23.0"
64
64
  },
65
65
  "devDependencies": {
66
- "@babel/core": "^7.26.10",
67
- "@babel/plugin-transform-runtime": "^7.26.10",
68
- "@babel/preset-env": "^7.26.9",
69
- "@babel/preset-react": "^7.26.3",
66
+ "@babel/core": "^7.27.1",
67
+ "@babel/plugin-transform-runtime": "^7.27.1",
68
+ "@babel/preset-env": "^7.27.1",
69
+ "@babel/preset-react": "^7.27.1",
70
70
  "babel-loader": "^10.0.0",
71
71
  "copy-webpack-plugin": "^13.0.0",
72
72
  "css-loader": "^7.1.2",
@@ -82,7 +82,7 @@
82
82
  "react-dom": "^17.0.0 || ^18.0.0"
83
83
  },
84
84
  "name": "@visns-studio/visns-components",
85
- "version": "5.7.5",
85
+ "version": "5.7.7",
86
86
  "description": "Various packages to assist in the development of our Custom Applications.",
87
87
  "main": "src/index.js",
88
88
  "files": [
@@ -103,5 +103,5 @@
103
103
  "url": "https://github.com/visnsstudio/visns-components/issues"
104
104
  },
105
105
  "homepage": "https://github.com/visnsstudio/visns-components#readme",
106
- "packageManager": "yarn@4.8.1"
106
+ "packageManager": "yarn@4.9.1"
107
107
  }
@@ -7,6 +7,46 @@ import { Bell, CircleX, Check } from 'akar-icons';
7
7
  import CustomFetch from './Fetch';
8
8
  import styles from './styles/Notification.module.scss';
9
9
 
10
+ // Helper function to sanitize HTML content and remove unwanted styling from anchor tags
11
+ const sanitizeHtml = (html) => {
12
+ if (!html) return '';
13
+
14
+ // Create a temporary div to parse the HTML
15
+ const tempDiv = document.createElement('div');
16
+ tempDiv.innerHTML = html;
17
+
18
+ // Find all anchor tags and remove any styling attributes
19
+ const anchors = tempDiv.querySelectorAll('a');
20
+ anchors.forEach((anchor) => {
21
+ // Preserve href and target attributes, remove all others
22
+ const href = anchor.getAttribute('href');
23
+ const target = anchor.getAttribute('target');
24
+
25
+ // Clone the text content
26
+ const textContent = anchor.textContent;
27
+
28
+ // Create a clean anchor with only necessary attributes
29
+ const cleanAnchor = document.createElement('a');
30
+ cleanAnchor.textContent = textContent;
31
+
32
+ if (href) cleanAnchor.setAttribute('href', href);
33
+ if (target) cleanAnchor.setAttribute('target', target);
34
+
35
+ // Add a small icon after the link text to indicate it's a link
36
+ // We'll use CSS to style this instead of adding an actual icon
37
+ cleanAnchor.setAttribute('data-is-link', 'true');
38
+
39
+ // Set inline styles to ensure visibility against white background
40
+ cleanAnchor.style.color = '#0056b3';
41
+ cleanAnchor.style.fontWeight = '600';
42
+
43
+ // Replace the original anchor with the clean one
44
+ anchor.parentNode.replaceChild(cleanAnchor, anchor);
45
+ });
46
+
47
+ return tempDiv.innerHTML;
48
+ };
49
+
10
50
  function Notification(props) {
11
51
  const navigate = useNavigate();
12
52
  const wrapperRef = useRef(null);
@@ -290,7 +330,11 @@ function Notification(props) {
290
330
  <div
291
331
  className={styles.notiText}
292
332
  >
293
- {parse(item.data.label)}
333
+ {parse(
334
+ sanitizeHtml(
335
+ item.data.label
336
+ )
337
+ )}
294
338
  </div>
295
339
  <div
296
340
  className={styles.notiTime}
@@ -5,6 +5,7 @@ function TableFilter({
5
5
  filters,
6
6
  setFilters,
7
7
  setSettings,
8
+ settings,
8
9
  type,
9
10
  onFilterChange,
10
11
  }) {
@@ -165,15 +166,36 @@ function TableFilter({
165
166
  }
166
167
  // For non-parent filters (backward compatibility)
167
168
  else {
169
+ const updatedChildren = isParent
170
+ ? filter.children.map((child) => ({
171
+ ...child,
172
+ class: child.id === id ? 'subactivechildren' : '',
173
+ show: child.id === id,
174
+ active: child.id === id,
175
+ }))
176
+ : filter.children
177
+ ? filter.children.map((child, childKey) => ({
178
+ ...child,
179
+ class:
180
+ childKey === 0 && isActive
181
+ ? 'subactivechildren'
182
+ : '',
183
+ show: childKey === 0 && isActive,
184
+ active: childKey === 0 && isActive,
185
+ }))
186
+ : [];
187
+
168
188
  return {
169
189
  ...filter,
170
- class: isActive
171
- ? type === 'simple'
172
- ? 'activetab'
173
- : 'subactive'
174
- : '',
175
- show: isActive,
176
- active: isActive,
190
+ class:
191
+ isActive || isParent
192
+ ? type === 'simple'
193
+ ? 'activetab'
194
+ : 'subactive'
195
+ : '',
196
+ show: isActive || isParent,
197
+ active: isActive || isParent,
198
+ children: updatedChildren,
177
199
  };
178
200
  }
179
201
  };
@@ -199,27 +221,36 @@ function TableFilter({
199
221
  let updatedSettings = null;
200
222
 
201
223
  if (setSettings) {
202
- // For child items or non-parent items, we need to update the filter value
224
+ // For child items, non-parent items, or parent items with a value property
225
+ // we need to update the filter value
203
226
  if (
204
227
  filtertype === 'children' ||
205
228
  (filtertype === 'parent' &&
206
- !filters.find((f) => f.id === id && f.isParent))
229
+ (!filters.find((f) => f.id === id && f.isParent) ||
230
+ filters.find(
231
+ (f) => f.id === id && f.hasOwnProperty('value')
232
+ )))
207
233
  ) {
208
- // For child filters, we need to update the filter with the child's ID
234
+ // For filters, we need to update the filter with the ID and value
209
235
  const filterId = id;
210
236
  const filterValue = value || '';
211
237
 
212
238
  // Start with the current settings
213
- updatedSettings = { ...setSettings._currentValue };
239
+ // Check if _currentValue exists (React state setter) or use the object directly
240
+ updatedSettings = setSettings._currentValue
241
+ ? { ...setSettings._currentValue }
242
+ : { ...setSettings };
214
243
 
215
244
  if (updatedSettings.ajaxSetting) {
216
245
  // First, remove any existing filters that might conflict
217
- let _where = [...updatedSettings.ajaxSetting.where].filter(
218
- (item) => {
219
- // Keep items that don't match this filter ID
220
- return item.id !== filterId;
221
- }
222
- );
246
+ let _where = updatedSettings.ajaxSetting.where
247
+ ? [...updatedSettings.ajaxSetting.where].filter(
248
+ (item) => {
249
+ // Keep items that don't match this filter ID
250
+ return item.id !== filterId;
251
+ }
252
+ )
253
+ : [];
223
254
 
224
255
  // Add the new filter
225
256
  _where.push({ id: filterId, value: filterValue });
@@ -244,6 +275,15 @@ function TableFilter({
244
275
  w.push({ id: filterId, value: filterValue });
245
276
 
246
277
  updatedSettings = { ...updatedSettings, where: w };
278
+ } else {
279
+ // If neither ajaxSetting.where nor where exists, create a new ajaxSetting
280
+ updatedSettings = {
281
+ ...settings,
282
+ ajaxSetting: {
283
+ ...(settings.ajaxSetting || {}),
284
+ where: [{ id: filterId, value: filterValue }],
285
+ },
286
+ };
247
287
  }
248
288
  }
249
289
  }
@@ -576,6 +576,7 @@ function GenericIndex({
576
576
  filters={subnav}
577
577
  setFilters={setSubnav}
578
578
  setSettings={setConfig}
579
+ settings={config}
579
580
  type={layout}
580
581
  onFilterChange={handleFilterChange}
581
582
  />
@@ -598,6 +599,7 @@ function GenericIndex({
598
599
  filters={subnav}
599
600
  setFilters={setSubnav}
600
601
  setSettings={setConfig}
602
+ settings={config}
601
603
  type={layout}
602
604
  onFilterChange={handleFilterChange}
603
605
  />
@@ -158,18 +158,62 @@
158
158
  line-height: 1.4;
159
159
  margin-bottom: 4px;
160
160
  word-break: break-word;
161
+
162
+ /* Target all elements inside notiText to ensure proper styling */
163
+ * {
164
+ background: inherit;
165
+ border: none;
166
+ border-radius: 0;
167
+ padding: 0;
168
+ margin: 0;
169
+ display: inline;
170
+ box-shadow: none;
171
+ text-shadow: none;
172
+ white-space: normal;
173
+ }
161
174
  }
162
175
 
163
176
  .notiText a {
164
- color: var(--primary-color);
165
- font-weight: 500;
177
+ /* Use a darker color that will be visible against white background */
178
+ color: #0056b3 !important; /* Fallback if var(--primary-color) is too light */
179
+ font-weight: 600 !important; /* Make it slightly bolder */
166
180
  text-decoration: none;
167
- transition: color 0.2s;
181
+ transition: all 0.2s;
182
+ /* Reset any potential styling that could cause elliptical borders and white text */
183
+ background: transparent !important;
184
+ border: none !important;
185
+ border-radius: 0 !important;
186
+ padding: 0 !important;
187
+ margin: 0 !important;
188
+ display: inline !important;
189
+ box-shadow: none !important;
190
+ text-shadow: none !important;
191
+ white-space: normal !important;
192
+ /* Add subtle bottom border to indicate it's a link */
193
+ border-bottom: 1px dotted #0056b3 !important;
194
+ position: relative !important;
195
+ }
196
+
197
+ /* Add a small external link icon after links with data-is-link attribute */
198
+ .notiText a[data-is-link='true']::after {
199
+ content: '↗';
200
+ font-size: 10px;
201
+ position: relative;
202
+ top: -5px;
203
+ margin-left: 2px;
204
+ opacity: 0.9;
205
+ color: #0056b3 !important; /* Match the link color */
168
206
  }
169
207
 
170
208
  .notiText a:hover {
171
- color: var(--secondary-color);
172
- text-decoration: underline;
209
+ color: #003d80 !important; /* Darker shade for hover state */
210
+ text-decoration: none;
211
+ background: transparent !important;
212
+ border-bottom: 1px solid #003d80 !important;
213
+ }
214
+
215
+ .notiText a:hover[data-is-link='true']::after {
216
+ opacity: 1;
173
217
  }
174
218
 
175
219
  .notiTime {