@softdin/portal-admin 0.0.0-stage → 0.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.
Files changed (96) hide show
  1. package/README.md +95 -2
  2. package/dist-lib/chunks/AppLayout-COCPfLWo.js +303 -0
  3. package/dist-lib/chunks/AuditoriaView-Bcf_kOqI.js +643 -0
  4. package/dist-lib/chunks/CarnetView-BsdUtYeu.js +450 -0
  5. package/dist-lib/chunks/CarteleraView-CRnVjt-S.js +996 -0
  6. package/dist-lib/chunks/CertificadosView-DvHDflcN.js +549 -0
  7. package/dist-lib/chunks/ChatBandejaView-HqhdSw7G.js +274 -0
  8. package/dist-lib/chunks/ChatConfiguracionView-BdH5gDdR.js +716 -0
  9. package/dist-lib/chunks/ChatConocimientoView-nKTAKxFa.js +263 -0
  10. package/dist-lib/chunks/ChatConversacionView-Do74V09l.js +477 -0
  11. package/dist-lib/chunks/ChatInformeView-BIiAH9L_.js +280 -0
  12. package/dist-lib/chunks/ChatRespuestasView-QFXbyg8U.js +183 -0
  13. package/dist-lib/chunks/EmpleadosView-BtqrO5-8.js +311 -0
  14. package/dist-lib/chunks/HomologacionView-UCZk4u6R.js +949 -0
  15. package/dist-lib/chunks/IngresoSsoView-BKkcnrYO.js +98 -0
  16. package/dist-lib/chunks/SolicitudesView-CYPD2A1s.js +900 -0
  17. package/dist-lib/chunks/TiposSolicitudView-CrWTVizl.js +168 -0
  18. package/dist-lib/chunks/ToggleSwitch-BYrIyheq.js +55 -0
  19. package/dist-lib/chunks/_plugin-vue_export-helper-BOaGB7Aw.js +8 -0
  20. package/dist-lib/chunks/api-M7D1c3IT.js +97 -0
  21. package/dist-lib/chunks/apiError-BHGbwz97.js +15 -0
  22. package/dist-lib/chunks/auth.store-BrGKZg-7.js +220 -0
  23. package/dist-lib/chunks/chat.service-C7ZQf4w3.js +241 -0
  24. package/dist-lib/chunks/cliente-interno.store-De39VsEE.js +203 -0
  25. package/dist-lib/chunks/homologacion-CoeHD7cB.js +131 -0
  26. package/dist-lib/chunks/portal-empleado-6KQrnsQJ.js +120 -0
  27. package/dist-lib/chunks/tipos-D93bLfFC.js +22 -0
  28. package/dist-lib/portal-admin.js +196 -0
  29. package/dist-lib/style.css +4813 -0
  30. package/dist-lib/types/App.vue.d.ts +3 -0
  31. package/dist-lib/types/components/AppLayout.vue.d.ts +3 -0
  32. package/dist-lib/types/components/CarnetClientesInternos.vue.d.ts +11 -0
  33. package/dist-lib/types/components/InvitacionPortalModal.vue.d.ts +20 -0
  34. package/dist-lib/types/components/MenuUsuario.vue.d.ts +3 -0
  35. package/dist-lib/types/components/VistoBuenoPortalModal.vue.d.ts +23 -0
  36. package/dist-lib/types/components/auditoria/AuditoriaFila.vue.d.ts +16 -0
  37. package/dist-lib/types/components/auditoria/AuditoriaFiltros.vue.d.ts +30 -0
  38. package/dist-lib/types/components/auditoria/AuditoriaPaginador.vue.d.ts +14 -0
  39. package/dist-lib/types/components/cartelera/PaginaCarteleraImagen.vue.d.ts +14 -0
  40. package/dist-lib/types/components/cartelera/PublicacionFormModal.vue.d.ts +27 -0
  41. package/dist-lib/types/components/cartelera/VistaCelularCartelera.vue.d.ts +34 -0
  42. package/dist-lib/types/components/certificados/AtenderCertificadoModal.vue.d.ts +22 -0
  43. package/dist-lib/types/components/certificados/RechazarCertificadoModal.vue.d.ts +18 -0
  44. package/dist-lib/types/components/certificados/ResumenSolicitudCertificado.vue.d.ts +8 -0
  45. package/dist-lib/types/components/chat/ChatClientesInternos.vue.d.ts +21 -0
  46. package/dist-lib/types/components/chat/ChatHorarioCampos.vue.d.ts +21 -0
  47. package/dist-lib/types/components/forms/ExportExcelButton.vue.d.ts +30 -0
  48. package/dist-lib/types/components/forms/ToggleSwitch.vue.d.ts +17 -0
  49. package/dist-lib/types/components/homologacion/HomologacionFila.vue.d.ts +30 -0
  50. package/dist-lib/types/components/homologacion/TipoPermisoFormModal.vue.d.ts +26 -0
  51. package/dist-lib/types/components/homologacion/TipoSolicitudFormModal.vue.d.ts +27 -0
  52. package/dist-lib/types/lib/auditoria.d.ts +25 -0
  53. package/dist-lib/types/lib/cartelera-paginas.d.ts +26 -0
  54. package/dist-lib/types/lib/cartelera-vigencia.d.ts +3 -0
  55. package/dist-lib/types/lib/export-excel-csv.d.ts +4 -0
  56. package/dist-lib/types/lib/export-excel.d.ts +9 -0
  57. package/dist-lib/types/lib/exportar-listado.d.ts +68 -0
  58. package/dist-lib/types/lib/homologacion.d.ts +41 -0
  59. package/dist-lib/types/lib/portal-empleado.d.ts +32 -0
  60. package/dist-lib/types/modulo.d.ts +31 -0
  61. package/dist-lib/types/portal-admin/config.d.ts +17 -0
  62. package/dist-lib/types/portal-admin/rutas.d.ts +17 -0
  63. package/dist-lib/types/portal-admin/tipos.d.ts +68 -0
  64. package/dist-lib/types/router/index.d.ts +7 -0
  65. package/dist-lib/types/services/api.d.ts +29 -0
  66. package/dist-lib/types/services/auditoria.service.d.ts +63 -0
  67. package/dist-lib/types/services/auth.service.d.ts +61 -0
  68. package/dist-lib/types/services/carnet.service.d.ts +56 -0
  69. package/dist-lib/types/services/cartelera.service.d.ts +69 -0
  70. package/dist-lib/types/services/chat.service.d.ts +279 -0
  71. package/dist-lib/types/services/configuracion-cliente-interno.service.d.ts +23 -0
  72. package/dist-lib/types/services/homologacion.service.d.ts +105 -0
  73. package/dist-lib/types/services/portal-empleado.service.d.ts +112 -0
  74. package/dist-lib/types/services/solicitudes-certificado.service.d.ts +59 -0
  75. package/dist-lib/types/stores/auth.store.d.ts +125 -0
  76. package/dist-lib/types/stores/cliente-interno.store.d.ts +65 -0
  77. package/dist-lib/types/utils/apiError.d.ts +4 -0
  78. package/dist-lib/types/views/AuditoriaView.vue.d.ts +3 -0
  79. package/dist-lib/types/views/CarnetView.vue.d.ts +3 -0
  80. package/dist-lib/types/views/CarteleraView.vue.d.ts +3 -0
  81. package/dist-lib/types/views/CertificadosView.vue.d.ts +3 -0
  82. package/dist-lib/types/views/EmpleadosView.vue.d.ts +3 -0
  83. package/dist-lib/types/views/HomologacionView.vue.d.ts +4 -0
  84. package/dist-lib/types/views/IngresoSsoView.vue.d.ts +3 -0
  85. package/dist-lib/types/views/LoginView.vue.d.ts +3 -0
  86. package/dist-lib/types/views/OlvideView.vue.d.ts +3 -0
  87. package/dist-lib/types/views/RestablecerView.vue.d.ts +3 -0
  88. package/dist-lib/types/views/SolicitudesView.vue.d.ts +3 -0
  89. package/dist-lib/types/views/TiposSolicitudView.vue.d.ts +3 -0
  90. package/dist-lib/types/views/chat/ChatBandejaView.vue.d.ts +3 -0
  91. package/dist-lib/types/views/chat/ChatConfiguracionView.vue.d.ts +3 -0
  92. package/dist-lib/types/views/chat/ChatConocimientoView.vue.d.ts +3 -0
  93. package/dist-lib/types/views/chat/ChatConversacionView.vue.d.ts +11 -0
  94. package/dist-lib/types/views/chat/ChatInformeView.vue.d.ts +3 -0
  95. package/dist-lib/types/views/chat/ChatRespuestasView.vue.d.ts +3 -0
  96. package/package.json +66 -4
