380 intranet visualizar data de cadastros desativados - #384

Merged
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados
Jun 9, 2026
Merged

380 intranet visualizar data de cadastros desativados#384
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados

Conversation

@GRHInvDev

@GRHInvDevGRHInvDev commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Navigation menu now displays a popover for child items when the sidebar is collapsed.
  • Bug Fixes

    • Improved access control and authorization for the emotion ruler form.
  • Chores

    • Removed flyers section from the content feed; tabs now display Posts, Events, and Birthdays only.
    • Version bumped to 1.36.2.

rbxyzand others added 2 commits June 8, 2026 18:10
…ebar colapsada
- /news: remove a aba "Encartes" (módulo desativado) e queries/import órfãos
- Sidebar colapsada: filhos de grupo (Eventos, Notícias, etc.) agora acessíveis
via flyout (Popover), já que o accordion inline exige !collapsed e os ocultava
- Bump de versão para 1.36.1 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…vidor)
Módulo não liberado: autorização passa a ser server-authoritative via
can_view_emotion_ruler (ou sudo), nunca TOTEM/desativado.
- access-control: novo helper canViewEmotionRuler (reutilizável)
- emotion-ruler router: gate em getActive, createResponse, registerAccess e
registerDismissal (createResponse antes não tinha NENHUMA checagem)
- /forms/emotion-ruler: page vira server component com guard + redirect; UI
extraída para EmotionRulerResponseForm (client)
- sidebar/quick-access (routes.ts): item gated por permissão em vez de "novidades"
- Bump de versão para 1.36.2 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

You don't have permission to create a Preview Deployment for this Vercel project: elo.

View Documentation: https://vercel.com/docs/accounts/team-members-and-roles

@GRHInvDev
GRHInvDev merged commit 804276d into mainJun 9, 2026
4 of 6 checks passed
@coderabbitai

coderabbitaiBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c6452697-d90c-414d-bd1f-1ebba774aa2c

📥 Commits

Reviewing files that changed from the base of the PR and between e3f678f and 98e0227.

📒 Files selected for processing (8)
  • package.json
  • src/app/(authenticated)/forms/emotion-ruler/page.tsx
  • src/components/emotion-ruler/emotion-ruler-response-form.tsx
  • src/components/news/content-feed.tsx
  • src/components/ui/main-nav.tsx
  • src/const/routes.ts
  • src/lib/access-control.ts
  • src/server/api/routers/emotion-ruler.ts

📝 Walkthrough

Walkthrough

This PR refactors emotion-ruler to enforce role-based access control, transitioning the page from a client-side component to a server-side protected route. The new canViewEmotionRuler helper gates access across the page, API, and routing layers. Interactive UI is extracted into a new client component. Additionally, flyers are removed from the content feed and collapsed sidebar navigation now uses popovers.

Changes

Emotion-Ruler Access Control

Layer / File(s)Summary
Access control helper for emotion-ruler
src/lib/access-control.ts
New canViewEmotionRuler(roleConfig) determines permission based on role config, denying TOTEM users and those without the can_view_emotion_ruler flag, except sudo users.
Page server-side refactoring with auth guard
src/app/(authenticated)/forms/emotion-ruler/page.tsx
Page becomes async server component that checks Clerk authentication, fetches user role config, enforces canViewEmotionRuler check, redirects unauthorized users, and delegates to EmotionRulerResponseForm.
Client emotion response form component
src/components/emotion-ruler/emotion-ruler-response-form.tsx
New client component fetches active ruler, renders animated emotion-selection grid with states, optional comment input, and tRPC mutation for response submission with loading/success/error feedback.
API router authorization enforcement
src/server/api/routers/emotion-ruler.ts
Procedures (getActive, registerAccess, registerDismissal, createResponse) enforce canViewEmotionRuler permission check, returning null for queries or throwing FORBIDDEN for mutations when unauthorized.
Route menu item visibility gating
src/const/routes.ts
"Régua de Emoções" route is conditionally included based on canViewEmotionRuler(roleConfig) instead of the novidades flag.
Version bump
package.json
Version updated from 1.36.0 to 1.36.2.

Content-Feed Flyers Removal

Layer / File(s)Summary
Remove flyers from content feed
src/components/news/content-feed.tsx
Flyer-related imports, data wiring, and the entire flyers tab are removed; tabs header reduced from 4 to 3 columns (Posts, Events, Birthdays remain).

Sidebar Collapsed Navigation Enhancement

Layer / File(s)Summary
Popover flyout for collapsed navigation groups
src/components/ui/main-nav.tsx
When sidebar is collapsed, navigation groups with children render a popover flyout showing child links instead of inline expansion; active-child styling applied to trigger button.

Sequence Diagram(s)

sequenceDiagram
participant User
participant EmotionRulerPage as EmotionRulerPage Server
participant Clerk
participant UserAPI as api.user.me
participant AuthControl as canViewEmotionRuler
participant EmotionRulerForm as EmotionRulerResponseForm
User->>EmotionRulerPage: Request /forms/emotion-ruler
EmotionRulerPage->>Clerk: currentUser()
alt Not Authenticated
EmotionRulerPage-->>User: redirect /sign-in
else Authenticated
EmotionRulerPage->>UserAPI: Fetch current user data
UserAPI-->>EmotionRulerPage: User with role_config
EmotionRulerPage->>AuthControl: Check canViewEmotionRuler
alt Not Authorized
EmotionRulerPage-->>User: redirect /forms
else Authorized
EmotionRulerPage->>EmotionRulerForm: Render component
EmotionRulerForm-->>User: Return UI
end
end
Loading
sequenceDiagram
participant User
participant EmotionRulerForm
participant tRPCQuery as getActive Query
participant tRPCMutation as createResponse Mutation
participant Feedback as Toast/UI
EmotionRulerForm->>tRPCQuery: Fetch active ruler
tRPCQuery-->>EmotionRulerForm: Ruler data
EmotionRulerForm->>User: Render emotion grid
User->>EmotionRulerForm: Select emotion level
EmotionRulerForm->>User: Show selected emotion panel
User->>EmotionRulerForm: Optional comment + Submit
EmotionRulerForm->>tRPCMutation: createResponse(rulerId, emotionValue, comment)
alt Submission Success
tRPCMutation-->>EmotionRulerForm: Response created
EmotionRulerForm->>Feedback: Success toast
EmotionRulerForm->>tRPCQuery: Refetch ruler data
EmotionRulerForm->>User: Reset form state
else Submission Error
tRPCMutation-->>EmotionRulerForm: Error
EmotionRulerForm->>Feedback: Error toast
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • GRHInvDev/elo#327: Prior emotion-ruler visibility gating via novidades flag; this PR replaces that with canViewEmotionRuler role-based access control.
  • GRHInvDev/elo#369: Implements permission gating for "Régua de Emoções" using can_view_emotion_ruler role flag and related access-control updates.
  • GRHInvDev/elo#314: Foundational emotion-ruler module implementation; this PR adds the new canViewEmotionRuler authorization layer on top of existing procedures.

Poem

🐰 A rabbit's verse on rules and walls:
Guards now stand at emotion's halls,
Server-side the checks are cast,
While flyers fly away so fast!
And when sidebars shrink and fold,
Popovers burst with stories bold.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 380-intranet---visualizar-data-de-cadastros-desativados

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GRHInvDev@rbxyz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

