328 lines
7.5 KiB
HTML
328 lines
7.5 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
|
|
<head>
|
|
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet"
|
|
type="text/css">
|
|
<link href="https://cdn.jsdelivr.net/npm/quasar@2.16.0/dist/quasar.prod.css" rel="stylesheet" type="text/css">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<style>
|
|
:root {
|
|
--left-col-width: 240px;
|
|
--cell-width: 100px;
|
|
/* Fixed heights for sticky header stacking */
|
|
--h-eod: 40px;
|
|
--h-status: 32px;
|
|
--h-dates: 48px;
|
|
}
|
|
|
|
body,
|
|
html {
|
|
height: 100%;
|
|
overflow: hidden;
|
|
margin: 0;
|
|
padding: 0;
|
|
background-color: #f1f5f9;
|
|
}
|
|
|
|
/* Main Grid Viewport */
|
|
.grid-viewport {
|
|
height: calc(100vh - 50px) !important;
|
|
overflow: auto !important;
|
|
background: white;
|
|
position: relative;
|
|
display: block;
|
|
border-top: 1px solid #e2e8f0;
|
|
scroll-behavior: smooth;
|
|
}
|
|
|
|
.grid-viewport::-webkit-scrollbar {
|
|
width: 14px;
|
|
height: 14px;
|
|
display: block;
|
|
}
|
|
|
|
.grid-viewport::-webkit-scrollbar-track {
|
|
background: #f1f5f9;
|
|
}
|
|
|
|
.grid-viewport::-webkit-scrollbar-thumb {
|
|
background-color: #94a3b8;
|
|
border-radius: 10px;
|
|
border: 3px solid #f1f5f9;
|
|
}
|
|
|
|
.planner-content {
|
|
display: inline-block;
|
|
min-width: fit-content;
|
|
vertical-align: top;
|
|
}
|
|
|
|
.planner-row {
|
|
display: flex;
|
|
flex-direction: row;
|
|
border-bottom: 1px solid #edf2f7;
|
|
}
|
|
|
|
.left-col {
|
|
width: var(--left-col-width);
|
|
min-width: var(--left-col-width);
|
|
position: sticky;
|
|
left: 0;
|
|
z-index: 20;
|
|
background: white;
|
|
border-right: 2px solid #e2e8f0;
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 0 12px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.row-eod {
|
|
position: sticky;
|
|
top: 0;
|
|
z-index: 40;
|
|
height: var(--h-eod);
|
|
background: #fff1f2;
|
|
}
|
|
|
|
.row-status {
|
|
position: sticky;
|
|
top: var(--h-eod);
|
|
z-index: 39;
|
|
height: var(--h-status);
|
|
background: white;
|
|
}
|
|
|
|
.row-dates {
|
|
position: sticky;
|
|
top: calc(var(--h-eod) + var(--h-status));
|
|
z-index: 38;
|
|
height: var(--h-dates);
|
|
background: #f8fafc;
|
|
}
|
|
|
|
.row-eod .left-col {
|
|
z-index: 60;
|
|
background: #fff1f2;
|
|
color: #be185d;
|
|
}
|
|
|
|
.row-status .left-col {
|
|
z-index: 59;
|
|
background: white;
|
|
color: #64748b;
|
|
}
|
|
|
|
.row-dates .left-col {
|
|
z-index: 58;
|
|
background: #f8fafc;
|
|
padding-right: 8px;
|
|
}
|
|
|
|
.cells-area {
|
|
display: flex;
|
|
flex-direction: row;
|
|
}
|
|
|
|
.cell {
|
|
width: var(--cell-width);
|
|
min-width: var(--cell-width);
|
|
height: 54px;
|
|
border-right: 1px solid #f1f5f9;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
position: relative;
|
|
}
|
|
|
|
.cell-compact {
|
|
height: 38px;
|
|
}
|
|
|
|
.shift-badge {
|
|
font-size: 9px;
|
|
font-weight: 800;
|
|
padding: 1px 4px;
|
|
border-radius: 3px;
|
|
width: 92%;
|
|
text-align: center;
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
margin-bottom: 2px;
|
|
}
|
|
|
|
.dept-divider {
|
|
background: #f1f5f9;
|
|
font-size: 10px;
|
|
font-weight: 900;
|
|
color: #64748b;
|
|
letter-spacing: 0.05em;
|
|
height: 28px;
|
|
}
|
|
|
|
.locked-overlay {
|
|
position: absolute;
|
|
inset: 0;
|
|
background: rgba(255, 255, 255, 0.4);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
z-index: 5;
|
|
}
|
|
|
|
.grid-search-container {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
width: 100%;
|
|
}
|
|
|
|
.grid-search-input {
|
|
flex: 1;
|
|
font-size: 12px;
|
|
}
|
|
|
|
/* Weekend Helper Classes */
|
|
.bg-weekend {
|
|
background-color: #f8fafc !important;
|
|
}
|
|
|
|
.text-sat {
|
|
color: #2e7d32 !important;
|
|
}
|
|
|
|
.text-sun {
|
|
color: #c62828 !important;
|
|
}
|
|
|
|
/* Avatar Group Overlap - Global Item Style */
|
|
.avatar-stack-item {
|
|
margin-left: -10px;
|
|
border: 2px solid #303f9f;
|
|
/* indigo-9 toolbar border color */
|
|
transition: transform 0.2s ease;
|
|
cursor: pointer;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
/* Scaling restricted to user faces only */
|
|
.avatar-stack-img:hover {
|
|
transform: scale(1.15);
|
|
z-index: 10;
|
|
}
|
|
|
|
.avatar-stack-item:first-child {
|
|
margin-left: 0;
|
|
}
|
|
|
|
/* Fixed Count Circle Style - Strict Dimensions */
|
|
.avatar-stack-count-circle {
|
|
width: 30px;
|
|
height: 30px;
|
|
min-width: 30px;
|
|
min-height: 30px;
|
|
border-radius: 50%;
|
|
background-color: #1a237e;
|
|
/* indigo-10 */
|
|
color: white;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 10px;
|
|
font-weight: bold;
|
|
z-index: 5;
|
|
}
|
|
|
|
/* Google Sheets Style Profile Card in Tooltip */
|
|
.profile-card {
|
|
min-width: 240px;
|
|
padding: 12px;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<div id="q-app">
|
|
<q-layout view="hHh Lpr fFf">
|
|
|
|
<!-- Main Header -->
|
|
<q-header elevated class="bg-indigo-9 text-white">
|
|
<q-toolbar class="q-py-xs">
|
|
<q-btn flat round dense icon="menu" @click="toggleLeftDrawer"></q-btn>
|
|
|
|
<div class="row items-center q-ml-md q-mr-sm">
|
|
<q-toolbar-title class="text-weight-bolder">
|
|
Hotline Planner
|
|
</q-toolbar-title>
|
|
</div>
|
|
|
|
<q-space></q-space>
|
|
|
|
<!-- Right Utility Section -->
|
|
<div class="row items-center q-gutter-sm">
|
|
|
|
<q-btn flat round dense icon="notifications">
|
|
<q-tooltip>Notifications</q-tooltip>
|
|
</q-btn>
|
|
|
|
<!-- USERS ONLINE SECTION (Component) -->
|
|
<user-presence></user-presence>
|
|
|
|
<q-btn flat round dense icon="account_circle">
|
|
<q-tooltip>My Profile</q-tooltip>
|
|
</q-btn>
|
|
</div>
|
|
</toolbar>
|
|
</q-header>
|
|
|
|
<!-- Drawers (Components) -->
|
|
<planner-settings></planner-settings>
|
|
<assignment-sidebar></assignment-sidebar>
|
|
|
|
<!-- Main Page -->
|
|
<q-page-container>
|
|
<q-page class="q-pa-none">
|
|
<planner-grid></planner-grid>
|
|
</q-page>
|
|
</q-page-container>
|
|
</q-layout>
|
|
</div>
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/quasar@2.16.0/dist/quasar.umd.prod.js"></script>
|
|
|
|
<!-- Load State & Components -->
|
|
<script src="js/store.js?v=2"></script>
|
|
<script src="js/components/validation-utils.js?v=2"></script>
|
|
<script src="js/components/user-presence.js?v=2"></script>
|
|
<script src="js/components/planner-settings.js?v=2"></script>
|
|
<script src="js/components/assignment-sidebar.js?v=2"></script>
|
|
<script src="js/components/agent-row.js?v=2"></script>
|
|
<script src="js/components/planner-grid.js?v=2"></script>
|
|
|
|
<script>
|
|
const { createApp, ref } = Vue;
|
|
|
|
const app = createApp({
|
|
setup() {
|
|
return {
|
|
toggleLeftDrawer: () => store.toggleLeftDrawer()
|
|
};
|
|
}
|
|
});
|
|
|
|
// Register Global Components
|
|
app.component('user-presence', UserPresence);
|
|
app.component('planner-settings', PlannerSettings);
|
|
app.component('assignment-sidebar', AssignmentSidebar);
|
|
app.component('planner-grid', PlannerGrid); // planner-grid registers agent-row locally
|
|
|
|
app.use(Quasar);
|
|
app.mount('#q-app');
|
|
</script>
|
|
</body>
|
|
|
|
</html> |