@@ -0,0 +1,311 @@
1
+ import { n as portalEmpleadosService, t as useClienteInternoStore } from "./cliente-interno.store-De39VsEE.js";
2
+ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BOaGB7Aw.js";
3
+ import { t as mensajeError } from "./apiError-BHGbwz97.js";
4
+ import { o as fechaCorta } from "./portal-empleado-6KQrnsQJ.js";
5
+ import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeModels, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderList, toDisplayString, unref, useModel, vModelText, watch, withDirectives, withModifiers } from "vue";
6
+ import FormCloseButton from "@softdin/shared/components/forms/FormCloseButton.vue";
7
+ import qrcode from "qrcode-generator";
8
+ import FormHelpButton from "@softdin/shared/components/forms/FormHelpButton.vue";
9
+ import FormHelpModal from "@softdin/shared/components/forms/FormHelpModal.vue";
10
+ //#region src/components/InvitacionPortalModal.vue?vue&type=script&setup=true&lang.ts
11
+ var _hoisted_1$1 = {
12
+ key: 0,
13
+ class: "modal-backdrop"
14
+ };
15
+ var _hoisted_2$1 = {
16
+ class: "modal-panel",
17
+ role: "dialog",
18
+ "aria-modal": "true",
19
+ "aria-labelledby": "invitacion-portal-titulo"
20
+ };
21
+ var _hoisted_3$1 = { class: "modal-header" };
22
+ var _hoisted_4$1 = { class: "modal-header-actions" };
23
+ var _hoisted_5$1 = { class: "modal-body" };
24
+ var _hoisted_6$1 = { class: "state-hint" };
25
+ var _hoisted_7$1 = {
26
+ key: 0,
27
+ class: "alert-error",
28
+ role: "alert"
29
+ };
30
+ var _hoisted_8$1 = {
31
+ key: 1,
32
+ class: "qr-box"
33
+ };
34
+ var _hoisted_9$1 = ["innerHTML"];
35
+ var _hoisted_10$1 = { class: "qr-text" };
36
+ var _hoisted_11$1 = { class: "qr-timer" };
37
+ var _hoisted_12$1 = {
38
+ key: 1,
39
+ class: "state-hint"
40
+ };
41
+ var _hoisted_13$1 = {
42
+ key: 2,
43
+ class: "alert-ok"
44
+ };
45
+ var _hoisted_14 = {
46
+ key: 3,
47
+ class: "alert-ok"
48
+ };
49
+ var _hoisted_15 = { class: "modal-footer" };
50
+ var _hoisted_16 = ["disabled"];
51
+ var _hoisted_17 = ["disabled"];
52
+ //#endregion
53
+ //#region src/components/InvitacionPortalModal.vue
54
+ var InvitacionPortalModal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
55
+ __name: "InvitacionPortalModal",
56
+ props: /*@__PURE__*/ mergeModels({
57
+ empleoId: {},
58
+ empleado: {}
59
+ }, {
60
+ "open": {
61
+ type: Boolean,
62
+ required: true
63
+ },
64
+ "openModifiers": {}
65
+ }),
66
+ emits: ["update:open"],
67
+ setup(__props) {
68
+ const props = __props;
69
+ const open = useModel(__props, "open");
70
+ const enviando = ref(null);
71
+ const error = ref(null);
72
+ const respuesta = ref(null);
73
+ const helpOpen = ref(false);
74
+ const ahora = ref(Date.now());
75
+ let reloj = null;
76
+ const qr = computed(() => respuesta.value?.estado === "qr" ? respuesta.value : null);
77
+ /** SVG del QR, generado en el navegador: el enlace no sale a ningún servicio externo. */
78
+ const qrSvg = computed(() => {
79
+ if (!qr.value) return "";
80
+ const codigo = qrcode(0, "M");
81
+ codigo.addData(qr.value.url);
82
+ codigo.make();
83
+ return codigo.createSvgTag({
84
+ cellSize: 6,
85
+ margin: 2,
86
+ scalable: true
87
+ });
88
+ });
89
+ const segundosRestantes = computed(() => qr.value ? Math.max(0, Math.round((Date.parse(qr.value.expira_en) - ahora.value) / 1e3)) : 0);
90
+ const vencido = computed(() => qr.value !== null && segundosRestantes.value === 0);
91
+ const tiempo = computed(() => {
92
+ const s = segundosRestantes.value;
93
+ return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, "0")}`;
94
+ });
95
+ watch(open, (abierto) => {
96
+ if (abierto) {
97
+ respuesta.value = null;
98
+ error.value = null;
99
+ } else respuesta.value = null;
100
+ });
101
+ watch(qr, (valor) => {
102
+ if (reloj) clearInterval(reloj);
103
+ reloj = valor ? setInterval(() => ahora.value = Date.now(), 1e3) : null;
104
+ });
105
+ onBeforeUnmount(() => {
106
+ if (reloj) clearInterval(reloj);
107
+ });
108
+ async function invitar(canal) {
109
+ if (props.empleoId === null) return;
110
+ enviando.value = canal;
111
+ error.value = null;
112
+ respuesta.value = null;
113
+ try {
114
+ respuesta.value = await portalEmpleadosService.invitar(props.empleoId, canal);
115
+ } catch (e) {
116
+ error.value = mensajeError(e, "No fue posible generar la invitación.");
117
+ } finally {
118
+ enviando.value = null;
119
+ }
120
+ }
121
+ function close() {
122
+ open.value = false;
123
+ }
124
+ return (_ctx, _cache) => {
125
+ return openBlock(), createElementBlock(Fragment, null, [(openBlock(), createBlock(Teleport, { to: "body" }, [open.value ? (openBlock(), createElementBlock("div", _hoisted_1$1, [createElementVNode("div", _hoisted_2$1, [createElementVNode("header", _hoisted_3$1, [_cache[4] || (_cache[4] = createElementVNode("h2", {
126
+ id: "invitacion-portal-titulo",
127
+ class: "modal-title"
128
+ }, "Portal del empleado", -1)), createElementVNode("div", _hoisted_4$1, [createVNode(FormHelpButton, { onClick: _cache[0] || (_cache[0] = ($event) => helpOpen.value = true) }), createVNode(FormCloseButton, {
129
+ disabled: enviando.value !== null,
130
+ onClick: close
131
+ }, null, 8, ["disabled"])])]), createElementVNode("div", _hoisted_5$1, [
132
+ createElementVNode("p", _hoisted_6$1, [createElementVNode("strong", null, toDisplayString(__props.empleado), 1)]),
133
+ error.value ? (openBlock(), createElementBlock("p", _hoisted_7$1, toDisplayString(error.value), 1)) : createCommentVNode("", true),
134
+ qr.value ? (openBlock(), createElementBlock("div", _hoisted_8$1, [!vencido.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
135
+ createElementVNode("div", {
136
+ class: "qr-image",
137
+ role: "img",
138
+ "aria-label": "Código QR de activación",
139
+ innerHTML: qrSvg.value
140
+ }, null, 8, _hoisted_9$1),
141
+ createElementVNode("p", _hoisted_10$1, " Pida al empleado que lo escanee con la cámara de su celular. Para " + toDisplayString(qr.value.cuenta_activa ? "crear una contraseña nueva" : "activar su cuenta") + " confirmará su documento y su fecha de nacimiento. ", 1),
142
+ createElementVNode("p", _hoisted_11$1, "Vence en " + toDisplayString(tiempo.value), 1)
143
+ ], 64)) : (openBlock(), createElementBlock("p", _hoisted_12$1, "El código venció. Genere uno nuevo si el empleado aún no lo ha usado."))])) : respuesta.value?.estado === "enviada" ? (openBlock(), createElementBlock("p", _hoisted_13$1, " Invitación enviada a " + toDisplayString(respuesta.value.correo) + ". El enlace vence en 72 horas. ", 1)) : respuesta.value?.estado === "activa" ? (openBlock(), createElementBlock("p", _hoisted_14, " La cuenta ya está activa. Si el empleado olvidó su contraseña, puede usar «¿Olvidaste tu contraseña?» en el portal, o escanear un QR desde aquí. ")) : createCommentVNode("", true),
144
+ createElementVNode("footer", _hoisted_15, [createElementVNode("button", {
145
+ type: "button",
146
+ class: "btn-secondary",
147
+ disabled: enviando.value !== null,
148
+ onClick: _cache[1] || (_cache[1] = ($event) => invitar("correo"))
149
+ }, toDisplayString(enviando.value === "correo" ? "Enviando…" : "Reenviar invitación por correo"), 9, _hoisted_16), createElementVNode("button", {
150
+ type: "button",
151
+ class: "btn-primary",
152
+ disabled: enviando.value !== null,
153
+ onClick: _cache[2] || (_cache[2] = ($event) => invitar("qr"))
154
+ }, toDisplayString(enviando.value === "qr" ? "Generando…" : qr.value ? "Generar otro QR" : "Mostrar QR de activación"), 9, _hoisted_17)])
155
+ ])])])) : createCommentVNode("", true)])), createVNode(FormHelpModal, {
156
+ open: helpOpen.value,
157
+ "onUpdate:open": _cache[3] || (_cache[3] = ($event) => helpOpen.value = $event),
158
+ title: "Portal del empleado",
159
+ intro: "Invite al empleado a su portal, donde consulta volantes y certificados y radica permisos y vacaciones. Al registrar el contrato la invitación sale sola por correo; aquí puede mostrarla en persona o reenviarla.",
160
+ steps: [
161
+ {
162
+ title: "Con el empleado presente, muestre el QR.",
163
+ body: "El código sirve 15 minutos y una sola vez. Queda registrado quién lo generó. Úselo cuando no tenga correo o no le llegó el enlace."
164
+ },
165
+ {
166
+ title: "Si no está presente, reenvíe por correo.",
167
+ body: "Se envía al correo que SoftDIN publicó al portal (comunicaciones del tercero, tipo correo). Si está mal, corríjalo en SoftDIN y reenvíe."
168
+ },
169
+ {
170
+ title: "El empleado confirma su identidad.",
171
+ body: "Para activar pide el documento y la fecha de nacimiento de su hoja de vida. Tras 5 intentos fallidos el enlace se anula y hay que generar otro."
172
+ },
173
+ {
174
+ title: "Una cuenta para todas sus empresas.",
175
+ body: "Si ya tenía cuenta por otro empleador, no necesita activar de nuevo: la empresa aparece sola en su portal."
176
+ }
177
+ ]
178
+ }, null, 8, ["open"])], 64);
179
+ };
180
+ }
181
+ }), [["__scopeId", "data-v-73530e3d"]]);
182
+ //#endregion
183
+ //#region src/views/EmpleadosView.vue?vue&type=script&setup=true&lang.ts
184
+ var _hoisted_1 = { class: "grid gap-4" };
185
+ var _hoisted_2 = ["disabled"];
186
+ var _hoisted_3 = {
187
+ key: 0,
188
+ class: "text-sm text-red-700",
189
+ role: "alert"
190
+ };
191
+ var _hoisted_4 = {
192
+ key: 1,
193
+ class: "text-sm text-slate-500"
194
+ };
195
+ var _hoisted_5 = {
196
+ key: 2,
197
+ class: "text-sm text-slate-500"
198
+ };
199
+ var _hoisted_6 = {
200
+ key: 3,
201
+ class: "divide-y divide-slate-200 rounded-xl border border-slate-200 bg-white"
202
+ };
203
+ var _hoisted_7 = { class: "min-w-0 flex-1" };
204
+ var _hoisted_8 = { class: "font-medium text-slate-900" };
205
+ var _hoisted_9 = {
206
+ key: 0,
207
+ class: "ml-1 rounded-full bg-slate-100 px-2 py-0.5 text-xs text-slate-600"
208
+ };
209
+ var _hoisted_10 = { class: "text-xs text-slate-500" };
210
+ var _hoisted_11 = {
211
+ key: 0,
212
+ class: "text-xs text-amber-700"
213
+ };
214
+ var _hoisted_12 = ["onClick"];
215
+ var _hoisted_13 = {
216
+ key: 4,
217
+ class: "text-xs text-slate-500"
218
+ };
219
+ //#endregion
220
+ //#region src/views/EmpleadosView.vue
221
+ var EmpleadosView_default = /* @__PURE__ */ defineComponent({
222
+ __name: "EmpleadosView",
223
+ setup(__props) {
224
+ const buscar = ref("");
225
+ const items = ref([]);
226
+ const cargando = ref(false);
227
+ const error = ref(null);
228
+ const seleccionado = ref(null);
229
+ const modalOpen = ref(false);
230
+ const clientesInternos = useClienteInternoStore();
231
+ async function cargar() {
232
+ cargando.value = true;
233
+ error.value = null;
234
+ try {
235
+ items.value = await portalEmpleadosService.buscar(buscar.value, clientesInternos.seleccionado);
236
+ } catch (e) {
237
+ error.value = mensajeError(e, "No se pudo cargar la lista de empleados.");
238
+ } finally {
239
+ cargando.value = false;
240
+ }
241
+ }
242
+ function invitar(e) {
243
+ seleccionado.value = e;
244
+ modalOpen.value = true;
245
+ }
246
+ watch(() => clientesInternos.seleccionado, () => void cargar());
247
+ onMounted(() => void cargar());
248
+ return (_ctx, _cache) => {
249
+ return openBlock(), createElementBlock("section", _hoisted_1, [
250
+ _cache[3] || (_cache[3] = createElementVNode("header", null, [createElementVNode("h2", { class: "text-xl font-semibold text-slate-900" }, "Empleados"), createElementVNode("p", { class: "mt-1 text-sm text-slate-600" }, " Al registrar el contrato en SoftDIN, la invitación al portal sale sola por correo. Aquí puede mostrarla como QR a quien está presente o reenviarla por correo. ")], -1)),
251
+ createElementVNode("form", {
252
+ class: "flex flex-wrap gap-2",
253
+ onSubmit: withModifiers(cargar, ["prevent"])
254
+ }, [
255
+ _cache[2] || (_cache[2] = createElementVNode("label", {
256
+ for: "buscar",
257
+ class: "sr-only"
258
+ }, "Buscar", -1)),
259
+ withDirectives(createElementVNode("input", {
260
+ id: "buscar",
261
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => buscar.value = $event),
262
+ type: "search",
263
+ placeholder: "Nombre o documento",
264
+ class: "min-w-0 flex-1 rounded-lg border border-slate-300 px-3 py-2 text-sm"
265
+ }, null, 512), [[vModelText, buscar.value]]),
266
+ createElementVNode("button", {
267
+ type: "submit",
268
+ class: "rounded-lg bg-brand-700 px-4 py-2 text-sm font-semibold text-white",
269
+ disabled: cargando.value
270
+ }, " Buscar ", 8, _hoisted_2)
271
+ ], 32),
272
+ error.value ? (openBlock(), createElementBlock("p", _hoisted_3, toDisplayString(error.value), 1)) : cargando.value ? (openBlock(), createElementBlock("p", _hoisted_4, "Cargando…")) : items.value.length === 0 ? (openBlock(), createElementBlock("p", _hoisted_5, "No hay empleados que coincidan.")) : (openBlock(), createElementBlock("ul", _hoisted_6, [(openBlock(true), createElementBlock(Fragment, null, renderList(items.value, (e) => {
273
+ return openBlock(), createElementBlock("li", {
274
+ key: e.id,
275
+ class: "flex flex-wrap items-center gap-3 px-4 py-3"
276
+ }, [createElementVNode("div", _hoisted_7, [
277
+ createElementVNode("p", _hoisted_8, [
278
+ createTextVNode(toDisplayString(e.empleado ?? "—") + " ", 1),
279
+ createElementVNode("span", { class: normalizeClass(["ml-1 rounded-full px-2 py-0.5 text-xs font-semibold", e.cuenta === "activa" ? "bg-green-100 text-green-800" : "bg-amber-100 text-amber-800"]) }, toDisplayString(e.cuenta === "activa" ? "Cuenta activa" : "Sin activar"), 3),
280
+ e.retirado ? (openBlock(), createElementBlock("span", _hoisted_9, "Retirado")) : createCommentVNode("", true)
281
+ ]),
282
+ createElementVNode("p", _hoisted_10, [
283
+ createTextVNode(toDisplayString(e.identificacion), 1),
284
+ e.cliente_interno ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(" · " + toDisplayString(e.cliente_interno), 1)], 64)) : createCommentVNode("", true),
285
+ e.cargo ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(" · " + toDisplayString(e.cargo), 1)], 64)) : createCommentVNode("", true),
286
+ e.fecha_ingreso ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [createTextVNode(" · ingreso " + toDisplayString(unref(fechaCorta)(e.fecha_ingreso)), 1)], 64)) : createCommentVNode("", true)
287
+ ]),
288
+ !e.tiene_correo ? (openBlock(), createElementBlock("p", _hoisted_11, "Sin correo registrado: use el QR.")) : createCommentVNode("", true)
289
+ ]), createElementVNode("button", {
290
+ type: "button",
291
+ class: "rounded-lg border border-brand-700 px-3 py-1.5 text-sm font-medium text-brand-700 hover:bg-brand-50",
292
+ onClick: ($event) => invitar(e)
293
+ }, " Invitar al portal ", 8, _hoisted_12)]);
294
+ }), 128))])),
295
+ items.value.length === 100 ? (openBlock(), createElementBlock("p", _hoisted_13, "Se muestran los primeros 100: afine la búsqueda.")) : createCommentVNode("", true),
296
+ createVNode(InvitacionPortalModal_default, {
297
+ open: modalOpen.value,
298
+ "onUpdate:open": _cache[1] || (_cache[1] = ($event) => modalOpen.value = $event),
299
+ "empleo-id": seleccionado.value?.id ?? null,
300
+ empleado: seleccionado.value?.empleado ?? ""
301
+ }, null, 8, [
302
+ "open",
303
+ "empleo-id",
304
+ "empleado"
305
+ ])
306
+ ]);
307
+ };
308
+ }
309
+ });
310
+ //#endregion
311
+ export { EmpleadosView_default as default };