380 intranet visualizar data de cadastros desativados - #384

Merged
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados
Jun 9, 2026
Merged

380 intranet visualizar data de cadastros desativados#384
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados

Conversation

@GRHInvDev

@GRHInvDevGRHInvDev commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Navigation menu now displays a popover for child items when the sidebar is collapsed.
  • Bug Fixes

    • Improved access control and authorization for the emotion ruler form.
  • Chores

    • Removed flyers section from the content feed; tabs now display Posts, Events, and Birthdays only.
    • Version bumped to 1.36.2.

rbxyzand others added 2 commits June 8, 2026 18:10
…ebar colapsada
- /news: remove a aba "Encartes" (módulo desativado) e queries/import órfãos
- Sidebar colapsada: filhos de grupo (Eventos, Notícias, etc.) agora acessíveis
via flyout (Popover), já que o accordion inline exige !collapsed e os ocultava
- Bump de versão para 1.36.1 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…vidor)
Módulo não liberado: autorização passa a ser server-authoritative via
can_view_emotion_ruler (ou sudo), nunca TOTEM/desativado.
- access-control: novo helper canViewEmotionRuler (reutilizável)
- emotion-ruler router: gate em getActive, createResponse, registerAccess e
registerDismissal (createResponse antes não tinha NENHUMA checagem)
- /forms/emotion-ruler: page vira server component com guard + redirect; UI
extraída para EmotionRulerResponseForm (client)
- sidebar/quick-access (routes.ts): item gated por permissão em vez de "novidades"
- Bump de versão para 1.36.2 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

You don't have permission to create a Preview Deployment for this Vercel project: elo.

View Documentation: https://vercel.com/docs/accounts/team-members-and-roles

@GRHInvDev
GRHInvDev merged commit 804276d into mainJun 9, 2026
4 of 6 checks passed
@coderabbitai

coderabbitaiBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c6452697-d90c-414d-bd1f-1ebba774aa2c

📥 Commits

Reviewing files that changed from the base of the PR and between e3f678f and 98e0227.

📒 Files selected for processing (8)
  • package.json
  • src/app/(authenticated)/forms/emotion-ruler/page.tsx
  • src/components/emotion-ruler/emotion-ruler-response-form.tsx
  • src/components/news/content-feed.tsx
  • src/components/ui/main-nav.tsx
  • src/const/routes.ts
  • src/lib/access-control.ts
  • src/server/api/routers/emotion-ruler.ts

📝 Walkthrough

Walkthrough

This PR refactors emotion-ruler to enforce role-based access control, transitioning the page from a client-side component to a server-side protected route. The new canViewEmotionRuler helper gates access across the page, API, and routing layers. Interactive UI is extracted into a new client component. Additionally, flyers are removed from the content feed and collapsed sidebar navigation now uses popovers.

Changes

Emotion-Ruler Access Control

Layer / File(s)Summary
Access control helper for emotion-ruler
src/lib/access-control.ts
New canViewEmotionRuler(roleConfig) determines permission based on role config, denying TOTEM users and those without the can_view_emotion_ruler flag, except sudo users.
Page server-side refactoring with auth guard
src/app/(authenticated)/forms/emotion-ruler/page.tsx
Page becomes async server component that checks Clerk authentication, fetches user role config, enforces canViewEmotionRuler check, redirects unauthorized users, and delegates to EmotionRulerResponseForm.
Client emotion response form component
src/components/emotion-ruler/emotion-ruler-response-form.tsx
New client component fetches active ruler, renders animated emotion-selection grid with states, optional comment input, and tRPC mutation for response submission with loading/success/error feedback.
API router authorization enforcement
src/server/api/routers/emotion-ruler.ts
Procedures (getActive, registerAccess, registerDismissal, createResponse) enforce canViewEmotionRuler permission check, returning null for queries or throwing FORBIDDEN for mutations when unauthorized.
Route menu item visibility gating
src/const/routes.ts
"Régua de Emoções" route is conditionally included based on canViewEmotionRuler(roleConfig) instead of the novidades flag.
Version bump
package.json
Version updated from 1.36.0 to 1.36.2.

Content-Feed Flyers Removal

Layer / File(s)Summary
Remove flyers from content feed
src/components/news/content-feed.tsx
Flyer-related imports, data wiring, and the entire flyers tab are removed; tabs header reduced from 4 to 3 columns (Posts, Events, Birthdays remain).

Sidebar Collapsed Navigation Enhancement

Layer / File(s)Summary
Popover flyout for collapsed navigation groups
src/components/ui/main-nav.tsx
When sidebar is collapsed, navigation groups with children render a popover flyout showing child links instead of inline expansion; active-child styling applied to trigger button.

Sequence Diagram(s)

sequenceDiagram
participant User
participant EmotionRulerPage as EmotionRulerPage Server
participant Clerk
participant UserAPI as api.user.me
participant AuthControl as canViewEmotionRuler
participant EmotionRulerForm as EmotionRulerResponseForm
User->>EmotionRulerPage: Request /forms/emotion-ruler
EmotionRulerPage->>Clerk: currentUser()
alt Not Authenticated
EmotionRulerPage-->>User: redirect /sign-in
else Authenticated
EmotionRulerPage->>UserAPI: Fetch current user data
UserAPI-->>EmotionRulerPage: User with role_config
EmotionRulerPage->>AuthControl: Check canViewEmotionRuler
alt Not Authorized
EmotionRulerPage-->>User: redirect /forms
else Authorized
EmotionRulerPage->>EmotionRulerForm: Render component
EmotionRulerForm-->>User: Return UI
end
end
Loading
sequenceDiagram
participant User
participant EmotionRulerForm
participant tRPCQuery as getActive Query
participant tRPCMutation as createResponse Mutation
participant Feedback as Toast/UI
EmotionRulerForm->>tRPCQuery: Fetch active ruler
tRPCQuery-->>EmotionRulerForm: Ruler data
EmotionRulerForm->>User: Render emotion grid
User->>EmotionRulerForm: Select emotion level
EmotionRulerForm->>User: Show selected emotion panel
User->>EmotionRulerForm: Optional comment + Submit
EmotionRulerForm->>tRPCMutation: createResponse(rulerId, emotionValue, comment)
alt Submission Success
tRPCMutation-->>EmotionRulerForm: Response created
EmotionRulerForm->>Feedback: Success toast
EmotionRulerForm->>tRPCQuery: Refetch ruler data
EmotionRulerForm->>User: Reset form state
else Submission Error
tRPCMutation-->>EmotionRulerForm: Error
EmotionRulerForm->>Feedback: Error toast
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • GRHInvDev/elo#327: Prior emotion-ruler visibility gating via novidades flag; this PR replaces that with canViewEmotionRuler role-based access control.
  • GRHInvDev/elo#369: Implements permission gating for "Régua de Emoções" using can_view_emotion_ruler role flag and related access-control updates.
  • GRHInvDev/elo#314: Foundational emotion-ruler module implementation; this PR adds the new canViewEmotionRuler authorization layer on top of existing procedures.

Poem

🐰 A rabbit's verse on rules and walls:
Guards now stand at emotion's halls,
Server-side the checks are cast,
While flyers fly away so fast!
And when sidebars shrink and fold,
Popovers burst with stories bold.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 380-intranet---visualizar-data-de-cadastros-desativados

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GRHInvDev@rbxyz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

380 intranet visualizar data de cadastros desativados - #384

