Agenda google, avisos globais, feriados + avisos globais, templates de email, configuracoes empresa, preview empresa.

This commit is contained in:
Leonardo
2026-03-18 15:47:37 -03:00
parent d6d2fe29d1
commit 29ed349cf2
21 changed files with 5366 additions and 41 deletions

View File

@@ -10,7 +10,13 @@ import AppRail from './AppRail.vue'
import AppRailPanel from './AppRailPanel.vue'
import AppRailSidebar from './AppRailSidebar.vue'
import AjudaDrawer from '@/components/AjudaDrawer.vue'
import SupportDebugBanner from '@/support/components/SupportDebugBanner.vue'
import SupportDebugBanner from '@/support/components/SupportDebugBanner.vue'
import GlobalNoticeBanner from '@/features/notices/GlobalNoticeBanner.vue'
import { useNoticeStore } from '@/stores/noticeStore'
import { useTenantStore } from '@/stores/tenantStore'
import { useEntitlementsStore } from '@/stores/entitlementsStore'
import { useTenantFeaturesStore } from '@/stores/tenantFeaturesStore'
import { fetchDocsForPath, useAjuda } from '@/composables/useAjuda'
@@ -21,19 +27,23 @@ const ajudaPushStyle = computed(() => ({
paddingRight: drawerOpen.value ? '420px' : '0'
}))
import { useTenantStore } from '@/stores/tenantStore'
import { useEntitlementsStore } from '@/stores/entitlementsStore'
import { useTenantFeaturesStore } from '@/stores/tenantFeaturesStore'
const route = useRoute()
const route = useRoute()
const noticeStore = useNoticeStore()
const { layoutConfig, layoutState, hideMobileMenu, isDesktop, effectiveVariant } = useLayout()
const layoutArea = computed(() => route.meta?.area || null)
provide('layoutArea', layoutArea)
const tenantStore = useTenantStore()
const tenantStore = useTenantStore()
const entitlementsStore = useEntitlementsStore()
const tf = useTenantFeaturesStore()
const tf = useTenantFeaturesStore()
// ── Atualiza contexto dos notices ao mudar de rota ────────────
watch(
() => route.path,
(path) => noticeStore.updateContext(path, tenantStore.role),
{ immediate: false }
)
const containerClass = computed(() => {
return {
@@ -86,6 +96,7 @@ watch(() => route.path, (path) => fetchDocsForPath(path), { immediate: true })
onMounted(() => {
window.addEventListener('app:session-refreshed', onSessionRefreshed)
noticeStore.init(tenantStore.role, route.path)
})
onBeforeUnmount(() => {
@@ -146,6 +157,7 @@ onBeforeUnmount(() => {
<!-- Global fora de todos os branches, persiste em qualquer layout/rota -->
<SupportDebugBanner />
<GlobalNoticeBanner />
</template>
<style>
@@ -154,14 +166,24 @@ onBeforeUnmount(() => {
para sobrescrever o tema PrimeVue/Sakai
────────────────────────────────────────────── */
/* ── Global Notice Banner: variável de altura ─────────────
Definida aqui como fallback; o componente altera via JS */
:root {
--notice-banner-height: 0px;
}
/* ── Topbar: desce pelo banner ─────────────────────────── */
.rail-topbar {
top: var(--notice-banner-height) !important;
}
/* ── Sidebar — sempre abaixo da topbar fixed (56px) ────────
z-index: 999 para flutuar sobre o conteúdo em overlay.
Topbar (z-index 1000) fica sempre acessível acima da sidebar. */
Desce pelo banner também. */
.layout-sidebar {
position: fixed !important;
top: 56px !important;
top: calc(56px + var(--notice-banner-height)) !important;
left: 0 !important;
height: calc(100vh - 56px) !important;
height: calc(100vh - 56px - var(--notice-banner-height)) !important;
border-radius: 0 !important;
padding: 0 !important;
box-shadow: 2px 0 6px rgba(0,0,0,.06) !important;
@@ -181,7 +203,7 @@ onBeforeUnmount(() => {
.layout-main-container {
margin-left: 20rem !important;
padding-left: 0 !important;
padding-top: 56px !important;
padding-top: calc(56px + var(--notice-banner-height)) !important;
}
.layout-overlay .layout-main-container,
.layout-static-inactive .layout-main-container {
@@ -203,11 +225,14 @@ onBeforeUnmount(() => {
</style>
<style scoped>
/* ─── Layout Rail (inalterado) ────────────────── */
/* ─── Layout Rail ─────────────────────────────── */
.l2-root {
position: fixed;
top: var(--notice-banner-height, 0px); /* desce pelo banner */
left: 0;
right: 0;
bottom: 0;
display: flex;
width: 100vw;
height: 100vh;
overflow: hidden;
background: var(--surface-ground);
}
@@ -217,9 +242,9 @@ onBeforeUnmount(() => {
min-width: 0;
display: flex;
flex-direction: column;
height: 100vh;
height: 100%;
overflow: hidden;
padding-top: 56px; /* compensa a topbar fixed */
padding-top: 56px; /* compensa topbar — banner já absorvido pelo l2-root */
}
.l2-content {