@hed-hog/core 0.0.398 → 0.0.400
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/dist/ai/ai-agent.sort.d.ts +6 -0
- package/dist/ai/ai-agent.sort.d.ts.map +1 -0
- package/dist/ai/ai-agent.sort.js +21 -0
- package/dist/ai/ai-agent.sort.js.map +1 -0
- package/dist/ai/ai.controller.d.ts +4 -4
- package/dist/ai/ai.service.d.ts +35 -4
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +51 -137
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-instruction.service.js +26 -23
- package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
- package/dist/ai-instruction/ai-instruction.sort.d.ts +16 -0
- package/dist/ai-instruction/ai-instruction.sort.d.ts.map +1 -0
- package/dist/ai-instruction/ai-instruction.sort.js +32 -0
- package/dist/ai-instruction/ai-instruction.sort.js.map +1 -0
- package/dist/auth/auth.controller.d.ts +24 -8
- package/dist/auth/auth.controller.d.ts.map +1 -1
- package/dist/auth/auth.module.d.ts.map +1 -1
- package/dist/auth/auth.module.js +8 -1
- package/dist/auth/auth.module.js.map +1 -1
- package/dist/auth/auth.service.d.ts +72 -25
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +41 -4
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/guards/auth.guard.d.ts +3 -1
- package/dist/auth/guards/auth.guard.d.ts.map +1 -1
- package/dist/auth/guards/auth.guard.js +12 -3
- package/dist/auth/guards/auth.guard.js.map +1 -1
- package/dist/authorize/authorize.controller.d.ts +30 -6
- package/dist/authorize/authorize.controller.d.ts.map +1 -1
- package/dist/authorize/authorize.controller.js +120 -13
- package/dist/authorize/authorize.controller.js.map +1 -1
- package/dist/authorize/authorize.errors.d.ts +34 -0
- package/dist/authorize/authorize.errors.d.ts.map +1 -0
- package/dist/authorize/authorize.errors.js +37 -0
- package/dist/authorize/authorize.errors.js.map +1 -0
- package/dist/authorize/authorize.module.d.ts.map +1 -1
- package/dist/authorize/authorize.module.js +6 -1
- package/dist/authorize/authorize.module.js.map +1 -1
- package/dist/authorize/authorize.service.d.ts +78 -4
- package/dist/authorize/authorize.service.d.ts.map +1 -1
- package/dist/authorize/authorize.service.js +212 -21
- package/dist/authorize/authorize.service.js.map +1 -1
- package/dist/authorize/dto/authorize-info.dto.d.ts +10 -1
- package/dist/authorize/dto/authorize-info.dto.d.ts.map +1 -1
- package/dist/authorize/dto/authorize-info.dto.js +16 -1
- package/dist/authorize/dto/authorize-info.dto.js.map +1 -1
- package/dist/authorize/dto/consent.dto.d.ts +10 -1
- package/dist/authorize/dto/consent.dto.d.ts.map +1 -1
- package/dist/authorize/dto/consent.dto.js +16 -1
- package/dist/authorize/dto/consent.dto.js.map +1 -1
- package/dist/authorize/dto/token.dto.d.ts +12 -0
- package/dist/authorize/dto/token.dto.d.ts.map +1 -1
- package/dist/authorize/dto/token.dto.js +21 -1
- package/dist/authorize/dto/token.dto.js.map +1 -1
- package/dist/authorize/oauth-exception.filter.d.ts +17 -0
- package/dist/authorize/oauth-exception.filter.d.ts.map +1 -0
- package/dist/authorize/oauth-exception.filter.js +54 -0
- package/dist/authorize/oauth-exception.filter.js.map +1 -0
- package/dist/authorize/oauth-metadata.service.d.ts +39 -0
- package/dist/authorize/oauth-metadata.service.d.ts.map +1 -0
- package/dist/authorize/oauth-metadata.service.js +81 -0
- package/dist/authorize/oauth-metadata.service.js.map +1 -0
- package/dist/authorize/well-known.controller.d.ts +67 -0
- package/dist/authorize/well-known.controller.d.ts.map +1 -0
- package/dist/authorize/well-known.controller.js +126 -0
- package/dist/authorize/well-known.controller.js.map +1 -0
- package/dist/captcha/captcha.service.d.ts +32 -2
- package/dist/captcha/captcha.service.d.ts.map +1 -1
- package/dist/captcha/captcha.service.js +85 -12
- package/dist/captcha/captcha.service.js.map +1 -1
- package/dist/challenge/challenge.service.d.ts +2 -2
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +6 -0
- package/dist/core.module.js.map +1 -1
- package/dist/dashboard/dashboard/dashboard.controller.d.ts +9 -9
- package/dist/dashboard/dashboard/dashboard.service.d.ts +9 -9
- package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +3 -3
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js +2 -4
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js.map +1 -1
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts +8 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js +18 -0
- package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js.map +1 -0
- package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-item/dashboard-item.service.js +2 -4
- package/dist/dashboard/dashboard-item/dashboard-item.service.js.map +1 -1
- package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts +9 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.js +19 -0
- package/dist/dashboard/dashboard-item/dashboard-item.sort.js.map +1 -0
- package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
- package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
- package/dist/dashboard/dashboard-role/dashboard-role.service.js +2 -4
- package/dist/dashboard/dashboard-role/dashboard-role.service.js.map +1 -1
- package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts +8 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts.map +1 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.js +16 -0
- package/dist/dashboard/dashboard-role/dashboard-role.sort.js.map +1 -0
- package/dist/file/file-upload-ticket.service.d.ts +160 -0
- package/dist/file/file-upload-ticket.service.d.ts.map +1 -0
- package/dist/file/file-upload-ticket.service.js +382 -0
- package/dist/file/file-upload-ticket.service.js.map +1 -0
- package/dist/file/file.controller.d.ts +24 -1
- package/dist/file/file.controller.d.ts.map +1 -1
- package/dist/file/file.controller.js +63 -2
- package/dist/file/file.controller.js.map +1 -1
- package/dist/file/file.module.d.ts.map +1 -1
- package/dist/file/file.module.js +14 -2
- package/dist/file/file.module.js.map +1 -1
- package/dist/file/file.service.d.ts +182 -6
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +385 -36
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/filename-encoding.util.d.ts +24 -0
- package/dist/file/filename-encoding.util.d.ts.map +1 -0
- package/dist/file/filename-encoding.util.js +63 -0
- package/dist/file/filename-encoding.util.js.map +1 -0
- package/dist/file/image-optimization.service.d.ts +27 -0
- package/dist/file/image-optimization.service.d.ts.map +1 -1
- package/dist/file/image-optimization.service.js +63 -14
- package/dist/file/image-optimization.service.js.map +1 -1
- package/dist/file/mcp-file-source.schema.d.ts +33 -0
- package/dist/file/mcp-file-source.schema.d.ts.map +1 -0
- package/dist/file/mcp-file-source.schema.js +75 -0
- package/dist/file/mcp-file-source.schema.js.map +1 -0
- package/dist/file/mcp-file-source.service.d.ts +124 -0
- package/dist/file/mcp-file-source.service.d.ts.map +1 -0
- package/dist/file/mcp-file-source.service.js +262 -0
- package/dist/file/mcp-file-source.service.js.map +1 -0
- package/dist/file/mimetype-sniff.util.d.ts +62 -0
- package/dist/file/mimetype-sniff.util.d.ts.map +1 -0
- package/dist/file/mimetype-sniff.util.js +226 -0
- package/dist/file/mimetype-sniff.util.js.map +1 -0
- package/dist/file/remote-fetch.util.d.ts +35 -0
- package/dist/file/remote-fetch.util.d.ts.map +1 -0
- package/dist/file/remote-fetch.util.js +236 -0
- package/dist/file/remote-fetch.util.js.map +1 -0
- package/dist/impersonation/dto/start-impersonation.dto.d.ts +4 -1
- package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -1
- package/dist/impersonation/dto/start-impersonation.dto.js +1 -1
- package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -1
- package/dist/impersonation/impersonation.service.d.ts +8 -3
- package/dist/impersonation/impersonation.service.d.ts.map +1 -1
- package/dist/impersonation/impersonation.service.js +14 -4
- package/dist/impersonation/impersonation.service.js.map +1 -1
- package/dist/incident/incident.controller.d.ts +2 -1
- package/dist/incident/incident.controller.d.ts.map +1 -1
- package/dist/incident/incident.controller.js +10 -6
- package/dist/incident/incident.controller.js.map +1 -1
- package/dist/incident/incident.service.d.ts +2 -0
- package/dist/incident/incident.service.d.ts.map +1 -1
- package/dist/incident/incident.service.js +4 -0
- package/dist/incident/incident.service.js.map +1 -1
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +7 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/integration-profile.service.d.ts +0 -13
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.service.js +5 -40
- package/dist/integration-profile/integration-profile.service.js.map +1 -1
- package/dist/integration-profile/integration-profile.utils.js +5 -5
- package/dist/integration-profile/integration-profile.utils.js.map +1 -1
- package/dist/integration-profile/testers/index.d.ts.map +1 -1
- package/dist/integration-profile/testers/index.js +2 -0
- package/dist/integration-profile/testers/index.js.map +1 -1
- package/dist/integration-profile/testers/shipping.testers.d.ts +3 -0
- package/dist/integration-profile/testers/shipping.testers.d.ts.map +1 -0
- package/dist/integration-profile/testers/shipping.testers.js +71 -0
- package/dist/integration-profile/testers/shipping.testers.js.map +1 -0
- package/dist/locale/locale.controller.d.ts +1 -1
- package/dist/locale/locale.service.d.ts +1 -1
- package/dist/mail/dto/send.dto.d.ts +6 -1
- package/dist/mail/dto/send.dto.d.ts.map +1 -1
- package/dist/mail/dto/send.dto.js.map +1 -1
- package/dist/mail/mail.service.d.ts +9 -0
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +34 -14
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mail-sent/mail-sent.controller.d.ts +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts +1 -1
- package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
- package/dist/mail-sent/mail-sent.service.js +2 -1
- package/dist/mail-sent/mail-sent.service.js.map +1 -1
- package/dist/mail-sent/mail-sent.sort.d.ts +9 -0
- package/dist/mail-sent/mail-sent.sort.d.ts.map +1 -0
- package/dist/mail-sent/mail-sent.sort.js +19 -0
- package/dist/mail-sent/mail-sent.sort.js.map +1 -0
- package/dist/mcp/filters/mcp-challenge.filter.d.ts +20 -0
- package/dist/mcp/filters/mcp-challenge.filter.d.ts.map +1 -0
- package/dist/mcp/filters/mcp-challenge.filter.js +69 -0
- package/dist/mcp/filters/mcp-challenge.filter.js.map +1 -0
- package/dist/mcp/guards/mcp-auth.guard.d.ts +4 -1
- package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -1
- package/dist/mcp/guards/mcp-auth.guard.js +19 -5
- package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
- package/dist/mcp/guards/mcp-permission.guard.d.ts +25 -3
- package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -1
- package/dist/mcp/guards/mcp-permission.guard.js +46 -26
- package/dist/mcp/guards/mcp-permission.guard.js.map +1 -1
- package/dist/mcp/mcp-audit.service.d.ts +17 -0
- package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
- package/dist/mcp/mcp-audit.service.js +32 -3
- package/dist/mcp/mcp-audit.service.js.map +1 -1
- package/dist/mcp/mcp-permission.service.d.ts +64 -0
- package/dist/mcp/mcp-permission.service.d.ts.map +1 -0
- package/dist/mcp/mcp-permission.service.js +178 -0
- package/dist/mcp/mcp-permission.service.js.map +1 -0
- package/dist/mcp/mcp-server.service.d.ts +3 -1
- package/dist/mcp/mcp-server.service.d.ts.map +1 -1
- package/dist/mcp/mcp-server.service.js +36 -15
- package/dist/mcp/mcp-server.service.js.map +1 -1
- package/dist/mcp/mcp.controller.d.ts.map +1 -1
- package/dist/mcp/mcp.controller.js +10 -2
- package/dist/mcp/mcp.controller.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +5 -1
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp/tools/core-ai.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +1 -1
- package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-dashboard.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-files.mcp-tools.d.ts +17 -5
- package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-files.mcp-tools.js +186 -24
- package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-integration-events.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-mail-sent.mcp-tools.js +2 -14
- package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-mail.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-menus.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.js +0 -1
- package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-roles.mcp-tools.js +2 -13
- package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-routes.mcp-tools.js +2 -11
- package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-screens.mcp-tools.js +2 -11
- package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-sessions.mcp-tools.js +0 -2
- package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-settings.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-users.mcp-tools.js +2 -9
- package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
- package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -1
- package/dist/mcp/tools/core-webhooks.mcp-tools.js +2 -10
- package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -1
- package/dist/mcp/types/mcp-context.type.d.ts +9 -0
- package/dist/mcp/types/mcp-context.type.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.js +8 -0
- package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +115 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
- package/dist/meeting/meeting-provider.registry.js.map +1 -1
- package/dist/meeting/meeting.constants.d.ts +70 -0
- package/dist/meeting/meeting.constants.d.ts.map +1 -1
- package/dist/meeting/meeting.constants.js +9 -1
- package/dist/meeting/meeting.constants.js.map +1 -1
- package/dist/menu/menu.service.d.ts.map +1 -1
- package/dist/menu/menu.service.js +29 -9
- package/dist/menu/menu.service.js.map +1 -1
- package/dist/message-template/dto/update-message-template.dto.d.ts +18 -0
- package/dist/message-template/dto/update-message-template.dto.d.ts.map +1 -0
- package/dist/message-template/dto/update-message-template.dto.js +38 -0
- package/dist/message-template/dto/update-message-template.dto.js.map +1 -0
- package/dist/message-template/message-template-admin.service.d.ts +70 -0
- package/dist/message-template/message-template-admin.service.d.ts.map +1 -0
- package/dist/message-template/message-template-admin.service.js +226 -0
- package/dist/message-template/message-template-admin.service.js.map +1 -0
- package/dist/message-template/message-template.controller.d.ts +29 -0
- package/dist/message-template/message-template.controller.d.ts.map +1 -0
- package/dist/message-template/message-template.controller.js +101 -0
- package/dist/message-template/message-template.controller.js.map +1 -0
- package/dist/message-template/message-template.module.d.ts +10 -0
- package/dist/message-template/message-template.module.d.ts.map +1 -0
- package/dist/message-template/message-template.module.js +33 -0
- package/dist/message-template/message-template.module.js.map +1 -0
- package/dist/message-template/message-template.registry.d.ts +55 -0
- package/dist/message-template/message-template.registry.d.ts.map +1 -0
- package/dist/message-template/message-template.registry.js +64 -0
- package/dist/message-template/message-template.registry.js.map +1 -0
- package/dist/message-template/message-template.service.d.ts +59 -0
- package/dist/message-template/message-template.service.d.ts.map +1 -0
- package/dist/message-template/message-template.service.js +166 -0
- package/dist/message-template/message-template.service.js.map +1 -0
- package/dist/notification/notification.constants.d.ts +11 -0
- package/dist/notification/notification.constants.d.ts.map +1 -0
- package/dist/notification/notification.constants.js +14 -0
- package/dist/notification/notification.constants.js.map +1 -0
- package/dist/notification/notification.controller.d.ts +20 -20
- package/dist/notification/notification.module.d.ts.map +1 -1
- package/dist/notification/notification.module.js +3 -0
- package/dist/notification/notification.module.js.map +1 -1
- package/dist/notification/notification.service.d.ts +33 -21
- package/dist/notification/notification.service.d.ts.map +1 -1
- package/dist/notification/notification.service.js +36 -2
- package/dist/notification/notification.service.js.map +1 -1
- package/dist/oauth/oauth.controller.d.ts +4 -6
- package/dist/oauth/oauth.controller.d.ts.map +1 -1
- package/dist/oauth/oauth.controller.js +0 -1
- package/dist/oauth/oauth.controller.js.map +1 -1
- package/dist/oauth/oauth.errors.d.ts +15 -1
- package/dist/oauth/oauth.errors.d.ts.map +1 -1
- package/dist/oauth/oauth.errors.js +9 -1
- package/dist/oauth/oauth.errors.js.map +1 -1
- package/dist/oauth/oauth.module.d.ts.map +1 -1
- package/dist/oauth/oauth.module.js +6 -1
- package/dist/oauth/oauth.module.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +25 -5
- package/dist/oauth/oauth.service.d.ts.map +1 -1
- package/dist/oauth/oauth.service.js +63 -27
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/oauth/providers/abstract.provider.d.ts +10 -0
- package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
- package/dist/oauth/providers/abstract.provider.js +39 -12
- package/dist/oauth/providers/abstract.provider.js.map +1 -1
- package/dist/oauth/providers/github.provider.d.ts +1 -1
- package/dist/oauth/providers/github.provider.d.ts.map +1 -1
- package/dist/oauth/providers/github.provider.js +48 -22
- package/dist/oauth/providers/github.provider.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +6 -0
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/observability/monitored-cron.d.ts +29 -12
- package/dist/observability/monitored-cron.d.ts.map +1 -1
- package/dist/observability/monitored-cron.js +131 -46
- package/dist/observability/monitored-cron.js.map +1 -1
- package/dist/pairing/pairing.controller.d.ts +9 -9
- package/dist/pairing/pairing.service.d.ts +15 -11
- package/dist/pairing/pairing.service.d.ts.map +1 -1
- package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
- package/dist/profile/dto/change-password.dto.js +4 -6
- package/dist/profile/dto/change-password.dto.js.map +1 -1
- package/dist/profile/profile.controller.d.ts +1 -1
- package/dist/profile/profile.service.d.ts +1 -1
- package/dist/profile/profile.service.d.ts.map +1 -1
- package/dist/profile/profile.service.js +9 -3
- package/dist/profile/profile.service.js.map +1 -1
- package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
- package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
- package/dist/realtime/realtime-tick.coalescer.js +60 -0
- package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
- package/dist/realtime/realtime.service.d.ts +2 -0
- package/dist/realtime/realtime.service.d.ts.map +1 -1
- package/dist/realtime/realtime.service.js +22 -2
- package/dist/realtime/realtime.service.js.map +1 -1
- package/dist/redis/redis-kv.service.d.ts +90 -0
- package/dist/redis/redis-kv.service.d.ts.map +1 -0
- package/dist/redis/redis-kv.service.js +247 -0
- package/dist/redis/redis-kv.service.js.map +1 -0
- package/dist/redis/redis-master.d.ts +29 -0
- package/dist/redis/redis-master.d.ts.map +1 -0
- package/dist/redis/redis-master.js +81 -0
- package/dist/redis/redis-master.js.map +1 -0
- package/dist/redis/redis-pubsub.d.ts +12 -0
- package/dist/redis/redis-pubsub.d.ts.map +1 -1
- package/dist/redis/redis-pubsub.js +25 -2
- package/dist/redis/redis-pubsub.js.map +1 -1
- package/dist/redis/redis.module.d.ts +11 -0
- package/dist/redis/redis.module.d.ts.map +1 -0
- package/dist/redis/redis.module.js +30 -0
- package/dist/redis/redis.module.js.map +1 -0
- package/dist/session/session.controller.d.ts +6 -2
- package/dist/session/session.controller.d.ts.map +1 -1
- package/dist/session/session.service.d.ts +118 -15
- package/dist/session/session.service.d.ts.map +1 -1
- package/dist/session/session.service.js +251 -77
- package/dist/session/session.service.js.map +1 -1
- package/dist/setting/setting.controller.d.ts +5 -0
- package/dist/setting/setting.controller.d.ts.map +1 -1
- package/dist/setting/setting.service.d.ts +7 -0
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +38 -3
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/task/task.service.d.ts +17 -0
- package/dist/task/task.service.d.ts.map +1 -1
- package/dist/task/task.service.js +48 -13
- package/dist/task/task.service.js.map +1 -1
- package/dist/token/token.service.d.ts +19 -1
- package/dist/token/token.service.d.ts.map +1 -1
- package/dist/token/token.service.js +39 -2
- package/dist/token/token.service.js.map +1 -1
- package/dist/user/user-credential.util.d.ts +10 -0
- package/dist/user/user-credential.util.d.ts.map +1 -1
- package/dist/user/user-credential.util.js +14 -1
- package/dist/user/user-credential.util.js.map +1 -1
- package/dist/user/user.service.d.ts +12 -4
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +2 -11
- package/dist/user/user.service.js.map +1 -1
- package/dist/user/user.sort.d.ts +16 -0
- package/dist/user/user.sort.d.ts.map +1 -0
- package/dist/user/user.sort.js +25 -0
- package/dist/user/user.sort.js.map +1 -0
- package/dist/utils/abbreviate-name.d.ts +13 -0
- package/dist/utils/abbreviate-name.d.ts.map +1 -0
- package/dist/utils/abbreviate-name.js +42 -0
- package/dist/utils/abbreviate-name.js.map +1 -0
- package/dist/utils/date-range-query.dto.d.ts +11 -0
- package/dist/utils/date-range-query.dto.d.ts.map +1 -0
- package/dist/utils/date-range-query.dto.js +63 -0
- package/dist/utils/date-range-query.dto.js.map +1 -0
- package/dist/utils/date-range.d.ts +96 -0
- package/dist/utils/date-range.d.ts.map +1 -0
- package/dist/utils/date-range.js +172 -0
- package/dist/utils/date-range.js.map +1 -0
- package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-utils.js +24 -0
- package/dist/webhook-integration/webhook-utils.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
- package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
- package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
- package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +46 -5
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
- package/hedhog/data/integration_provider.yaml +9 -0
- package/hedhog/data/integration_type.yaml +6 -0
- package/hedhog/data/locale.yaml +0 -1
- package/hedhog/data/mail.yaml +2 -2
- package/hedhog/data/mail_layout.yaml +6 -3
- package/hedhog/data/menu.yaml +25 -5
- package/hedhog/data/route.yaml +140 -0
- package/hedhog/data/setting_group.yaml +137 -3
- package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
- package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
- package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
- package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
- package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
- package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
- package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
- package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
- package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
- package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
- package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
- package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
- package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
- package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
- package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
- package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
- package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
- package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
- package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
- package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
- package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
- package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
- package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
- package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
- package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
- package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
- package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
- package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
- package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
- package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
- package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
- package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
- package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
- package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
- package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
- package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
- package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
- package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
- package/hedhog/frontend/messages/en.json +183 -36
- package/hedhog/frontend/messages/pt.json +183 -36
- package/hedhog/table/cron_lock.yaml +17 -0
- package/hedhog/table/file.yaml +13 -1
- package/hedhog/table/file_upload_chunk.yaml +23 -0
- package/hedhog/table/file_upload_ticket.yaml +67 -0
- package/hedhog/table/mcp_tool_call_log.yaml +30 -22
- package/hedhog/table/message_template.yaml +33 -0
- package/hedhog/table/setting.yaml +8 -0
- package/hedhog/table/user_session.yaml +36 -1
- package/package.json +8 -6
- package/src/ai/ai-agent.sort.ts +21 -0
- package/src/ai/ai.service.spec.ts +173 -1
- package/src/ai/ai.service.ts +64 -193
- package/src/ai-instruction/ai-instruction.service.ts +32 -28
- package/src/ai-instruction/ai-instruction.sort.ts +32 -0
- package/src/auth/auth.module.ts +8 -1
- package/src/auth/auth.service.spec.ts +108 -1
- package/src/auth/auth.service.ts +59 -5
- package/src/auth/guards/auth.guard.ts +9 -1
- package/src/authorize/authorize.controller.ts +126 -11
- package/src/authorize/authorize.errors.ts +55 -0
- package/src/authorize/authorize.module.ts +6 -1
- package/src/authorize/authorize.service.spec.ts +379 -7
- package/src/authorize/authorize.service.ts +309 -23
- package/src/authorize/dto/authorize-info.dto.ts +21 -3
- package/src/authorize/dto/consent.dto.ts +21 -3
- package/src/authorize/dto/token.dto.ts +24 -2
- package/src/authorize/oauth-exception.filter.ts +58 -0
- package/src/authorize/oauth-metadata.service.ts +67 -0
- package/src/authorize/well-known.controller.spec.ts +84 -0
- package/src/authorize/well-known.controller.ts +96 -0
- package/src/captcha/captcha.service.spec.ts +211 -4
- package/src/captcha/captcha.service.ts +127 -10
- package/src/core.module.ts +6 -0
- package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
- package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
- package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
- package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
- package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
- package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
- package/src/file/file-upload-ticket.service.spec.ts +422 -0
- package/src/file/file-upload-ticket.service.ts +513 -0
- package/src/file/file.controller.ts +65 -0
- package/src/file/file.module.ts +14 -2
- package/src/file/file.service.spec.ts +94 -0
- package/src/file/file.service.ts +432 -30
- package/src/file/filename-encoding.util.spec.ts +54 -0
- package/src/file/filename-encoding.util.ts +67 -0
- package/src/file/image-optimization.service.spec.ts +156 -19
- package/src/file/image-optimization.service.ts +106 -21
- package/src/file/mcp-file-source.schema.ts +83 -0
- package/src/file/mcp-file-source.service.spec.ts +473 -0
- package/src/file/mcp-file-source.service.ts +445 -0
- package/src/file/mimetype-sniff.util.spec.ts +126 -0
- package/src/file/mimetype-sniff.util.ts +265 -0
- package/src/file/remote-fetch.util.spec.ts +117 -0
- package/src/file/remote-fetch.util.ts +330 -0
- package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
- package/src/impersonation/impersonation.service.spec.ts +24 -1
- package/src/impersonation/impersonation.service.ts +14 -4
- package/src/incident/incident.controller.ts +9 -1
- package/src/incident/incident.service.ts +7 -0
- package/src/index.ts +17 -0
- package/src/integration-profile/integration-profile.secrets.ts +7 -0
- package/src/integration-profile/integration-profile.service.ts +7 -64
- package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
- package/src/integration-profile/integration-profile.utils.ts +5 -5
- package/src/integration-profile/testers/index.ts +2 -0
- package/src/integration-profile/testers/remaining.testers.spec.ts +79 -0
- package/src/integration-profile/testers/shipping.testers.ts +94 -0
- package/src/mail/dto/send.dto.ts +6 -1
- package/src/mail/mail-template.spec.ts +58 -1
- package/src/mail/mail.service.spec.ts +112 -0
- package/src/mail/mail.service.ts +42 -4
- package/src/mail-sent/mail-sent.service.ts +3 -0
- package/src/mail-sent/mail-sent.sort.ts +19 -0
- package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
- package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
- package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
- package/src/mcp/guards/mcp-auth.guard.ts +24 -1
- package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
- package/src/mcp/guards/mcp-permission.guard.ts +76 -51
- package/src/mcp/mcp-audit.service.spec.ts +107 -0
- package/src/mcp/mcp-audit.service.ts +37 -1
- package/src/mcp/mcp-permission.service.spec.ts +197 -0
- package/src/mcp/mcp-permission.service.ts +184 -0
- package/src/mcp/mcp-server.service.spec.ts +84 -2
- package/src/mcp/mcp-server.service.ts +111 -87
- package/src/mcp/mcp.controller.ts +8 -1
- package/src/mcp/mcp.module.ts +5 -1
- package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
- package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
- package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
- package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
- package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
- package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
- package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
- package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
- package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
- package/src/mcp/types/mcp-context.type.ts +15 -6
- package/src/mcp-chat/mcp-chat.service.ts +8 -0
- package/src/meeting/meeting-provider.registry.ts +121 -0
- package/src/meeting/meeting.constants.ts +74 -0
- package/src/menu/menu.service.spec.ts +89 -0
- package/src/menu/menu.service.ts +29 -11
- package/src/message-template/dto/update-message-template.dto.ts +22 -0
- package/src/message-template/message-template-admin.service.spec.ts +163 -0
- package/src/message-template/message-template-admin.service.ts +239 -0
- package/src/message-template/message-template.controller.ts +52 -0
- package/src/message-template/message-template.module.ts +21 -0
- package/src/message-template/message-template.registry.spec.ts +62 -0
- package/src/message-template/message-template.registry.ts +125 -0
- package/src/message-template/message-template.service.spec.ts +149 -0
- package/src/message-template/message-template.service.ts +149 -0
- package/src/notification/notification.constants.ts +10 -0
- package/src/notification/notification.module.ts +3 -0
- package/src/notification/notification.service.spec.ts +75 -1
- package/src/notification/notification.service.ts +39 -1
- package/src/oauth/oauth.controller.ts +0 -1
- package/src/oauth/oauth.errors.ts +7 -0
- package/src/oauth/oauth.module.ts +6 -1
- package/src/oauth/oauth.service.spec.ts +58 -7
- package/src/oauth/oauth.service.ts +71 -32
- package/src/oauth/providers/abstract.provider.spec.ts +192 -0
- package/src/oauth/providers/abstract.provider.ts +46 -14
- package/src/oauth/providers/github.provider.ts +57 -34
- package/src/oauth/providers/microsoft-entra-id.provider.ts +8 -1
- package/src/observability/monitored-cron.spec.ts +164 -31
- package/src/observability/monitored-cron.ts +154 -62
- package/src/profile/dto/change-password.dto.ts +25 -7
- package/src/profile/profile.service.spec.ts +97 -0
- package/src/profile/profile.service.ts +9 -3
- package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
- package/src/realtime/realtime-tick.coalescer.ts +60 -0
- package/src/realtime/realtime.service.spec.ts +33 -0
- package/src/realtime/realtime.service.ts +28 -2
- package/src/redis/redis-kv.service.ts +261 -0
- package/src/redis/redis-master.spec.ts +111 -0
- package/src/redis/redis-master.ts +86 -0
- package/src/redis/redis-pubsub.ts +27 -3
- package/src/redis/redis.module.ts +17 -0
- package/src/session/session.service.spec.ts +121 -42
- package/src/session/session.service.ts +279 -82
- package/src/setting/setting.service.ts +44 -3
- package/src/task/task.service.spec.ts +41 -0
- package/src/task/task.service.ts +53 -13
- package/src/token/token.service.spec.ts +90 -0
- package/src/token/token.service.ts +48 -2
- package/src/user/user-credential.util.ts +14 -5
- package/src/user/user.service.ts +2 -12
- package/src/user/user.sort.ts +25 -0
- package/src/utils/abbreviate-name.spec.ts +50 -0
- package/src/utils/abbreviate-name.ts +44 -0
- package/src/utils/date-range-query.dto.ts +56 -0
- package/src/utils/date-range.spec.ts +175 -0
- package/src/utils/date-range.ts +246 -0
- package/src/webhook-integration/webhook-utils.spec.ts +67 -0
- package/src/webhook-integration/webhook-utils.ts +26 -0
- package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
- package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
- package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +112 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +58 -5
|
@@ -46,6 +46,11 @@ import {
|
|
|
46
46
|
import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
|
|
47
47
|
import { Skeleton } from '@/components/ui/skeleton';
|
|
48
48
|
import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
|
|
49
|
+
import {
|
|
50
|
+
Tooltip,
|
|
51
|
+
TooltipContent,
|
|
52
|
+
TooltipTrigger,
|
|
53
|
+
} from '@/components/ui/tooltip';
|
|
49
54
|
import { useDebounce } from '@/hooks/use-debounce';
|
|
50
55
|
import { cn } from '@/lib/utils';
|
|
51
56
|
import { useApp, useQuery } from '@hed-hog/next-app-provider';
|
|
@@ -1078,30 +1083,36 @@ export function DashboardHomeTabs() {
|
|
|
1078
1083
|
{tabContent}
|
|
1079
1084
|
</TabsTrigger>
|
|
1080
1085
|
<DropdownMenu>
|
|
1081
|
-
<
|
|
1082
|
-
<
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1086
|
+
<Tooltip>
|
|
1087
|
+
<TooltipTrigger asChild>
|
|
1088
|
+
<DropdownMenuTrigger asChild>
|
|
1089
|
+
<Button
|
|
1090
|
+
type="button"
|
|
1091
|
+
variant="ghost"
|
|
1092
|
+
size="icon"
|
|
1093
|
+
className={cn(
|
|
1094
|
+
'absolute top-1/2 right-1 z-10 size-7 -translate-y-1/2 rounded-md text-muted-foreground hover:text-foreground',
|
|
1095
|
+
isActiveTab
|
|
1096
|
+
? 'bg-background/80'
|
|
1097
|
+
: 'bg-transparent hover:bg-background/60'
|
|
1098
|
+
)}
|
|
1099
|
+
onClick={(event) => {
|
|
1100
|
+
event.stopPropagation();
|
|
1101
|
+
setActiveSlug(dashboard.slug);
|
|
1102
|
+
}}
|
|
1103
|
+
onPointerDown={(event) =>
|
|
1104
|
+
event.stopPropagation()
|
|
1105
|
+
}
|
|
1106
|
+
aria-label={t('tabActions')}
|
|
1107
|
+
>
|
|
1108
|
+
<MoreHorizontal className="size-4" />
|
|
1109
|
+
</Button>
|
|
1110
|
+
</DropdownMenuTrigger>
|
|
1111
|
+
</TooltipTrigger>
|
|
1112
|
+
<TooltipContent>
|
|
1113
|
+
{t('tabActions')}
|
|
1114
|
+
</TooltipContent>
|
|
1115
|
+
</Tooltip>
|
|
1105
1116
|
<DropdownMenuContent
|
|
1106
1117
|
align="end"
|
|
1107
1118
|
className="w-56"
|
|
@@ -1473,12 +1484,9 @@ export function DashboardHomeTabs() {
|
|
|
1473
1484
|
className="w-full"
|
|
1474
1485
|
onClick={handleCreateDashboard}
|
|
1475
1486
|
disabled={isCreating}
|
|
1487
|
+
loading={isCreating}
|
|
1476
1488
|
>
|
|
1477
|
-
|
|
1478
|
-
<Loader2 className="size-4 animate-spin" />
|
|
1479
|
-
) : (
|
|
1480
|
-
<Plus className="size-4" />
|
|
1481
|
-
)}
|
|
1489
|
+
<Plus className="size-4" />
|
|
1482
1490
|
{t('createDashboard')}
|
|
1483
1491
|
</Button>
|
|
1484
1492
|
</div>
|
|
@@ -1590,12 +1598,9 @@ export function DashboardHomeTabs() {
|
|
|
1590
1598
|
className="w-full"
|
|
1591
1599
|
onClick={() => void handleSaveDashboardIcon()}
|
|
1592
1600
|
disabled={isSavingIcon || Boolean(iconValue.trim()) === false}
|
|
1601
|
+
loading={isSavingIcon}
|
|
1593
1602
|
>
|
|
1594
|
-
|
|
1595
|
-
<Loader2 className="size-4 animate-spin" />
|
|
1596
|
-
) : (
|
|
1597
|
-
<Palette className="size-4" />
|
|
1598
|
-
)}
|
|
1603
|
+
<Palette className="size-4" />
|
|
1599
1604
|
{t('saveIcon')}
|
|
1600
1605
|
</Button>
|
|
1601
1606
|
</div>
|
|
@@ -1705,12 +1710,9 @@ export function DashboardHomeTabs() {
|
|
|
1705
1710
|
className="cursor-pointer"
|
|
1706
1711
|
onClick={() => void handleRevokeShare(user.id)}
|
|
1707
1712
|
disabled={revokingUserId === user.id}
|
|
1713
|
+
loading={revokingUserId === user.id}
|
|
1708
1714
|
>
|
|
1709
|
-
|
|
1710
|
-
<Loader2 className="size-4 animate-spin" />
|
|
1711
|
-
) : (
|
|
1712
|
-
<Trash2 className="size-4" />
|
|
1713
|
-
)}
|
|
1715
|
+
<Trash2 className="size-4" />
|
|
1714
1716
|
</Button>
|
|
1715
1717
|
) : null}
|
|
1716
1718
|
</div>
|
|
@@ -1886,12 +1888,9 @@ export function DashboardHomeTabs() {
|
|
|
1886
1888
|
disabled={
|
|
1887
1889
|
isSharingUsers || selectedShareUserIds.length === 0
|
|
1888
1890
|
}
|
|
1891
|
+
loading={isSharingUsers}
|
|
1889
1892
|
>
|
|
1890
|
-
|
|
1891
|
-
<Loader2 className="size-4 animate-spin" />
|
|
1892
|
-
) : (
|
|
1893
|
-
<UserPlus className="size-4" />
|
|
1894
|
-
)}
|
|
1893
|
+
<UserPlus className="size-4" />
|
|
1895
1894
|
{t('shareSelectedUsers', {
|
|
1896
1895
|
count: selectedShareUserIds.length,
|
|
1897
1896
|
})}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { SortableTableHead } from '@/components/entity-list';
|
|
3
4
|
import {
|
|
4
5
|
AlertDialog,
|
|
5
6
|
AlertDialogAction,
|
|
@@ -45,6 +46,7 @@ import {
|
|
|
45
46
|
TableRow,
|
|
46
47
|
} from '@/components/ui/table';
|
|
47
48
|
import { useDebounce } from '@/hooks/use-debounce';
|
|
49
|
+
import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
|
|
48
50
|
import { useFormDraft } from '@/hooks/use-form-draft';
|
|
49
51
|
import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
|
|
50
52
|
import { formatDateTime } from '@/lib/format-date';
|
|
@@ -136,6 +138,21 @@ type RequestError = {
|
|
|
136
138
|
|
|
137
139
|
const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
|
|
138
140
|
|
|
141
|
+
/**
|
|
142
|
+
* Espelha `DASHBOARD_COMPONENT_ROLE_SORT`
|
|
143
|
+
* (`libraries/core/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts`).
|
|
144
|
+
* Nomes localizados ficam de fora — a ordenação usa o slug da relação to-one.
|
|
145
|
+
*/
|
|
146
|
+
type ComponentRoleSortField = 'id' | 'component_slug' | 'role_slug';
|
|
147
|
+
|
|
148
|
+
const SORT_COLUMNS: readonly SortableColumn<ComponentRoleSortField>[] = [
|
|
149
|
+
{ field: 'id', initialOrder: 'desc' },
|
|
150
|
+
'component_slug',
|
|
151
|
+
'role_slug',
|
|
152
|
+
];
|
|
153
|
+
|
|
154
|
+
const DEFAULT_SORT = { field: 'id', order: 'desc' } as const;
|
|
155
|
+
|
|
139
156
|
export function ComponentRolesTab() {
|
|
140
157
|
const t = useTranslations('core.DashboardManagement');
|
|
141
158
|
const { request, currentLocaleCode, getSettingValue } = useApp();
|
|
@@ -187,6 +204,12 @@ export function ComponentRolesTab() {
|
|
|
187
204
|
const searchQuery = '';
|
|
188
205
|
const debouncedSearch = useDebounce(searchQuery, 500);
|
|
189
206
|
|
|
207
|
+
const sort = useTableSort<ComponentRoleSortField>({
|
|
208
|
+
columns: SORT_COLUMNS,
|
|
209
|
+
defaultSort: DEFAULT_SORT,
|
|
210
|
+
onSortChange: () => setPage(1),
|
|
211
|
+
});
|
|
212
|
+
|
|
190
213
|
const {
|
|
191
214
|
data: paginatedData,
|
|
192
215
|
isLoading,
|
|
@@ -198,11 +221,15 @@ export function ComponentRolesTab() {
|
|
|
198
221
|
pageSize,
|
|
199
222
|
debouncedSearch,
|
|
200
223
|
currentLocaleCode,
|
|
224
|
+
sort.sortField,
|
|
225
|
+
sort.sortOrder,
|
|
201
226
|
],
|
|
202
227
|
queryFn: async () => {
|
|
203
228
|
const params = new URLSearchParams();
|
|
204
229
|
params.set('page', String(page));
|
|
205
230
|
params.set('pageSize', String(pageSize));
|
|
231
|
+
params.set('sortField', sort.sortField);
|
|
232
|
+
params.set('sortOrder', sort.sortOrder);
|
|
206
233
|
if (debouncedSearch) params.set('search', debouncedSearch);
|
|
207
234
|
|
|
208
235
|
const response = await request<{ data: ComponentRole[]; total: number }>({
|
|
@@ -483,9 +510,15 @@ export function ComponentRolesTab() {
|
|
|
483
510
|
<Table>
|
|
484
511
|
<TableHeader>
|
|
485
512
|
<TableRow>
|
|
486
|
-
<
|
|
487
|
-
<
|
|
488
|
-
|
|
513
|
+
<SortableTableHead label="ID" {...sort.getSortProps('id')} />
|
|
514
|
+
<SortableTableHead
|
|
515
|
+
label={t('component')}
|
|
516
|
+
{...sort.getSortProps('component_slug')}
|
|
517
|
+
/>
|
|
518
|
+
<SortableTableHead
|
|
519
|
+
label={t('role')}
|
|
520
|
+
{...sort.getSortProps('role_slug')}
|
|
521
|
+
/>
|
|
489
522
|
<TableHead className="w-25">{t('actions')}</TableHead>
|
|
490
523
|
</TableRow>
|
|
491
524
|
</TableHeader>
|
|
@@ -528,6 +561,7 @@ export function ComponentRolesTab() {
|
|
|
528
561
|
size="icon"
|
|
529
562
|
variant="ghost"
|
|
530
563
|
onClick={() => handleDeleteClick(role.id)}
|
|
564
|
+
tooltip={t('delete')}
|
|
531
565
|
>
|
|
532
566
|
<IconTrash className="size-4" />
|
|
533
567
|
</Button>
|
|
@@ -590,6 +624,7 @@ export function ComponentRolesTab() {
|
|
|
590
624
|
className="size-8"
|
|
591
625
|
onClick={() => setPage(1)}
|
|
592
626
|
disabled={page === 1}
|
|
627
|
+
tooltip={t('goToFirstPage')}
|
|
593
628
|
>
|
|
594
629
|
<IconChevronsLeft className="size-4" />
|
|
595
630
|
</Button>
|
|
@@ -599,6 +634,7 @@ export function ComponentRolesTab() {
|
|
|
599
634
|
className="size-8"
|
|
600
635
|
onClick={() => setPage((p) => Math.max(1, p - 1))}
|
|
601
636
|
disabled={page === 1}
|
|
637
|
+
tooltip={t('goToPreviousPage')}
|
|
602
638
|
>
|
|
603
639
|
<IconChevronLeft className="size-4" />
|
|
604
640
|
</Button>
|
|
@@ -608,6 +644,7 @@ export function ComponentRolesTab() {
|
|
|
608
644
|
className="size-8"
|
|
609
645
|
onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
|
|
610
646
|
disabled={page === totalPages}
|
|
647
|
+
tooltip={t('goToNextPage')}
|
|
611
648
|
>
|
|
612
649
|
<IconChevronRight className="size-4" />
|
|
613
650
|
</Button>
|
|
@@ -617,6 +654,7 @@ export function ComponentRolesTab() {
|
|
|
617
654
|
className="size-8"
|
|
618
655
|
onClick={() => setPage(totalPages)}
|
|
619
656
|
disabled={page === totalPages}
|
|
657
|
+
tooltip={t('goToLastPage')}
|
|
620
658
|
>
|
|
621
659
|
<IconChevronsRight className="size-4" />
|
|
622
660
|
</Button>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { SortableTableHead } from '@/components/entity-list';
|
|
3
4
|
import {
|
|
4
5
|
AlertDialog,
|
|
5
6
|
AlertDialogAction,
|
|
@@ -54,6 +55,7 @@ import {
|
|
|
54
55
|
} from '@/components/ui/tooltip';
|
|
55
56
|
import { useDebounce } from '@/hooks/use-debounce';
|
|
56
57
|
import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
|
|
58
|
+
import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
|
|
57
59
|
import { useApp, useQuery } from '@hed-hog/next-app-provider';
|
|
58
60
|
import * as TablerIcons from '@tabler/icons-react';
|
|
59
61
|
import {
|
|
@@ -113,6 +115,22 @@ interface RoleOption {
|
|
|
113
115
|
|
|
114
116
|
const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
|
|
115
117
|
|
|
118
|
+
/**
|
|
119
|
+
* `DashboardComponentService.getAllComponents` não passa `options.sort` ao
|
|
120
|
+
* `paginate()`, então `slug`/`is_resizable` (colunas flat) já são aceitos em
|
|
121
|
+
* `sortField` sem allowlist própria. Nome (`dashboard_component_locale`,
|
|
122
|
+
* relação), tamanho (largura×altura combinados) e papel (multi-valorado)
|
|
123
|
+
* ficam de fora.
|
|
124
|
+
*/
|
|
125
|
+
type ComponentSortField = 'slug' | 'is_resizable';
|
|
126
|
+
|
|
127
|
+
const SORT_COLUMNS: readonly SortableColumn<ComponentSortField>[] = [
|
|
128
|
+
'slug',
|
|
129
|
+
'is_resizable',
|
|
130
|
+
];
|
|
131
|
+
|
|
132
|
+
const DEFAULT_SORT = { field: 'slug', order: 'asc' } as const;
|
|
133
|
+
|
|
116
134
|
export function ComponentsTab() {
|
|
117
135
|
const t = useTranslations('core.DashboardManagement');
|
|
118
136
|
const { request, locales, currentLocaleCode } = useApp();
|
|
@@ -201,6 +219,12 @@ export function ComponentsTab() {
|
|
|
201
219
|
return <TablerIcons.IconBox className="h-4 w-4" />;
|
|
202
220
|
};
|
|
203
221
|
|
|
222
|
+
const sort = useTableSort<ComponentSortField>({
|
|
223
|
+
columns: SORT_COLUMNS,
|
|
224
|
+
defaultSort: DEFAULT_SORT,
|
|
225
|
+
onSortChange: () => setPage(1),
|
|
226
|
+
});
|
|
227
|
+
|
|
204
228
|
const {
|
|
205
229
|
data: paginatedData,
|
|
206
230
|
isLoading,
|
|
@@ -212,11 +236,15 @@ export function ComponentsTab() {
|
|
|
212
236
|
pageSize,
|
|
213
237
|
debouncedSearch,
|
|
214
238
|
currentLocaleCode,
|
|
239
|
+
sort.sortField,
|
|
240
|
+
sort.sortOrder,
|
|
215
241
|
],
|
|
216
242
|
queryFn: async () => {
|
|
217
243
|
const params = new URLSearchParams();
|
|
218
244
|
params.set('page', String(page));
|
|
219
245
|
params.set('pageSize', String(pageSize));
|
|
246
|
+
params.set('sortField', sort.sortField);
|
|
247
|
+
params.set('sortOrder', sort.sortOrder);
|
|
220
248
|
if (debouncedSearch) params.set('search', debouncedSearch);
|
|
221
249
|
|
|
222
250
|
const response = await request<{ data: Component[]; total: number }>({
|
|
@@ -752,10 +780,16 @@ export function ComponentsTab() {
|
|
|
752
780
|
<Table>
|
|
753
781
|
<TableHeader>
|
|
754
782
|
<TableRow>
|
|
755
|
-
<
|
|
783
|
+
<SortableTableHead
|
|
784
|
+
label={t('slug')}
|
|
785
|
+
{...sort.getSortProps('slug')}
|
|
786
|
+
/>
|
|
756
787
|
<TableHead>{t('name')}</TableHead>
|
|
757
788
|
<TableHead>{t('size')}</TableHead>
|
|
758
|
-
<
|
|
789
|
+
<SortableTableHead
|
|
790
|
+
label={t('resizable')}
|
|
791
|
+
{...sort.getSortProps('is_resizable')}
|
|
792
|
+
/>
|
|
759
793
|
<TableHead>{t('role')}</TableHead>
|
|
760
794
|
<TableHead style={{ width: 100 }}>{t('actions')}</TableHead>
|
|
761
795
|
</TableRow>
|
|
@@ -889,6 +923,7 @@ export function ComponentsTab() {
|
|
|
889
923
|
size="icon"
|
|
890
924
|
variant="ghost"
|
|
891
925
|
onClick={() => handleEdit(component)}
|
|
926
|
+
tooltip={t('editComponent')}
|
|
892
927
|
>
|
|
893
928
|
<IconEdit className="size-4" />
|
|
894
929
|
</Button>
|
|
@@ -896,6 +931,7 @@ export function ComponentsTab() {
|
|
|
896
931
|
size="icon"
|
|
897
932
|
variant="ghost"
|
|
898
933
|
onClick={() => handleDeleteClick(component.id)}
|
|
934
|
+
tooltip={t('delete')}
|
|
899
935
|
>
|
|
900
936
|
<IconTrash className="size-4" />
|
|
901
937
|
</Button>
|
|
@@ -959,6 +995,7 @@ export function ComponentsTab() {
|
|
|
959
995
|
className="size-8"
|
|
960
996
|
onClick={() => setPage(1)}
|
|
961
997
|
disabled={page === 1}
|
|
998
|
+
tooltip={t('goToFirstPage')}
|
|
962
999
|
>
|
|
963
1000
|
<IconChevronsLeft className="size-4" />
|
|
964
1001
|
</Button>
|
|
@@ -968,6 +1005,7 @@ export function ComponentsTab() {
|
|
|
968
1005
|
className="size-8"
|
|
969
1006
|
onClick={() => setPage((p) => Math.max(1, p - 1))}
|
|
970
1007
|
disabled={page === 1}
|
|
1008
|
+
tooltip={t('goToPreviousPage')}
|
|
971
1009
|
>
|
|
972
1010
|
<IconChevronLeft className="size-4" />
|
|
973
1011
|
</Button>
|
|
@@ -977,6 +1015,7 @@ export function ComponentsTab() {
|
|
|
977
1015
|
className="size-8"
|
|
978
1016
|
onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
|
|
979
1017
|
disabled={page === totalPages}
|
|
1018
|
+
tooltip={t('goToNextPage')}
|
|
980
1019
|
>
|
|
981
1020
|
<IconChevronRight className="size-4" />
|
|
982
1021
|
</Button>
|
|
@@ -986,6 +1025,7 @@ export function ComponentsTab() {
|
|
|
986
1025
|
className="size-8"
|
|
987
1026
|
onClick={() => setPage(totalPages)}
|
|
988
1027
|
disabled={page === totalPages}
|
|
1028
|
+
tooltip={t('goToLastPage')}
|
|
989
1029
|
>
|
|
990
1030
|
<IconChevronsRight className="size-4" />
|
|
991
1031
|
</Button>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { SortableTableHead } from '@/components/entity-list';
|
|
3
4
|
import {
|
|
4
5
|
AlertDialog,
|
|
5
6
|
AlertDialogAction,
|
|
@@ -45,6 +46,7 @@ import {
|
|
|
45
46
|
TableRow,
|
|
46
47
|
} from '@/components/ui/table';
|
|
47
48
|
import { useDebounce } from '@/hooks/use-debounce';
|
|
49
|
+
import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
|
|
48
50
|
import { useFormDraft } from '@/hooks/use-form-draft';
|
|
49
51
|
import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
|
|
50
52
|
import { formatDateTime } from '@/lib/format-date';
|
|
@@ -135,6 +137,21 @@ type RequestError = {
|
|
|
135
137
|
|
|
136
138
|
const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
|
|
137
139
|
|
|
140
|
+
/**
|
|
141
|
+
* Espelha `DASHBOARD_ROLE_SORT`
|
|
142
|
+
* (`libraries/core/src/dashboard/dashboard-role/dashboard-role.sort.ts`).
|
|
143
|
+
* Nomes localizados ficam de fora — a ordenação usa o slug da relação to-one.
|
|
144
|
+
*/
|
|
145
|
+
type DashboardRoleSortField = 'id' | 'dashboard_slug' | 'role_slug';
|
|
146
|
+
|
|
147
|
+
const SORT_COLUMNS: readonly SortableColumn<DashboardRoleSortField>[] = [
|
|
148
|
+
{ field: 'id', initialOrder: 'desc' },
|
|
149
|
+
'dashboard_slug',
|
|
150
|
+
'role_slug',
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
const DEFAULT_SORT = { field: 'id', order: 'desc' } as const;
|
|
154
|
+
|
|
138
155
|
export function DashboardRolesTab() {
|
|
139
156
|
const t = useTranslations('core.DashboardManagement');
|
|
140
157
|
const { request, currentLocaleCode, getSettingValue } = useApp();
|
|
@@ -186,6 +203,12 @@ export function DashboardRolesTab() {
|
|
|
186
203
|
const searchQuery = '';
|
|
187
204
|
const debouncedSearch = useDebounce(searchQuery, 500);
|
|
188
205
|
|
|
206
|
+
const sort = useTableSort<DashboardRoleSortField>({
|
|
207
|
+
columns: SORT_COLUMNS,
|
|
208
|
+
defaultSort: DEFAULT_SORT,
|
|
209
|
+
onSortChange: () => setPage(1),
|
|
210
|
+
});
|
|
211
|
+
|
|
189
212
|
const {
|
|
190
213
|
data: paginatedData,
|
|
191
214
|
isLoading,
|
|
@@ -197,11 +220,15 @@ export function DashboardRolesTab() {
|
|
|
197
220
|
pageSize,
|
|
198
221
|
debouncedSearch,
|
|
199
222
|
currentLocaleCode,
|
|
223
|
+
sort.sortField,
|
|
224
|
+
sort.sortOrder,
|
|
200
225
|
],
|
|
201
226
|
queryFn: async () => {
|
|
202
227
|
const params = new URLSearchParams();
|
|
203
228
|
params.set('page', String(page));
|
|
204
229
|
params.set('pageSize', String(pageSize));
|
|
230
|
+
params.set('sortField', sort.sortField);
|
|
231
|
+
params.set('sortOrder', sort.sortOrder);
|
|
205
232
|
if (debouncedSearch) params.set('search', debouncedSearch);
|
|
206
233
|
|
|
207
234
|
const response = await request<{ data: DashboardRole[]; total: number }>({
|
|
@@ -482,9 +509,15 @@ export function DashboardRolesTab() {
|
|
|
482
509
|
<Table>
|
|
483
510
|
<TableHeader>
|
|
484
511
|
<TableRow>
|
|
485
|
-
<
|
|
486
|
-
<
|
|
487
|
-
|
|
512
|
+
<SortableTableHead label="ID" {...sort.getSortProps('id')} />
|
|
513
|
+
<SortableTableHead
|
|
514
|
+
label={t('dashboard')}
|
|
515
|
+
{...sort.getSortProps('dashboard_slug')}
|
|
516
|
+
/>
|
|
517
|
+
<SortableTableHead
|
|
518
|
+
label={t('role')}
|
|
519
|
+
{...sort.getSortProps('role_slug')}
|
|
520
|
+
/>
|
|
488
521
|
<TableHead className="w-25">{t('actions')}</TableHead>
|
|
489
522
|
</TableRow>
|
|
490
523
|
</TableHeader>
|
|
@@ -527,6 +560,7 @@ export function DashboardRolesTab() {
|
|
|
527
560
|
size="icon"
|
|
528
561
|
variant="ghost"
|
|
529
562
|
onClick={() => handleDeleteClick(role.id)}
|
|
563
|
+
tooltip={t('delete')}
|
|
530
564
|
>
|
|
531
565
|
<IconTrash className="size-4" />
|
|
532
566
|
</Button>
|
|
@@ -589,6 +623,7 @@ export function DashboardRolesTab() {
|
|
|
589
623
|
className="size-8"
|
|
590
624
|
onClick={() => setPage(1)}
|
|
591
625
|
disabled={page === 1}
|
|
626
|
+
tooltip={t('goToFirstPage')}
|
|
592
627
|
>
|
|
593
628
|
<IconChevronsLeft className="size-4" />
|
|
594
629
|
</Button>
|
|
@@ -598,6 +633,7 @@ export function DashboardRolesTab() {
|
|
|
598
633
|
className="size-8"
|
|
599
634
|
onClick={() => setPage((p) => Math.max(1, p - 1))}
|
|
600
635
|
disabled={page === 1}
|
|
636
|
+
tooltip={t('goToPreviousPage')}
|
|
601
637
|
>
|
|
602
638
|
<IconChevronLeft className="size-4" />
|
|
603
639
|
</Button>
|
|
@@ -607,6 +643,7 @@ export function DashboardRolesTab() {
|
|
|
607
643
|
className="size-8"
|
|
608
644
|
onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
|
|
609
645
|
disabled={page === totalPages}
|
|
646
|
+
tooltip={t('goToNextPage')}
|
|
610
647
|
>
|
|
611
648
|
<IconChevronRight className="size-4" />
|
|
612
649
|
</Button>
|
|
@@ -616,6 +653,7 @@ export function DashboardRolesTab() {
|
|
|
616
653
|
className="size-8"
|
|
617
654
|
onClick={() => setPage(totalPages)}
|
|
618
655
|
disabled={page === totalPages}
|
|
656
|
+
tooltip={t('goToLastPage')}
|
|
619
657
|
>
|
|
620
658
|
<IconChevronsRight className="size-4" />
|
|
621
659
|
</Button>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import { SortableTableHead } from '@/components/entity-list';
|
|
3
4
|
import {
|
|
4
5
|
AlertDialog,
|
|
5
6
|
AlertDialogAction,
|
|
@@ -54,6 +55,7 @@ import {
|
|
|
54
55
|
} from '@/components/ui/tooltip';
|
|
55
56
|
import { useDebounce } from '@/hooks/use-debounce';
|
|
56
57
|
import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
|
|
58
|
+
import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
|
|
57
59
|
import { useApp, useQuery } from '@hed-hog/next-app-provider';
|
|
58
60
|
import {
|
|
59
61
|
IconChevronLeft,
|
|
@@ -100,6 +102,23 @@ interface RoleOption {
|
|
|
100
102
|
|
|
101
103
|
const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
|
|
102
104
|
|
|
105
|
+
/**
|
|
106
|
+
* `DashboardService.getAllDashboards` não passa `options.sort` ao
|
|
107
|
+
* `paginate()`, então qualquer coluna flat do model já é aceita em
|
|
108
|
+
* `sortField` sem allowlist própria. Nome (`dashboard_locale`, relação) e
|
|
109
|
+
* papel (multi-valorado) ficam de fora: o primeiro exigiria filtrar o
|
|
110
|
+
* `include` por idioma (e adicionar `@Locale()` ao endpoint, uma mudança
|
|
111
|
+
* maior que esta tarefa pede), o segundo não é um valor único por linha.
|
|
112
|
+
*/
|
|
113
|
+
type DashboardSortField = 'id' | 'slug';
|
|
114
|
+
|
|
115
|
+
const SORT_COLUMNS: readonly SortableColumn<DashboardSortField>[] = [
|
|
116
|
+
{ field: 'id', initialOrder: 'desc' },
|
|
117
|
+
'slug',
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
const DEFAULT_SORT = { field: 'id', order: 'desc' } as const;
|
|
121
|
+
|
|
103
122
|
export function DashboardsTab() {
|
|
104
123
|
const t = useTranslations('core.DashboardManagement');
|
|
105
124
|
const { request, locales, currentLocaleCode } = useApp();
|
|
@@ -160,6 +179,11 @@ export function DashboardsTab() {
|
|
|
160
179
|
const [searchQuery, setSearchQuery] = useState('');
|
|
161
180
|
const [roleSearchQuery, setRoleSearchQuery] = useState('');
|
|
162
181
|
const debouncedSearch = useDebounce(searchQuery, 500);
|
|
182
|
+
const sort = useTableSort<DashboardSortField>({
|
|
183
|
+
columns: SORT_COLUMNS,
|
|
184
|
+
defaultSort: DEFAULT_SORT,
|
|
185
|
+
onSortChange: () => setPage(1),
|
|
186
|
+
});
|
|
163
187
|
|
|
164
188
|
const {
|
|
165
189
|
data: paginatedData,
|
|
@@ -172,11 +196,15 @@ export function DashboardsTab() {
|
|
|
172
196
|
pageSize,
|
|
173
197
|
debouncedSearch,
|
|
174
198
|
currentLocaleCode,
|
|
199
|
+
sort.sortField,
|
|
200
|
+
sort.sortOrder,
|
|
175
201
|
],
|
|
176
202
|
queryFn: async () => {
|
|
177
203
|
const params = new URLSearchParams();
|
|
178
204
|
params.set('page', String(page));
|
|
179
205
|
params.set('pageSize', String(pageSize));
|
|
206
|
+
params.set('sortField', sort.sortField);
|
|
207
|
+
params.set('sortOrder', sort.sortOrder);
|
|
180
208
|
if (debouncedSearch) params.set('search', debouncedSearch);
|
|
181
209
|
|
|
182
210
|
const response = await request<{ data: Dashboard[]; total: number }>({
|
|
@@ -513,8 +541,11 @@ export function DashboardsTab() {
|
|
|
513
541
|
<Table>
|
|
514
542
|
<TableHeader>
|
|
515
543
|
<TableRow>
|
|
516
|
-
<
|
|
517
|
-
<
|
|
544
|
+
<SortableTableHead label={t('id')} {...sort.getSortProps('id')} />
|
|
545
|
+
<SortableTableHead
|
|
546
|
+
label={t('slug')}
|
|
547
|
+
{...sort.getSortProps('slug')}
|
|
548
|
+
/>
|
|
518
549
|
<TableHead>{t('name')}</TableHead>
|
|
519
550
|
<TableHead>{t('role')}</TableHead>
|
|
520
551
|
<TableHead className="w-25">{t('actions')}</TableHead>
|
|
@@ -631,7 +662,7 @@ export function DashboardsTab() {
|
|
|
631
662
|
size="icon"
|
|
632
663
|
variant="ghost"
|
|
633
664
|
onClick={() => handleEdit(dashboard)}
|
|
634
|
-
|
|
665
|
+
tooltip={t('editDashboardTitle')}
|
|
635
666
|
>
|
|
636
667
|
<IconEdit className="size-4" />
|
|
637
668
|
</Button>
|
|
@@ -639,7 +670,7 @@ export function DashboardsTab() {
|
|
|
639
670
|
size="icon"
|
|
640
671
|
variant="ghost"
|
|
641
672
|
onClick={() => handleDeleteClick(dashboard.id)}
|
|
642
|
-
|
|
673
|
+
tooltip={t('deleteDashboardTitle')}
|
|
643
674
|
>
|
|
644
675
|
<IconTrash className="size-4" />
|
|
645
676
|
</Button>
|
|
@@ -703,6 +734,7 @@ export function DashboardsTab() {
|
|
|
703
734
|
className="size-8"
|
|
704
735
|
onClick={() => setPage(1)}
|
|
705
736
|
disabled={page === 1}
|
|
737
|
+
tooltip={t('goToFirstPage')}
|
|
706
738
|
>
|
|
707
739
|
<IconChevronsLeft className="size-4" />
|
|
708
740
|
</Button>
|
|
@@ -712,6 +744,7 @@ export function DashboardsTab() {
|
|
|
712
744
|
className="size-8"
|
|
713
745
|
onClick={() => setPage((p) => Math.max(1, p - 1))}
|
|
714
746
|
disabled={page === 1}
|
|
747
|
+
tooltip={t('goToPreviousPage')}
|
|
715
748
|
>
|
|
716
749
|
<IconChevronLeft className="size-4" />
|
|
717
750
|
</Button>
|
|
@@ -721,6 +754,7 @@ export function DashboardsTab() {
|
|
|
721
754
|
className="size-8"
|
|
722
755
|
onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
|
|
723
756
|
disabled={page === totalPages}
|
|
757
|
+
tooltip={t('goToNextPage')}
|
|
724
758
|
>
|
|
725
759
|
<IconChevronRight className="size-4" />
|
|
726
760
|
</Button>
|
|
@@ -730,6 +764,7 @@ export function DashboardsTab() {
|
|
|
730
764
|
className="size-8"
|
|
731
765
|
onClick={() => setPage(totalPages)}
|
|
732
766
|
disabled={page === totalPages}
|
|
767
|
+
tooltip={t('goToLastPage')}
|
|
733
768
|
>
|
|
734
769
|
<IconChevronsRight className="size-4" />
|
|
735
770
|
</Button>
|