Merged
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados
Jun 9, 2026
Merged

380 intranet visualizar data de cadastros desativados#384
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados

Conversation

@GRHInvDev

@GRHInvDevGRHInvDev commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Navigation menu now displays a popover for child items when the sidebar is collapsed.
  • Bug Fixes

    • Improved access control and authorization for the emotion ruler form.
  • Chores

    • Removed flyers section from the content feed; tabs now display Posts, Events, and Birthdays only.
    • Version bumped to 1.36.2.

rbxyzand others added 2 commits June 8, 2026 18:10
…ebar colapsada
- /news: remove a aba "Encartes" (módulo desativado) e queries/import órfãos
- Sidebar colapsada: filhos de grupo (Eventos, Notícias, etc.) agora acessíveis
via flyout (Popover), já que o accordion inline exige !collapsed e os ocultava
- Bump de versão para 1.36.1 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…vidor)
Módulo não liberado: autorização passa a ser server-authoritative via
can_view_emotion_ruler (ou sudo), nunca TOTEM/desativado.
- access-control: novo helper canViewEmotionRuler (reutilizável)
- emotion-ruler router: gate em getActive, createResponse, registerAccess e
registerDismissal (createResponse antes não tinha NENHUMA checagem)
- /forms/emotion-ruler: page vira server component com guard + redirect; UI
extraída para EmotionRulerResponseForm (client)
- sidebar/quick-access (routes.ts): item gated por permissão em vez de "novidades"
- Bump de versão para 1.36.2 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

You don't have permission to create a Preview Deployment for this Vercel project: elo.

View Documentation: https://vercel.com/docs/accounts/team-members-and-roles

@GRHInvDev
GRHInvDev merged commit 804276d into mainJun 9, 2026
4 of 6 checks passed
@coderabbitai

coderabbitaiBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c6452697-d90c-414d-bd1f-1ebba774aa2c

📥 Commits

Reviewing files that changed from the base of the PR and between e3f678f and 98e0227.

📒 Files selected for processing (8)
  • package.json
  • src/app/(authenticated)/forms/emotion-ruler/page.tsx
  • src/components/emotion-ruler/emotion-ruler-response-form.tsx
  • src/components/news/content-feed.tsx
  • src/components/ui/main-nav.tsx
  • src/const/routes.ts
  • src/lib/access-control.ts
  • src/server/api/routers/emotion-ruler.ts

📝 Walkthrough

Walkthrough

This PR refactors emotion-ruler to enforce role-based access control, transitioning the page from a client-side component to a server-side protected route. The new canViewEmotionRuler helper gates access across the page, API, and routing layers. Interactive UI is extracted into a new client component. Additionally, flyers are removed from the content feed and collapsed sidebar navigation now uses popovers.

Changes

Emotion-Ruler Access Control

Layer / File(s)Summary
Access control helper for emotion-ruler
src/lib/access-control.ts
New canViewEmotionRuler(roleConfig) determines permission based on role config, denying TOTEM users and those without the can_view_emotion_ruler flag, except sudo users.
Page server-side refactoring with auth guard
src/app/(authenticated)/forms/emotion-ruler/page.tsx
Page becomes async server component that checks Clerk authentication, fetches user role config, enforces canViewEmotionRuler check, redirects unauthorized users, and delegates to EmotionRulerResponseForm.
Client emotion response form component
src/components/emotion-ruler/emotion-ruler-response-form.tsx
New client component fetches active ruler, renders animated emotion-selection grid with states, optional comment input, and tRPC mutation for response submission with loading/success/error feedback.
API router authorization enforcement
src/server/api/routers/emotion-ruler.ts
Procedures (getActive, registerAccess, registerDismissal, createResponse) enforce canViewEmotionRuler permission check, returning null for queries or throwing FORBIDDEN for mutations when unauthorized.
Route menu item visibility gating
src/const/routes.ts
"Régua de Emoções" route is conditionally included based on canViewEmotionRuler(roleConfig) instead of the novidades flag.
Version bump
package.json
Version updated from 1.36.0 to 1.36.2.

Content-Feed Flyers Removal

Layer / File(s)Summary
Remove flyers from content feed
src/components/news/content-feed.tsx
Flyer-related imports, data wiring, and the entire flyers tab are removed; tabs header reduced from 4 to 3 columns (Posts, Events, Birthdays remain).

Sidebar Collapsed Navigation Enhancement

Layer / File(s)Summary
Popover flyout for collapsed navigation groups
src/components/ui/main-nav.tsx
When sidebar is collapsed, navigation groups with children render a popover flyout showing child links instead of inline expansion; active-child styling applied to trigger button.

Sequence Diagram(s)

sequenceDiagram
participant User
participant EmotionRulerPage as EmotionRulerPage Server
participant Clerk
participant UserAPI as api.user.me
participant AuthControl as canViewEmotionRuler
participant EmotionRulerForm as EmotionRulerResponseForm
User->>EmotionRulerPage: Request /forms/emotion-ruler
EmotionRulerPage->>Clerk: currentUser()
alt Not Authenticated
EmotionRulerPage-->>User: redirect /sign-in
else Authenticated
EmotionRulerPage->>UserAPI: Fetch current user data
UserAPI-->>EmotionRulerPage: User with role_config
EmotionRulerPage->>AuthControl: Check canViewEmotionRuler
alt Not Authorized
EmotionRulerPage-->>User: redirect /forms
else Authorized
EmotionRulerPage->>EmotionRulerForm: Render component
EmotionRulerForm-->>User: Return UI
end
end
Loading
sequenceDiagram
participant User
participant EmotionRulerForm
participant tRPCQuery as getActive Query
participant tRPCMutation as createResponse Mutation
participant Feedback as Toast/UI
EmotionRulerForm->>tRPCQuery: Fetch active ruler
tRPCQuery-->>EmotionRulerForm: Ruler data
EmotionRulerForm->>User: Render emotion grid
User->>EmotionRulerForm: Select emotion level
EmotionRulerForm->>User: Show selected emotion panel
User->>EmotionRulerForm: Optional comment + Submit
EmotionRulerForm->>tRPCMutation: createResponse(rulerId, emotionValue, comment)
alt Submission Success
tRPCMutation-->>EmotionRulerForm: Response created
EmotionRulerForm->>Feedback: Success toast
EmotionRulerForm->>tRPCQuery: Refetch ruler data
EmotionRulerForm->>User: Reset form state
else Submission Error
tRPCMutation-->>EmotionRulerForm: Error
EmotionRulerForm->>Feedback: Error toast
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • GRHInvDev/elo#327: Prior emotion-ruler visibility gating via novidades flag; this PR replaces that with canViewEmotionRuler role-based access control.
  • GRHInvDev/elo#369: Implements permission gating for "Régua de Emoções" using can_view_emotion_ruler role flag and related access-control updates.
  • GRHInvDev/elo#314: Foundational emotion-ruler module implementation; this PR adds the new canViewEmotionRuler authorization layer on top of existing procedures.

Poem

🐰 A rabbit's verse on rules and walls:
Guards now stand at emotion's halls,
Server-side the checks are cast,
While flyers fly away so fast!
And when sidebars shrink and fold,
Popovers burst with stories bold.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 380-intranet---visualizar-data-de-cadastros-desativados

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GRHInvDev@rbxyz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

380 intranet visualizar data de cadastros desativados - #384

