innoboxrr-react-datatable 2.0.0 → 2.2.0

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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "innoboxrr-react-datatable",
3
- "version": "2.0.0",
3
+ "version": "2.2.0",
4
4
  "description": "Gemelo React de innoboxrr-vue-datatable: el mismo contrato de modelo, la misma tabla.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -37,10 +37,11 @@
37
37
  "node": ">=20"
38
38
  },
39
39
  "dependencies": {
40
+ "@iconify/react": "^6.0.0",
40
41
  "axios": "^1.7.0"
41
42
  },
42
43
  "peerDependencies": {
43
- "innoboxrr-form-core": "^2.0.0",
44
+ "innoboxrr-form-core": "^2.2.0",
44
45
  "react": "^19.0.0",
45
46
  "react-dom": "^19.0.0",
46
47
  "react-router-dom": "^7.0.0"
@@ -0,0 +1,39 @@
1
+ import { useSyncExternalStore } from 'react'
2
+ import { Icon } from '@iconify/react'
3
+ import { iconFor, onIconChange } from 'innoboxrr-form-core'
4
+
5
+ /**
6
+ * El icono de una accion de la tabla.
7
+ *
8
+ * Antes cada componente pintaba `<span class="uk-icon" uk-icon="icon: fa-plus">`
9
+ * por su cuenta. Para que ese icono apareciera hacian falta tres dependencias
10
+ * que ningun package.json declaraba: uikit, fontawesome y uikit-custom-icons,
11
+ * que hacia de puente entre las dos.
12
+ *
13
+ * Ahora el nombre se resuelve contra el mapa de innoboxrr-form-core, el mismo
14
+ * que usa la rama Vue.
15
+ *
16
+ * @param {{ icon: string, ratio?: number }} props
17
+ */
18
+ export default function DatatableIcon({ icon, ratio = 1 }) {
19
+ // useSyncExternalStore es la forma correcta de leer estado que vive fuera
20
+ // de React: un `setIcons()` en caliente repinta lo ya montado.
21
+ const resolved = useSyncExternalStore(
22
+ onIconChange,
23
+ () => iconFor(icon),
24
+ () => iconFor(icon)
25
+ )
26
+
27
+ // `ratio` era el multiplicador de UIkit sobre 16px. Se conserva para no
28
+ // romper a quien ya lo pasa.
29
+ const size = ratio * 16
30
+
31
+ return (
32
+ <Icon
33
+ className="fe-mr-sm"
34
+ icon={resolved}
35
+ width={size}
36
+ height={size}
37
+ aria-hidden="true" />
38
+ )
39
+ }
@@ -1,3 +1,5 @@
1
+ import DatatableIcon from './DatatableIcon.jsx'
2
+
1
3
  /**
2
4
  * Gemelo de DisabledLinkComponent.vue: la acción que el usuario no puede
3
5
  * ejecutar. Se sigue mostrando, deshabilitada, para que la interfaz no cambie
@@ -11,9 +13,10 @@ export default function DisabledLinkComponent({ icon = '', text }) {
11
13
  href="#"
12
14
  aria-disabled="true"
13
15
  className="disabled-link block px-4 py-2 dark:hover:text-white dark:text-slate-400"
14
- uk-tooltip="title: This action is not authorized; pos:right"
16
+ data-tooltip="This action is not authorized"
17
+ data-tooltip-pos="right"
15
18
  onClick={(event) => event.preventDefault()}>
16
- {showIcon ? <span className="fe-mr-sm uk-icon" uk-icon={icon}></span> : null}
19
+ {showIcon ? <DatatableIcon icon={icon} /> : null}
17
20
  <span>{text}</span>
18
21
  </a>
19
22
  )
@@ -1,3 +1,5 @@
1
+ import DatatableIcon from './DatatableIcon.jsx'
2
+
1
3
  /**
2
4
  * Gemelo de IconLinkComponent.vue.
3
5
  */
@@ -16,10 +18,7 @@ export default function IconLinkComponent({
16
18
  href={link}
17
19
  target={target}
18
20
  onClick={onClick}>
19
- <span
20
- className="fe-mr-sm uk-icon"
21
- uk-icon={`icon: ${icon}; ratio: ${ratio};`}
22
- style={{ fontSize: `${ratio * 16}px` }}></span>
21
+ <DatatableIcon icon={icon} ratio={ratio} />
23
22
  <span className={textClass}>{text}</span>
24
23
  </a>
25
24
  )
@@ -1,5 +1,6 @@
1
1
  import { Link } from 'react-router-dom'
2
2
  import { buildPath } from '../routes.js'
3
+ import DatatableIcon from './DatatableIcon.jsx'
3
4
 
4
5
  /**
5
6
  * Gemelo de IconRouteComponent.vue.
@@ -23,10 +24,7 @@ export default function IconRouteComponent({
23
24
  <Link
24
25
  to={buildPath(name, params, query)}
25
26
  className="block px-4 py-2 dark:hover:text-white dark:text-slate-400">
26
- <span
27
- className="fe-mr-sm uk-icon"
28
- uk-icon={`icon: ${icon}; ratio: ${ratio};`}
29
- style={{ fontSize: `${ratio * 16}px` }}></span>
27
+ <DatatableIcon icon={icon} ratio={ratio} />
30
28
  <span className={textClass}>{text}</span>
31
29
  </Link>
32
30
  )