Files
rothbard/templates/dashboard.html

407 lines
22 KiB
HTML

{% extends 'base.html' %}
{% block content %}
<div class="h-full flex flex-col" x-data="columnConfig()">
<h1 class="text-xl font-semibold mb-4">Projects for {{ case_email }}</h1>
<!-- Configure Visible Columns Link -->
<div class="mb-4">
<button @click="showColumnModal = true"
class="text-blue-600 hover:text-blue-800 text-sm font-medium underline">
Configure Visible Columns...
</button>
</div>
<!-- Column Configuration Modal -->
<div x-show="showColumnModal"
x-cloak
x-transition
class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50"
@click.self="showColumnModal = false">
<div class="bg-white rounded-lg p-6 max-w-2xl w-full max-h-[80vh] overflow-y-auto">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Configure Visible Columns</h3>
<button @click="showColumnModal = false" class="text-gray-500 hover:text-gray-700">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
</svg>
</button>
</div>
<div class="mb-4">
<label class="flex items-center">
<input type="checkbox"
x-model="selectAll"
@change="toggleAllColumns()"
class="mr-2 rounded border-gray-300 text-blue-600 focus:ring-blue-500">
<span class="text-sm font-medium">Select All / Deselect All</span>
</label>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-3 max-h-96 overflow-y-auto">
<template x-for="(column, index) in columns" :key="index">
<label class="flex items-center p-2 hover:bg-slate-50 rounded cursor-pointer">
<input type="checkbox"
:value="index"
x-model="visibleColumns"
:changed="saveColumnSettings()"
:checked="visibleColumns.includes(index)"
class="mr-2 rounded border-gray-300 text-blue-600 focus:ring-blue-500">
<span class="text-sm" x-text="column"></span>
</label>
</template>
</div>
<div class="flex justify-end space-x-3 mt-6">
<button @click="resetToDefault()"
class="px-4 py-2 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 rounded-md transition-colors">
Reset to Default
</button>
<button @click="showColumnModal = false;"
class="px-4 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-md transition-colors">
Apply Changes
</button>
</div>
</div>
</div>
<div class="overflow-scroll">
<table class="w-full whitespace-nowrap shadow-md border border-slate-200">
<thead class=" text-left text-sm sticky top-0 z-10 border-b border-blue-800 text-white font-medium"
style="background-color: rgb(89, 121, 142);">
<tr>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(0)}">Matter Num</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(1)}">Client / Property</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(2)}">Matter Description</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(3)}">Defendant 1</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(4)}">Matter Open</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(5)}">Practice Area</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(6)}">Notice Type</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(7)}">Case Number</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(8)}">Premises Address</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(9)}">Premises City</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(10)}">Assigned Attorney</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(11)}">Primary Contact</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(12)}">Secondary Paralegal</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(13)}">Documents</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(14)}">Matter Stage</th>
<th class="px-4 py-3 w-[400px]" :class="{'hidden': !visibleColumns.includes(15)}">Completed Tasks</th>
<th class="px-4 py-3 w-[400px]" :class="{'hidden': !visibleColumns.includes(16)}">Pending Tasks</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(17)}">Notice Service Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(18)}">Notice Expir. Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(19)}">Date Case Filed</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(20)}">Daily Rent Damages</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(21)}">Default Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(22)}">Default Entered On</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(23)}">Motions:</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(24)}">Demurrer Hearing Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(25)}">Motion To Strike Hearing Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(26)}">Motion to Quash Hearing Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(27)}">Other Motion Hearing Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(28)}">MSC Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(29)}">MSC Time</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(30)}">MSC Address</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(31)}">MSC Div/ Dept/ Room</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(32)}">Trial Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(33)}">Trial Time</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(34)}">Trial Address</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(35)}">Trial Div/ Dept/ Room</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(36)}">Final Result of Trial/ MSC</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(37)}">Date of Settlement</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(38)}">Final Obligation Under the Stip</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(39)}">Def's Comply with the Stip?</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(40)}">Judgment Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(41)}">Writ Issued Date</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(42)}">Scheduled Lockout</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(43)}">Oppose Stays?</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(44)}">Premises Safety or Access Issues</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(45)}">Matter Gate or Entry Code</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(46)}">Date Possession Recovered</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(47)}">Attorney's Fees</th>
<th class="px-4 py-3" :class="{'hidden': !visibleColumns.includes(48)}">Costs</th>
</tr>
</thead>
<tbody class="bg-slate-100 divide-y divide-slate-300">
{% for r in rows %}
<tr class="hover:bg-slate-200 transition-colors duration-150 ease-in-out">
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(0)}"></td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(1)}">{{ r.client }}</td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(2)}">{{ r.matter_description }}</td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(3)}">{{ r.defendant_1 }}</td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(4)}">{{ r.matter_open }}</td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(5)}"></td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(6)}">{{ r.notice_type }}</td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(7)}">{{ r.case_number }}</td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(8)}">{{ r.premises_address }}</td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(9)}">{{ r.premises_city }}</td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(10)}">
{{ r.responsible_attorney }}
</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(11)}">
{{ r.staff_person }}
</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(12)}">
{{ r.staff_person_2 }}
</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(13)}">
{% if r.documents_url %}
<a href="{{ r.documents_url }}">Documents</a>
{% endif %}</td>
<td class="px-4 py-3 text-sm text-slate-800" :class="{'hidden': !visibleColumns.includes(14)}"> {{ r.phase_name }}</td>
<td class="px-4 py-3 text-sm align-top whitespace-normal w-[400px]" :class="{'hidden': !visibleColumns.includes(15)}" x-data="{ showCompletedModal: false}">
{% if r.completed_tasks %}
<div>
<table class="w-full text-xs">
<thead>
<tr>
<th class="text-left pb-1">Task</th>
<th class="text-right pb-1">Completed</th>
</tr>
</thead>
<tbody>
{% for x in r.completed_tasks[:2] %}
<tr>
<td class="py-1 pr-2 break-words">{{ x.description }}</td>
<td class="py-1 text-right whitespace-nowrap">{{ x.completed }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if r.completed_tasks|length > 2 %}
<button @click="showCompletedModal = true" class="text-blue-500 hover:text-blue-700 text-sm mt-1">Show more...</button>
{% endif %}
</div>
<div x-show="showCompletedModal"
x-cloak
x-transition
class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50"
@click.self="showCompletedModal = false">
<div class="bg-white rounded-lg p-6 max-w-lg w-full max-h-[80vh] overflow-y-auto">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Completed Tasks</h3>
<button @click="showCompletedModal = false" class="text-gray-500 hover:text-gray-700">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
</svg>
</button>
</div>
<table class="w-full">
<thead>
<tr class="border-b">
<th class="text-left pb-2">Task Description</th>
<th class="text-right pb-2">Completed Date</th>
</tr>
</thead>
<tbody>
{% for x in r.completed_tasks %}
<tr class="border-b border-slate-200">
<td class="py-2 break-words">{{ x.description }}</td>
<td class="py-2 text-right whitespace-nowrap">{{ x.completed }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endif %}
</td>
<td class="px-4 py-3 text-sm align-top whitespace-normal w-[400px] min-w-[400px]" :class="{'hidden': !visibleColumns.includes(16)}" x-data="{ showPendingModal: false }">
{% if r.pending_tasks %}
<div>
<table class="w-full text-xs">
<thead>
<tr>
<th class="text-left pb-1">Task</th>
</tr>
</thead>
<tbody>
{% for x in r.pending_tasks[:2] %}
<tr>
<td class="py-1 break-words">{{ x.description }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if r.pending_tasks|length > 2 %}
<button @click="showPendingModal = true" class="text-blue-500 hover:text-blue-700 text-sm mt-1">Show more...</button>
{% endif %}
</div>
<div x-show="showPendingModal"
x-cloak
x-transition
class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50"
@click.self="showPendingModal = false">
<div class="bg-white rounded-lg p-6 max-w-lg w-full max-h-[80vh] overflow-y-auto">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-semibold">Pending Tasks</h3>
<button @click="showPendingModal = false" class="text-gray-500 hover:text-gray-700">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
</svg>
</button>
</div>
<table class="w-full">
<thead>
<tr class="border-b">
<th class="text-left pb-2">Task Description</th>
</tr>
</thead>
<tbody>
{% for x in r.pending_tasks %}
<tr class="border-b border-slate-200">
<td class="py-2 break-words">{{ x.description }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endif %}
</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(17)}">{{ r.notice_service_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(18)}">{{ r.notice_expiration_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(19)}">{{ r.case_field_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(20)}">{% if r.daily_rent_damages %}${{ "{:,.2f}".format(r.daily_rent_damages) }}{% endif %}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(21)}">{{ r.default_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(22)}">{{ r.default_entered_on_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(23)}"></td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(24)}">{{ r.demurrer_hearing_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(25)}">{{ r.motion_to_strike_hearing_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(26)}">{{ r.motion_to_quash_hearing_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(27)}">{{ r.other_motion_hearing_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(28)}">{{ r.msc_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(29)}">{{ r.msc_time }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(30)}">{{ r.msc_address }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(31)}">{{ r.msc_div_dept_room }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(32)}">{{ r.trial_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(33)}">{{ r.trial_time }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(34)}">{{ r.trial_address }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(35)}">{{ r.trial_div_dept_room }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(36)}">{{ r.final_result }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(37)}">{{ r.date_of_settlement }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(38)}">{{ r.final_obligation }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(39)}">{{ r.def_comply_stip }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(40)}">{{ r.judgment_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(41)}">{{ r.writ_issued_date }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(42)}">{{ r.scheduled_lockout }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(43)}">{{ r.oppose_stays }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(44)}">{{ r.premises_safety }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(45)}">{{ r.matter_gate_code }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(46)}">{{ r.date_possession_recovered }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(47)}">{{ r.attorney_fees }}</td>
<td class="px-4 py-3 text-sm" :class="{'hidden': !visibleColumns.includes(48)}">{{ r.costs }}</td>
</tr>
{% else %}
<tr>
<td colspan="53" class="px-4 py-6 text-center text-slate-500">No matching projects found.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<script>
function columnConfig() {
return {
showColumnModal: false,
columns: [
'Matter Num',
'Client / Property',
'Matter Description',
'Defendant 1',
'Matter Open',
'Practice Area',
'Notice Type',
'Case Number',
'Premises Address',
'Premises City',
'Assigned Attorney',
'Primary Contact',
'Secondary Paralegal',
'Documents',
'Matter Stage',
'Completed Tasks',
'Pending Tasks',
'Notice Service Date',
'Notice Expir. Date',
'Date Case Filed',
'Daily Rent Damages',
'Default Date',
'Default Entered On',
'Motions:',
'Demurrer Hearing Date',
'Motion To Strike Hearing Date',
'Motion to Quash Hearing Date',
'Other Motion Hearing Date',
'MSC Date',
'MSC Time',
'MSC Address',
'MSC Div/ Dept/ Room',
'Trial Date',
'Trial Time',
'Trial Address',
'Trial Div/ Dept/ Room',
'Final Result of Trial/ MSC',
'Date of Settlement',
'Final Obligation Under the Stip',
'Def\'s Comply with the Stip?',
'Judgment Date',
'Writ Issued Date',
'Scheduled Lockout',
'Oppose Stays?',
'Premises Safety or Access Issues',
'Matter Gate or Entry Code',
'Date Possession Recovered',
'Attorney\'s Fees',
'Costs'
],
selectAll: true,
visibleColumns: [],
init() {
this.loadColumnSettings();
},
loadColumnSettings() {
const stored = localStorage.getItem('dashboardColumnVisibility');
console.log("STORED", stored)
if (stored) {
this.visibleColumns = JSON.parse(stored);
this.selectAll = this.visibleColumns.length === this.columns.length;
} else {
// Default to showing all columns
this.visibleColumns = this.columns.map((_, index) => index);
this.selectAll = true;
}
},
saveColumnSettings() {
console.log(JSON.stringify(this.visibleColumns))
localStorage.setItem('dashboardColumnVisibility', JSON.stringify(this.visibleColumns));
},
toggleAllColumns() {
if (this.selectAll) {
this.visibleColumns = this.columns.map((_, index) => index);
} else {
this.visibleColumns = [];
}
this.saveColumnSettings();
},
resetToDefault() {
this.visibleColumns = this.columns.map((_, index) => index);
this.selectAll = true;
this.saveColumnSettings();
}
}
}
</script>
</div>
<!--
<div class="flex flex-col m-4">
<div class=" w-full flex-grow overflow-scroll rounded-2xl overflow-hidden">
</div>
-->
{% endblock %}