Merged
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados
Jun 9, 2026
Merged

380 intranet visualizar data de cadastros desativados#384
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados

Conversation

@GRHInvDev

@GRHInvDevGRHInvDev commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Navigation menu now displays a popover for child items when the sidebar is collapsed.
  • Bug Fixes

    • Improved access control and authorization for the emotion ruler form.
  • Chores

    • Removed flyers section from the content feed; tabs now display Posts, Events, and Birthdays only.
    • Version bumped to 1.36.2.

rbxyzand others added 2 commits June 8, 2026 18:10
…ebar colapsada
- /news: remove a aba "Encartes" (módulo desativado) e queries/import órfãos
- Sidebar colapsada: filhos de grupo (Eventos, Notícias, etc.) agora acessíveis
via flyout (Popover), já que o accordion inline exige !collapsed e os ocultava
- Bump de versão para 1.36.1 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…vidor)
Módulo não liberado: autorização passa a ser server-authoritative via
can_view_emotion_ruler (ou sudo), nunca TOTEM/desativado.
- access-control: novo helper canViewEmotionRuler (reutilizável)
- emotion-ruler router: gate em getActive, createResponse, registerAccess e
registerDismissal (createResponse antes não tinha NENHUMA checagem)
- /forms/emotion-ruler: page vira server component com guard + redirect; UI
extraída para EmotionRulerResponseForm (client)
- sidebar/quick-access (routes.ts): item gated por permissão em vez de "novidades"
- Bump de versão para 1.36.2 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

You don't have permission to create a Preview Deployment for this Vercel project: elo.

View Documentation: https://vercel.com/docs/accounts/team-members-and-roles

@GRHInvDev
GRHInvDev merged commit 804276d into mainJun 9, 2026
4 of 6 checks passed
@coderabbitai

coderabbitaiBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c6452697-d90c-414d-bd1f-1ebba774aa2c

📥 Commits

Reviewing files that changed from the base of the PR and between e3f678f and 98e0227.

📒 Files selected for processing (8)
  • package.json
  • src/app/(authenticated)/forms/emotion-ruler/page.tsx
  • src/components/emotion-ruler/emotion-ruler-response-form.tsx
  • src/components/news/content-feed.tsx
  • src/components/ui/main-nav.tsx
  • src/const/routes.ts
  • src/lib/access-control.ts
  • src/server/api/routers/emotion-ruler.ts

📝 Walkthrough

Walkthrough

This PR refactors emotion-ruler to enforce role-based access control, transitioning the page from a client-side component to a server-side protected route. The new canViewEmotionRuler helper gates access across the page, API, and routing layers. Interactive UI is extracted into a new client component. Additionally, flyers are removed from the content feed and collapsed sidebar navigation now uses popovers.

Changes

Emotion-Ruler Access Control

Layer / File(s)Summary
Access control helper for emotion-ruler
src/lib/access-control.ts
New canViewEmotionRuler(roleConfig) determines permission based on role config, denying TOTEM users and those without the can_view_emotion_ruler flag, except sudo users.
Page server-side refactoring with auth guard
src/app/(authenticated)/forms/emotion-ruler/page.tsx
Page becomes async server component that checks Clerk authentication, fetches user role config, enforces canViewEmotionRuler check, redirects unauthorized users, and delegates to EmotionRulerResponseForm.
Client emotion response form component
src/components/emotion-ruler/emotion-ruler-response-form.tsx
New client component fetches active ruler, renders animated emotion-selection grid with states, optional comment input, and tRPC mutation for response submission with loading/success/error feedback.
API router authorization enforcement
src/server/api/routers/emotion-ruler.ts
Procedures (getActive, registerAccess, registerDismissal, createResponse) enforce canViewEmotionRuler permission check, returning null for queries or throwing FORBIDDEN for mutations when unauthorized.
Route menu item visibility gating
src/const/routes.ts
"Régua de Emoções" route is conditionally included based on canViewEmotionRuler(roleConfig) instead of the novidades flag.
Version bump
package.json
Version updated from 1.36.0 to 1.36.2.

Content-Feed Flyers Removal

Layer / File(s)Summary
Remove flyers from content feed
src/components/news/content-feed.tsx
Flyer-related imports, data wiring, and the entire flyers tab are removed; tabs header reduced from 4 to 3 columns (Posts, Events, Birthdays remain).

Sidebar Collapsed Navigation Enhancement

Layer / File(s)Summary
Popover flyout for collapsed navigation groups
src/components/ui/main-nav.tsx
When sidebar is collapsed, navigation groups with children render a popover flyout showing child links instead of inline expansion; active-child styling applied to trigger button.

Sequence Diagram(s)

sequenceDiagram
participant User
participant EmotionRulerPage as EmotionRulerPage Server
participant Clerk
participant UserAPI as api.user.me
participant AuthControl as canViewEmotionRuler
participant EmotionRulerForm as EmotionRulerResponseForm
User->>EmotionRulerPage: Request /forms/emotion-ruler
EmotionRulerPage->>Clerk: currentUser()
alt Not Authenticated
EmotionRulerPage-->>User: redirect /sign-in
else Authenticated
EmotionRulerPage->>UserAPI: Fetch current user data
UserAPI-->>EmotionRulerPage: User with role_config
EmotionRulerPage->>AuthControl: Check canViewEmotionRuler
alt Not Authorized
EmotionRulerPage-->>User: redirect /forms
else Authorized
EmotionRulerPage->>EmotionRulerForm: Render component
EmotionRulerForm-->>User: Return UI
end
end
Loading
sequenceDiagram
participant User
participant EmotionRulerForm
participant tRPCQuery as getActive Query
participant tRPCMutation as createResponse Mutation
participant Feedback as Toast/UI
EmotionRulerForm->>tRPCQuery: Fetch active ruler
tRPCQuery-->>EmotionRulerForm: Ruler data
EmotionRulerForm->>User: Render emotion grid
User->>EmotionRulerForm: Select emotion level
EmotionRulerForm->>User: Show selected emotion panel
User->>EmotionRulerForm: Optional comment + Submit
EmotionRulerForm->>tRPCMutation: createResponse(rulerId, emotionValue, comment)
alt Submission Success
tRPCMutation-->>EmotionRulerForm: Response created
EmotionRulerForm->>Feedback: Success toast
EmotionRulerForm->>tRPCQuery: Refetch ruler data
EmotionRulerForm->>User: Reset form state
else Submission Error
tRPCMutation-->>EmotionRulerForm: Error
EmotionRulerForm->>Feedback: Error toast
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • GRHInvDev/elo#327: Prior emotion-ruler visibility gating via novidades flag; this PR replaces that with canViewEmotionRuler role-based access control.
  • GRHInvDev/elo#369: Implements permission gating for "Régua de Emoções" using can_view_emotion_ruler role flag and related access-control updates.
  • GRHInvDev/elo#314: Foundational emotion-ruler module implementation; this PR adds the new canViewEmotionRuler authorization layer on top of existing procedures.

Poem

🐰 A rabbit's verse on rules and walls:
Guards now stand at emotion's halls,
Server-side the checks are cast,
While flyers fly away so fast!
And when sidebars shrink and fold,
Popovers burst with stories bold.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 380-intranet---visualizar-data-de-cadastros-desativados

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GRHInvDev@rbxyz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

380 intranet visualizar data de cadastros desativados - #384

Merged
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados
Jun 9, 2026
Merged

380 intranet visualizar data de cadastros desativados#384
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados

Conversation

@GRHInvDev

@GRHInvDevGRHInvDev commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Navigation menu now displays a popover for child items when the sidebar is collapsed.
  • Bug Fixes

    • Improved access control and authorization for the emotion ruler form.
  • Chores

    • Removed flyers section from the content feed; tabs now display Posts, Events, and Birthdays only.
    • Version bumped to 1.36.2.

rbxyzand others added 2 commits June 8, 2026 18:10
…ebar colapsada
- /news: remove a aba "Encartes" (módulo desativado) e queries/import órfãos
- Sidebar colapsada: filhos de grupo (Eventos, Notícias, etc.) agora acessíveis
via flyout (Popover), já que o accordion inline exige !collapsed e os ocultava
- Bump de versão para 1.36.1 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…vidor)
Módulo não liberado: autorização passa a ser server-authoritative via
can_view_emotion_ruler (ou sudo), nunca TOTEM/desativado.
- access-control: novo helper canViewEmotionRuler (reutilizável)
- emotion-ruler router: gate em getActive, createResponse, registerAccess e
registerDismissal (createResponse antes não tinha NENHUMA checagem)
- /forms/emotion-ruler: page vira server component com guard + redirect; UI
extraída para EmotionRulerResponseForm (client)
- sidebar/quick-access (routes.ts): item gated por permissão em vez de "novidades"
- Bump de versão para 1.36.2 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

You don't have permission to create a Preview Deployment for this Vercel project: elo.

View Documentation: https://vercel.com/docs/accounts/team-members-and-roles

@GRHInvDev
GRHInvDev merged commit 804276d into mainJun 9, 2026
4 of 6 checks passed
@coderabbitai

coderabbitaiBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c6452697-d90c-414d-bd1f-1ebba774aa2c

📥 Commits

Reviewing files that changed from the base of the PR and between e3f678f and 98e0227.

📒 Files selected for processing (8)
  • package.json
  • src/app/(authenticated)/forms/emotion-ruler/page.tsx
  • src/components/emotion-ruler/emotion-ruler-response-form.tsx
  • src/components/news/content-feed.tsx
  • src/components/ui/main-nav.tsx
  • src/const/routes.ts
  • src/lib/access-control.ts
  • src/server/api/routers/emotion-ruler.ts

📝 Walkthrough

Walkthrough

This PR refactors emotion-ruler to enforce role-based access control, transitioning the page from a client-side component to a server-side protected route. The new canViewEmotionRuler helper gates access across the page, API, and routing layers. Interactive UI is extracted into a new client component. Additionally, flyers are removed from the content feed and collapsed sidebar navigation now uses popovers.

Changes

Emotion-Ruler Access Control

Layer / File(s)Summary
Access control helper for emotion-ruler
src/lib/access-control.ts
New canViewEmotionRuler(roleConfig) determines permission based on role config, denying TOTEM users and those without the can_view_emotion_ruler flag, except sudo users.
Page server-side refactoring with auth guard
src/app/(authenticated)/forms/emotion-ruler/page.tsx
Page becomes async server component that checks Clerk authentication, fetches user role config, enforces canViewEmotionRuler check, redirects unauthorized users, and delegates to EmotionRulerResponseForm.
Client emotion response form component
src/components/emotion-ruler/emotion-ruler-response-form.tsx
New client component fetches active ruler, renders animated emotion-selection grid with states, optional comment input, and tRPC mutation for response submission with loading/success/error feedback.
API router authorization enforcement
src/server/api/routers/emotion-ruler.ts
Procedures (getActive, registerAccess, registerDismissal, createResponse) enforce canViewEmotionRuler permission check, returning null for queries or throwing FORBIDDEN for mutations when unauthorized.
Route menu item visibility gating
src/const/routes.ts
"Régua de Emoções" route is conditionally included based on canViewEmotionRuler(roleConfig) instead of the novidades flag.
Version bump
package.json
Version updated from 1.36.0 to 1.36.2.

Content-Feed Flyers Removal

Layer / File(s)Summary
Remove flyers from content feed
src/components/news/content-feed.tsx
Flyer-related imports, data wiring, and the entire flyers tab are removed; tabs header reduced from 4 to 3 columns (Posts, Events, Birthdays remain).

Sidebar Collapsed Navigation Enhancement

Layer / File(s)Summary
Popover flyout for collapsed navigation groups
src/components/ui/main-nav.tsx
When sidebar is collapsed, navigation groups with children render a popover flyout showing child links instead of inline expansion; active-child styling applied to trigger button.

Sequence Diagram(s)

sequenceDiagram
participant User
participant EmotionRulerPage as EmotionRulerPage Server
participant Clerk
participant UserAPI as api.user.me
participant AuthControl as canViewEmotionRuler
participant EmotionRulerForm as EmotionRulerResponseForm
User->>EmotionRulerPage: Request /forms/emotion-ruler
EmotionRulerPage->>Clerk: currentUser()
alt Not Authenticated
EmotionRulerPage-->>User: redirect /sign-in
else Authenticated
EmotionRulerPage->>UserAPI: Fetch current user data
UserAPI-->>EmotionRulerPage: User with role_config
EmotionRulerPage->>AuthControl: Check canViewEmotionRuler
alt Not Authorized
EmotionRulerPage-->>User: redirect /forms
else Authorized
EmotionRulerPage->>EmotionRulerForm: Render component
EmotionRulerForm-->>User: Return UI
end
end
Loading
sequenceDiagram
participant User
participant EmotionRulerForm
participant tRPCQuery as getActive Query
participant tRPCMutation as createResponse Mutation
participant Feedback as Toast/UI
EmotionRulerForm->>tRPCQuery: Fetch active ruler
tRPCQuery-->>EmotionRulerForm: Ruler data
EmotionRulerForm->>User: Render emotion grid
User->>EmotionRulerForm: Select emotion level
EmotionRulerForm->>User: Show selected emotion panel
User->>EmotionRulerForm: Optional comment + Submit
EmotionRulerForm->>tRPCMutation: createResponse(rulerId, emotionValue, comment)
alt Submission Success
tRPCMutation-->>EmotionRulerForm: Response created
EmotionRulerForm->>Feedback: Success toast
EmotionRulerForm->>tRPCQuery: Refetch ruler data
EmotionRulerForm->>User: Reset form state
else Submission Error
tRPCMutation-->>EmotionRulerForm: Error
EmotionRulerForm->>Feedback: Error toast
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • GRHInvDev/elo#327: Prior emotion-ruler visibility gating via novidades flag; this PR replaces that with canViewEmotionRuler role-based access control.
  • GRHInvDev/elo#369: Implements permission gating for "Régua de Emoções" using can_view_emotion_ruler role flag and related access-control updates.
  • GRHInvDev/elo#314: Foundational emotion-ruler module implementation; this PR adds the new canViewEmotionRuler authorization layer on top of existing procedures.

Poem

🐰 A rabbit's verse on rules and walls:
Guards now stand at emotion's halls,
Server-side the checks are cast,
While flyers fly away so fast!
And when sidebars shrink and fold,
Popovers burst with stories bold.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 380-intranet---visualizar-data-de-cadastros-desativados

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GRHInvDev@rbxyz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

380 intranet visualizar data de cadastros desativados - #384

Merged
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados
Jun 9, 2026
Merged

380 intranet visualizar data de cadastros desativados#384
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados

Conversation

@GRHInvDev

@GRHInvDevGRHInvDev commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Navigation menu now displays a popover for child items when the sidebar is collapsed.
  • Bug Fixes

    • Improved access control and authorization for the emotion ruler form.
  • Chores

    • Removed flyers section from the content feed; tabs now display Posts, Events, and Birthdays only.
    • Version bumped to 1.36.2.

rbxyzand others added 2 commits June 8, 2026 18:10
…ebar colapsada
- /news: remove a aba "Encartes" (módulo desativado) e queries/import órfãos
- Sidebar colapsada: filhos de grupo (Eventos, Notícias, etc.) agora acessíveis
via flyout (Popover), já que o accordion inline exige !collapsed e os ocultava
- Bump de versão para 1.36.1 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…vidor)
Módulo não liberado: autorização passa a ser server-authoritative via
can_view_emotion_ruler (ou sudo), nunca TOTEM/desativado.
- access-control: novo helper canViewEmotionRuler (reutilizável)
- emotion-ruler router: gate em getActive, createResponse, registerAccess e
registerDismissal (createResponse antes não tinha NENHUMA checagem)
- /forms/emotion-ruler: page vira server component com guard + redirect; UI
extraída para EmotionRulerResponseForm (client)
- sidebar/quick-access (routes.ts): item gated por permissão em vez de "novidades"
- Bump de versão para 1.36.2 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

You don't have permission to create a Preview Deployment for this Vercel project: elo.

View Documentation: https://vercel.com/docs/accounts/team-members-and-roles

@GRHInvDev
GRHInvDev merged commit 804276d into mainJun 9, 2026
4 of 6 checks passed
@coderabbitai

coderabbitaiBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c6452697-d90c-414d-bd1f-1ebba774aa2c

📥 Commits

Reviewing files that changed from the base of the PR and between e3f678f and 98e0227.

📒 Files selected for processing (8)
  • package.json
  • src/app/(authenticated)/forms/emotion-ruler/page.tsx
  • src/components/emotion-ruler/emotion-ruler-response-form.tsx
  • src/components/news/content-feed.tsx
  • src/components/ui/main-nav.tsx
  • src/const/routes.ts
  • src/lib/access-control.ts
  • src/server/api/routers/emotion-ruler.ts

📝 Walkthrough

Walkthrough

This PR refactors emotion-ruler to enforce role-based access control, transitioning the page from a client-side component to a server-side protected route. The new canViewEmotionRuler helper gates access across the page, API, and routing layers. Interactive UI is extracted into a new client component. Additionally, flyers are removed from the content feed and collapsed sidebar navigation now uses popovers.

Changes

Emotion-Ruler Access Control

Layer / File(s)Summary
Access control helper for emotion-ruler
src/lib/access-control.ts
New canViewEmotionRuler(roleConfig) determines permission based on role config, denying TOTEM users and those without the can_view_emotion_ruler flag, except sudo users.
Page server-side refactoring with auth guard
src/app/(authenticated)/forms/emotion-ruler/page.tsx
Page becomes async server component that checks Clerk authentication, fetches user role config, enforces canViewEmotionRuler check, redirects unauthorized users, and delegates to EmotionRulerResponseForm.
Client emotion response form component
src/components/emotion-ruler/emotion-ruler-response-form.tsx
New client component fetches active ruler, renders animated emotion-selection grid with states, optional comment input, and tRPC mutation for response submission with loading/success/error feedback.
API router authorization enforcement
src/server/api/routers/emotion-ruler.ts
Procedures (getActive, registerAccess, registerDismissal, createResponse) enforce canViewEmotionRuler permission check, returning null for queries or throwing FORBIDDEN for mutations when unauthorized.
Route menu item visibility gating
src/const/routes.ts
"Régua de Emoções" route is conditionally included based on canViewEmotionRuler(roleConfig) instead of the novidades flag.
Version bump
package.json
Version updated from 1.36.0 to 1.36.2.

Content-Feed Flyers Removal

Layer / File(s)Summary
Remove flyers from content feed
src/components/news/content-feed.tsx
Flyer-related imports, data wiring, and the entire flyers tab are removed; tabs header reduced from 4 to 3 columns (Posts, Events, Birthdays remain).

Sidebar Collapsed Navigation Enhancement

Layer / File(s)Summary
Popover flyout for collapsed navigation groups
src/components/ui/main-nav.tsx
When sidebar is collapsed, navigation groups with children render a popover flyout showing child links instead of inline expansion; active-child styling applied to trigger button.

Sequence Diagram(s)

sequenceDiagram
participant User
participant EmotionRulerPage as EmotionRulerPage Server
participant Clerk
participant UserAPI as api.user.me
participant AuthControl as canViewEmotionRuler
participant EmotionRulerForm as EmotionRulerResponseForm
User->>EmotionRulerPage: Request /forms/emotion-ruler
EmotionRulerPage->>Clerk: currentUser()
alt Not Authenticated
EmotionRulerPage-->>User: redirect /sign-in
else Authenticated
EmotionRulerPage->>UserAPI: Fetch current user data
UserAPI-->>EmotionRulerPage: User with role_config
EmotionRulerPage->>AuthControl: Check canViewEmotionRuler
alt Not Authorized
EmotionRulerPage-->>User: redirect /forms
else Authorized
EmotionRulerPage->>EmotionRulerForm: Render component
EmotionRulerForm-->>User: Return UI
end
end
Loading
sequenceDiagram
participant User
participant EmotionRulerForm
participant tRPCQuery as getActive Query
participant tRPCMutation as createResponse Mutation
participant Feedback as Toast/UI
EmotionRulerForm->>tRPCQuery: Fetch active ruler
tRPCQuery-->>EmotionRulerForm: Ruler data
EmotionRulerForm->>User: Render emotion grid
User->>EmotionRulerForm: Select emotion level
EmotionRulerForm->>User: Show selected emotion panel
User->>EmotionRulerForm: Optional comment + Submit
EmotionRulerForm->>tRPCMutation: createResponse(rulerId, emotionValue, comment)
alt Submission Success
tRPCMutation-->>EmotionRulerForm: Response created
EmotionRulerForm->>Feedback: Success toast
EmotionRulerForm->>tRPCQuery: Refetch ruler data
EmotionRulerForm->>User: Reset form state
else Submission Error
tRPCMutation-->>EmotionRulerForm: Error
EmotionRulerForm->>Feedback: Error toast
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • GRHInvDev/elo#327: Prior emotion-ruler visibility gating via novidades flag; this PR replaces that with canViewEmotionRuler role-based access control.
  • GRHInvDev/elo#369: Implements permission gating for "Régua de Emoções" using can_view_emotion_ruler role flag and related access-control updates.
  • GRHInvDev/elo#314: Foundational emotion-ruler module implementation; this PR adds the new canViewEmotionRuler authorization layer on top of existing procedures.

Poem

🐰 A rabbit's verse on rules and walls:
Guards now stand at emotion's halls,
Server-side the checks are cast,
While flyers fly away so fast!
And when sidebars shrink and fold,
Popovers burst with stories bold.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 380-intranet---visualizar-data-de-cadastros-desativados

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GRHInvDev@rbxyz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

380 intranet visualizar data de cadastros desativados - #384

Merged
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados
Jun 9, 2026
Merged

380 intranet visualizar data de cadastros desativados#384
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados

Conversation

@GRHInvDev

@GRHInvDevGRHInvDev commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Navigation menu now displays a popover for child items when the sidebar is collapsed.
  • Bug Fixes

    • Improved access control and authorization for the emotion ruler form.
  • Chores

    • Removed flyers section from the content feed; tabs now display Posts, Events, and Birthdays only.
    • Version bumped to 1.36.2.

rbxyzand others added 2 commits June 8, 2026 18:10
…ebar colapsada
- /news: remove a aba "Encartes" (módulo desativado) e queries/import órfãos
- Sidebar colapsada: filhos de grupo (Eventos, Notícias, etc.) agora acessíveis
via flyout (Popover), já que o accordion inline exige !collapsed e os ocultava
- Bump de versão para 1.36.1 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…vidor)
Módulo não liberado: autorização passa a ser server-authoritative via
can_view_emotion_ruler (ou sudo), nunca TOTEM/desativado.
- access-control: novo helper canViewEmotionRuler (reutilizável)
- emotion-ruler router: gate em getActive, createResponse, registerAccess e
registerDismissal (createResponse antes não tinha NENHUMA checagem)
- /forms/emotion-ruler: page vira server component com guard + redirect; UI
extraída para EmotionRulerResponseForm (client)
- sidebar/quick-access (routes.ts): item gated por permissão em vez de "novidades"
- Bump de versão para 1.36.2 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

You don't have permission to create a Preview Deployment for this Vercel project: elo.

View Documentation: https://vercel.com/docs/accounts/team-members-and-roles

@GRHInvDev
GRHInvDev merged commit 804276d into mainJun 9, 2026
4 of 6 checks passed
@coderabbitai

coderabbitaiBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c6452697-d90c-414d-bd1f-1ebba774aa2c

📥 Commits

Reviewing files that changed from the base of the PR and between e3f678f and 98e0227.

📒 Files selected for processing (8)
  • package.json
  • src/app/(authenticated)/forms/emotion-ruler/page.tsx
  • src/components/emotion-ruler/emotion-ruler-response-form.tsx
  • src/components/news/content-feed.tsx
  • src/components/ui/main-nav.tsx
  • src/const/routes.ts
  • src/lib/access-control.ts
  • src/server/api/routers/emotion-ruler.ts

📝 Walkthrough

Walkthrough

This PR refactors emotion-ruler to enforce role-based access control, transitioning the page from a client-side component to a server-side protected route. The new canViewEmotionRuler helper gates access across the page, API, and routing layers. Interactive UI is extracted into a new client component. Additionally, flyers are removed from the content feed and collapsed sidebar navigation now uses popovers.

Changes

Emotion-Ruler Access Control

Layer / File(s)Summary
Access control helper for emotion-ruler
src/lib/access-control.ts
New canViewEmotionRuler(roleConfig) determines permission based on role config, denying TOTEM users and those without the can_view_emotion_ruler flag, except sudo users.
Page server-side refactoring with auth guard
src/app/(authenticated)/forms/emotion-ruler/page.tsx
Page becomes async server component that checks Clerk authentication, fetches user role config, enforces canViewEmotionRuler check, redirects unauthorized users, and delegates to EmotionRulerResponseForm.
Client emotion response form component
src/components/emotion-ruler/emotion-ruler-response-form.tsx
New client component fetches active ruler, renders animated emotion-selection grid with states, optional comment input, and tRPC mutation for response submission with loading/success/error feedback.
API router authorization enforcement
src/server/api/routers/emotion-ruler.ts
Procedures (getActive, registerAccess, registerDismissal, createResponse) enforce canViewEmotionRuler permission check, returning null for queries or throwing FORBIDDEN for mutations when unauthorized.
Route menu item visibility gating
src/const/routes.ts
"Régua de Emoções" route is conditionally included based on canViewEmotionRuler(roleConfig) instead of the novidades flag.
Version bump
package.json
Version updated from 1.36.0 to 1.36.2.

Content-Feed Flyers Removal

Layer / File(s)Summary
Remove flyers from content feed
src/components/news/content-feed.tsx
Flyer-related imports, data wiring, and the entire flyers tab are removed; tabs header reduced from 4 to 3 columns (Posts, Events, Birthdays remain).

Sidebar Collapsed Navigation Enhancement

Layer / File(s)Summary
Popover flyout for collapsed navigation groups
src/components/ui/main-nav.tsx
When sidebar is collapsed, navigation groups with children render a popover flyout showing child links instead of inline expansion; active-child styling applied to trigger button.

Sequence Diagram(s)

sequenceDiagram
participant User
participant EmotionRulerPage as EmotionRulerPage Server
participant Clerk
participant UserAPI as api.user.me
participant AuthControl as canViewEmotionRuler
participant EmotionRulerForm as EmotionRulerResponseForm
User->>EmotionRulerPage: Request /forms/emotion-ruler
EmotionRulerPage->>Clerk: currentUser()
alt Not Authenticated
EmotionRulerPage-->>User: redirect /sign-in
else Authenticated
EmotionRulerPage->>UserAPI: Fetch current user data
UserAPI-->>EmotionRulerPage: User with role_config
EmotionRulerPage->>AuthControl: Check canViewEmotionRuler
alt Not Authorized
EmotionRulerPage-->>User: redirect /forms
else Authorized
EmotionRulerPage->>EmotionRulerForm: Render component
EmotionRulerForm-->>User: Return UI
end
end
Loading
sequenceDiagram
participant User
participant EmotionRulerForm
participant tRPCQuery as getActive Query
participant tRPCMutation as createResponse Mutation
participant Feedback as Toast/UI
EmotionRulerForm->>tRPCQuery: Fetch active ruler
tRPCQuery-->>EmotionRulerForm: Ruler data
EmotionRulerForm->>User: Render emotion grid
User->>EmotionRulerForm: Select emotion level
EmotionRulerForm->>User: Show selected emotion panel
User->>EmotionRulerForm: Optional comment + Submit
EmotionRulerForm->>tRPCMutation: createResponse(rulerId, emotionValue, comment)
alt Submission Success
tRPCMutation-->>EmotionRulerForm: Response created
EmotionRulerForm->>Feedback: Success toast
EmotionRulerForm->>tRPCQuery: Refetch ruler data
EmotionRulerForm->>User: Reset form state
else Submission Error
tRPCMutation-->>EmotionRulerForm: Error
EmotionRulerForm->>Feedback: Error toast
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • GRHInvDev/elo#327: Prior emotion-ruler visibility gating via novidades flag; this PR replaces that with canViewEmotionRuler role-based access control.
  • GRHInvDev/elo#369: Implements permission gating for "Régua de Emoções" using can_view_emotion_ruler role flag and related access-control updates.
  • GRHInvDev/elo#314: Foundational emotion-ruler module implementation; this PR adds the new canViewEmotionRuler authorization layer on top of existing procedures.

Poem

🐰 A rabbit's verse on rules and walls:
Guards now stand at emotion's halls,
Server-side the checks are cast,
While flyers fly away so fast!
And when sidebars shrink and fold,
Popovers burst with stories bold.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 380-intranet---visualizar-data-de-cadastros-desativados

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GRHInvDev@rbxyz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

380 intranet visualizar data de cadastros desativados - #384

Merged
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados
Jun 9, 2026
Merged

380 intranet visualizar data de cadastros desativados#384
GRHInvDev merged 2 commits into
mainfrom
380-intranet---visualizar-data-de-cadastros-desativados

Conversation

@GRHInvDev

@GRHInvDevGRHInvDev commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Navigation menu now displays a popover for child items when the sidebar is collapsed.
  • Bug Fixes

    • Improved access control and authorization for the emotion ruler form.
  • Chores

    • Removed flyers section from the content feed; tabs now display Posts, Events, and Birthdays only.
    • Version bumped to 1.36.2.

rbxyzand others added 2 commits June 8, 2026 18:10
…ebar colapsada
- /news: remove a aba "Encartes" (módulo desativado) e queries/import órfãos
- Sidebar colapsada: filhos de grupo (Eventos, Notícias, etc.) agora acessíveis
via flyout (Popover), já que o accordion inline exige !collapsed e os ocultava
- Bump de versão para 1.36.1 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…vidor)
Módulo não liberado: autorização passa a ser server-authoritative via
can_view_emotion_ruler (ou sudo), nunca TOTEM/desativado.
- access-control: novo helper canViewEmotionRuler (reutilizável)
- emotion-ruler router: gate em getActive, createResponse, registerAccess e
registerDismissal (createResponse antes não tinha NENHUMA checagem)
- /forms/emotion-ruler: page vira server component com guard + redirect; UI
extraída para EmotionRulerResponseForm (client)
- sidebar/quick-access (routes.ts): item gated por permissão em vez de "novidades"
- Bump de versão para 1.36.2 (MMP - patch)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

You don't have permission to create a Preview Deployment for this Vercel project: elo.

View Documentation: https://vercel.com/docs/accounts/team-members-and-roles

@GRHInvDev
GRHInvDev merged commit 804276d into mainJun 9, 2026
4 of 6 checks passed
@coderabbitai

coderabbitaiBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c6452697-d90c-414d-bd1f-1ebba774aa2c

📥 Commits

Reviewing files that changed from the base of the PR and between e3f678f and 98e0227.

📒 Files selected for processing (8)
  • package.json
  • src/app/(authenticated)/forms/emotion-ruler/page.tsx
  • src/components/emotion-ruler/emotion-ruler-response-form.tsx
  • src/components/news/content-feed.tsx
  • src/components/ui/main-nav.tsx
  • src/const/routes.ts
  • src/lib/access-control.ts
  • src/server/api/routers/emotion-ruler.ts

📝 Walkthrough

Walkthrough

This PR refactors emotion-ruler to enforce role-based access control, transitioning the page from a client-side component to a server-side protected route. The new canViewEmotionRuler helper gates access across the page, API, and routing layers. Interactive UI is extracted into a new client component. Additionally, flyers are removed from the content feed and collapsed sidebar navigation now uses popovers.

Changes

Emotion-Ruler Access Control

Layer / File(s)Summary
Access control helper for emotion-ruler
src/lib/access-control.ts
New canViewEmotionRuler(roleConfig) determines permission based on role config, denying TOTEM users and those without the can_view_emotion_ruler flag, except sudo users.
Page server-side refactoring with auth guard
src/app/(authenticated)/forms/emotion-ruler/page.tsx
Page becomes async server component that checks Clerk authentication, fetches user role config, enforces canViewEmotionRuler check, redirects unauthorized users, and delegates to EmotionRulerResponseForm.
Client emotion response form component
src/components/emotion-ruler/emotion-ruler-response-form.tsx
New client component fetches active ruler, renders animated emotion-selection grid with states, optional comment input, and tRPC mutation for response submission with loading/success/error feedback.
API router authorization enforcement
src/server/api/routers/emotion-ruler.ts
Procedures (getActive, registerAccess, registerDismissal, createResponse) enforce canViewEmotionRuler permission check, returning null for queries or throwing FORBIDDEN for mutations when unauthorized.
Route menu item visibility gating
src/const/routes.ts
"Régua de Emoções" route is conditionally included based on canViewEmotionRuler(roleConfig) instead of the novidades flag.
Version bump
package.json
Version updated from 1.36.0 to 1.36.2.

Content-Feed Flyers Removal

Layer / File(s)Summary
Remove flyers from content feed
src/components/news/content-feed.tsx
Flyer-related imports, data wiring, and the entire flyers tab are removed; tabs header reduced from 4 to 3 columns (Posts, Events, Birthdays remain).

Sidebar Collapsed Navigation Enhancement

Layer / File(s)Summary
Popover flyout for collapsed navigation groups
src/components/ui/main-nav.tsx
When sidebar is collapsed, navigation groups with children render a popover flyout showing child links instead of inline expansion; active-child styling applied to trigger button.

Sequence Diagram(s)

sequenceDiagram
participant User
participant EmotionRulerPage as EmotionRulerPage Server
participant Clerk
participant UserAPI as api.user.me
participant AuthControl as canViewEmotionRuler
participant EmotionRulerForm as EmotionRulerResponseForm
User->>EmotionRulerPage: Request /forms/emotion-ruler
EmotionRulerPage->>Clerk: currentUser()
alt Not Authenticated
EmotionRulerPage-->>User: redirect /sign-in
else Authenticated
EmotionRulerPage->>UserAPI: Fetch current user data
UserAPI-->>EmotionRulerPage: User with role_config
EmotionRulerPage->>AuthControl: Check canViewEmotionRuler
alt Not Authorized
EmotionRulerPage-->>User: redirect /forms
else Authorized
EmotionRulerPage->>EmotionRulerForm: Render component
EmotionRulerForm-->>User: Return UI
end
end
Loading
sequenceDiagram
participant User
participant EmotionRulerForm
participant tRPCQuery as getActive Query
participant tRPCMutation as createResponse Mutation
participant Feedback as Toast/UI
EmotionRulerForm->>tRPCQuery: Fetch active ruler
tRPCQuery-->>EmotionRulerForm: Ruler data
EmotionRulerForm->>User: Render emotion grid
User->>EmotionRulerForm: Select emotion level
EmotionRulerForm->>User: Show selected emotion panel
User->>EmotionRulerForm: Optional comment + Submit
EmotionRulerForm->>tRPCMutation: createResponse(rulerId, emotionValue, comment)
alt Submission Success
tRPCMutation-->>EmotionRulerForm: Response created
EmotionRulerForm->>Feedback: Success toast
EmotionRulerForm->>tRPCQuery: Refetch ruler data
EmotionRulerForm->>User: Reset form state
else Submission Error
tRPCMutation-->>EmotionRulerForm: Error
EmotionRulerForm->>Feedback: Error toast
end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • GRHInvDev/elo#327: Prior emotion-ruler visibility gating via novidades flag; this PR replaces that with canViewEmotionRuler role-based access control.
  • GRHInvDev/elo#369: Implements permission gating for "Régua de Emoções" using can_view_emotion_ruler role flag and related access-control updates.
  • GRHInvDev/elo#314: Foundational emotion-ruler module implementation; this PR adds the new canViewEmotionRuler authorization layer on top of existing procedures.

Poem

🐰 A rabbit's verse on rules and walls:
Guards now stand at emotion's halls,
Server-side the checks are cast,
While flyers fly away so fast!
And when sidebars shrink and fold,
Popovers burst with stories bold.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 380-intranet---visualizar-data-de-cadastros-desativados

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@GRHInvDev@rbxyz