From 19e8d9382192fecd5668d01018234412c3858590 Mon Sep 17 00:00:00 2001 From: Truptimayee Dash Date: Wed, 30 Jul 2025 14:17:41 +0530 Subject: [PATCH] my 2nd commit --- __manifest__.py | 12 +- models/__init__.py | 3 + models/__pycache__/__init__.cpython-310.pyc | Bin 749 -> 830 bytes .../enrollment_fee_summary.cpython-310.pyc | Bin 1000 -> 1000 bytes .../school_misc_menus.cpython-310.pyc | Bin 0 -> 2956 bytes ...chool_subject_teacher_info.cpython-310.pyc | Bin 1786 -> 1786 bytes .../teacher_attendance.cpython-310.pyc | Bin 0 -> 1327 bytes models/enrollment_fee_summary.py | 2 - models/school_misc_menus.py | 62 ++ models/teacher_attendance.py | 28 + security/ir.model.access.csv | 8 + static/src/description/icon.png | 0 static/src/description/login.js | 16 - static/src/style.css | 650 ------------------ views/application.xml | 33 +- views/enrollment.xml | 26 +- views/menu.xml | 101 ++- views/schedule.xml | 4 +- views/school_misc_views.xml | 108 +++ views/school_reporting_views.xml | 142 ++++ ...s.xml => school_subject_teacher_views.xml} | 40 +- views/teacher_attendance_view.xml | 40 ++ 22 files changed, 565 insertions(+), 710 deletions(-) create mode 100644 models/__pycache__/school_misc_menus.cpython-310.pyc create mode 100644 models/__pycache__/teacher_attendance.cpython-310.pyc create mode 100644 models/school_misc_menus.py create mode 100644 models/teacher_attendance.py delete mode 100644 static/src/description/icon.png delete mode 100644 static/src/description/login.js delete mode 100644 static/src/style.css create mode 100644 views/school_misc_views.xml create mode 100644 views/school_reporting_views.xml rename views/{school_subject_teacher_info_views.xml => school_subject_teacher_views.xml} (79%) create mode 100644 views/teacher_attendance_view.xml diff --git a/__manifest__.py b/__manifest__.py index bbb62df..4082d64 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -11,20 +11,18 @@ 'views/subject.xml', 'views/course.xml', 'views/course_attendance.xml', - 'views/school_subject_teacher_info_views.xml', + 'views/school_subject_teacher_views.xml', 'views/application.xml', 'views/enrollment.xml', 'views/assignment_views.xml', 'views/lesson_views.xml', - 'views/timeoff_views.xml', + 'views/timeoff_views.xml', + 'views/teacher_attendance_view.xml', + 'views/school_misc_views.xml', + 'views/school_reporting_views.xml', 'views/menu.xml', ], - 'assets': { - 'web.assets_frontend': [ - 'school_management/static/src/**/*', - ], - }, 'installable': True, 'application': True, } diff --git a/models/__init__.py b/models/__init__.py index f9de574..873b274 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -13,4 +13,7 @@ from . import school_course_schedule from . import school_course_assignment from . import school_subject_lesson from . import school_subject_teacher_info +from . import teacher_attendance +from . import school_misc_menus + diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc index ff98799973562135a2043f190a41e45641be42f0..c92e7aba017a9e3b887d22df214e40ba568641fe 100644 GIT binary patch delta 149 zcmaFMx{r-7pO=@50SG>A>CCWXn#d=^cwwUU4q1j2fgFZhfhYk+h7^VrK_FW&N)X5v z3TDt0-uS|qQBRZcmQYD*Vsb`mQG8-aNorn7VqS78P*kuuIU_$mCq6f`I5|EyHLtYT sPg7{J9+R(dks#2bA|W8LlA%Zh#1@&{!sO1VH2DmZJR1)q52FAh03Y)wfdBvi delta 73 zcmdnT_Lh||pO=@50SNk4nlrvIPUMqe+%Zvm2dh9ZgQnmnMrTH5KTUzjg-pJjD;bJ} afa;2bCSPQ7XOjamc^D=uFiSBBFaiLUFAu{2 diff --git a/models/__pycache__/enrollment_fee_summary.cpython-310.pyc b/models/__pycache__/enrollment_fee_summary.cpython-310.pyc index faebe4e0d5b62cf59a153ba043d50fa9bcbaba40..d39457a062f369105e71b82b78b981e268d9baf4 100644 GIT binary patch delta 81 zcmaFC{(_x5pO=@50SG?FbZq3l$;cJOo|~Unl95vxHTfN*5@!@!Wolv(h$qSPo=q62 Xut<0^AM-i^2ouZ)5h9b%Fv|b{&_ES+ delta 81 zcmaFC{(_x5pO=@50SM+zY1qhplacEddv1PSNk&fPt;z2gl{jy)Ri-8ufq0Tk@7ctG X3X8-i^D(azfH1*)5Fs)746_UXD1R4d diff --git a/models/__pycache__/school_misc_menus.cpython-310.pyc b/models/__pycache__/school_misc_menus.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8dd894c72aa6f0b44b465852d4eb7c0361d7bad GIT binary patch literal 2956 zcma)8O^@3|7`7cdah#9MX4`Emgk%9igpUY{gaB35mMtw3>LQV-2WutEo0;A9;@Iif zDa7Ii7Y@Df3ktU$IPiDo%89?Q;=uFH*xOXQ?bgw}89(#Rc;4szn8|uQ&%pD|-@hII zC6^s@fgc-cYAe}`ZOGZSNO2IkxfEYrAeFpD*QHCTh2CyiekfeplF4iKk893V~B z0@A9GCJ>jkfwU{61;k?=Ae{BP0$VP>DY%noKoBv{8#>kS*dB%8> z%jRLs6PC{iUVoZ+*+I)w2yO%>GXjg5L4#R=&7G4bYtYu8SV0SKE;g;-+T3~SveqAF z;Gx%HE_z*P^jMoV&APP7Cyk&FY~u)<{L^F`Y=GIDPwZg8hS=nm>`rFKS(fZ&MLgr> zR<7R0sd^nBWRYOymR9k#j{g;b(wW9Z!l%zn=?ea684J!zZ&E~}@b5+iFWs+Grh2k- zm*+DPFN!!z%Z}jrc$Uov!pJrl+&yE^mfIqQGq6M)x+LUe>rqP^-q4dHKW-Jrx zcf;_}GD@luN2vg0&lwjDEFkUO<48!SAfHK_93;J*oE0+ayF6vOXHWT0h3u>?Al(P> z)y*vBLA&BDX0kou37?Tm1MjikepqD64QrxL7Eq$nCh~0v*RW07>|1@)!|w`O)As&T zI_DDOEW#Pf;q6p4Y5*GWN%;-0isns}^x3vXhp)mMw z%oM(%l>qok@wB4>e-E6O-TOS{0z@(YyL4nK$Lx(d;tKX9u96_r#5EGvNszhX286W9 zHR28GIz`5!RnRBK!=rk|HMS^*g`(^&^e7T?DuJ3Z&)PNx;pb?gkL{r4??JqZCR7U> zgn=Z`)06{E&ppm_ZEQKL*f|7LQB-zl+}8@?ZG1sC@65AhTI`Ly*C0T=LsOi4Nfs5d z8L62Un*1*Gh^7}z?wf+}b0#|gcSv~*ao*&*WU?m8AL64blWpe0@V4C6hEGM5>cUi+ zf4wrlI2))**nF;AQE^&x6)hG?Jc}q3WUET_Q#a>@pDvT+nWa)$x><@dfEPS)?u&@= z%gOU$8Re*|Az{pPI5|f&`$7WW#{`OxH3A1nGeP*v3H%(RuTLPT^wc@iVQo<9$!nTQ zl1U`;<9JbVd86Wz{;H9h%;B1L9atY=8{$I}ACVxpmMT80xjGN~cYegtgDk8guzN`a z`m`8T55-`72&+pLDTs>*?bkk89-N?dm)(i(C~~JG z9jfZU37p9+6Nu8wYMc-A6u}5py%>cmu_~RMmbfrfKgIYbXfKdCATnv>9GPe500qd) z$%YbLABZwk+Ar(!=;@!ixeWK0iAKW(po7TQ&Zs*7mjf5+xsL?VnBS zR6YM&zM2ZUx0SsbdKe{35Z1mVBGsYL_<^sa^O$B_$j@h3`3tnQRHhSC5DuS6n{GG4 z!ka$bod{-iLatlv8pCt^flaj^mXDkUAuC+c?^u9HQX4shb{cvZTElS C7QpHN literal 0 HcmV?d00001 diff --git a/models/__pycache__/school_subject_teacher_info.cpython-310.pyc b/models/__pycache__/school_subject_teacher_info.cpython-310.pyc index a5a6ae6c004570517b82e4334c678cb736ffc5e5..e3725f48d67b9c15c0a3020a4ca6f49c2544456a 100644 GIT binary patch delta 20 acmeyx`-_)5pO=@50SI1h>DOK%%D5GJ|YhZOlC+bEhCMYqR2M28%LqNs}mb&*Tr1hvrv;da67P}VB@kjYhH z3C^X?p_lxJB)8uCV+vk->R(7uw8LGc(y3fK zYfy!;!8lh180*Pdo>05D3)b5)h?7;3@ z21D3;MQ*6rgMCckzz)xp%qB`dY#LR8tTMH{ZL&#S7o(;-8Oin0-by>(Q14-aDh6e; z<>AWG%%4wH*8Jxoug0|vSGH#fvw>-JUR~HotIK(=6+%BZTb;j@lOmnHxR8 z8$|fMDy4p5653vCxy!`%S9zy7WE9mt4i6a@-M2W+F_LR?On&_ACA}tZ5I(@J>6A{{ z*h8o|-a`&MhaAc-ytnivyJq_HhC^^ef1#HQ2zDSm(R=9YJw4JxTrJCC$-X#Rez~r2 zJg#-zOmY*iB8z3Am4rpCu5#0uxURZm7yc;mvARm?Y|=W`2k5nRt$pMWtK6t!Y(1?q z8?_Fw5x)_A+eLAtzB;d=uFuOwyLA0bOIgVaRbu_mJD{I`tkD`9quIh9rU<3%MGEs- zk!Ki9x<21W|HcIqF-`}xk6-XN_an;w;qRAsSKwG@J^CMCC&|8z(zKGLN>kfUQ;cd} zIDU|(mvdRHPW)B{g$|uMpSd5=25GH9Y3=%HqbIUj+^Z|q70W#t)^BQ%i>@8LQ&k|6 z(M}B4xum8=k>zLVsu7{?V5HrXV*6QLA-ZK=8GVR?wy+!Ij+43n-f5dpkwk=3_wBL+ zR}??^FbMi=o3>gfNo2X}g=Wss1>N1VVHu}0N Q)i(~=#)WY}2J{p5FLG{f`v3p{ literal 0 HcmV?d00001 diff --git a/models/enrollment_fee_summary.py b/models/enrollment_fee_summary.py index ba2c6d6..dfbd60c 100644 --- a/models/enrollment_fee_summary.py +++ b/models/enrollment_fee_summary.py @@ -11,8 +11,6 @@ class EnrollmentFeeSummary(models.Model): fee_slip_amount = fields.Float(string="Fee Slip Amount") due_fees = fields.Float(string="Due Fees") fee_element = fields.Char(string="Fee Element") - - frequency = fields.Selection([ ('monthly', 'Monthly'), ('quarterly', 'Quarterly'), diff --git a/models/school_misc_menus.py b/models/school_misc_menus.py new file mode 100644 index 0000000..bbcce01 --- /dev/null +++ b/models/school_misc_menus.py @@ -0,0 +1,62 @@ +from odoo import models, fields + +class SchoolNotice(models.Model): + _name = 'school.notice.board' + _description = 'School Notice Board' + + title = fields.Char("Title", required=True) + start_date = fields.Date("Start Date", required=True) + end_date = fields.Date("End Date") + description = fields.Text("Description") + school_id = fields.Many2one('res.company', string="School", default=lambda self: self.env.company) + visible_to = fields.Selection([ + ('all', 'All'), + ('students', 'Students'), + ('teachers', 'Teachers') + ], string="Visible To", default='all', required=True) + +class SchoolReportDummy(models.Model): + _name = 'school.reporting.dummy' + _description = 'Reporting Dummy' + + name = fields.Char("Report Name") + date_generated = fields.Date("Generated On", default=fields.Date.today) + + + +class SchoolFeesReport(models.Model): + _name = 'school.fees.report' + _description = 'Fees Report' + + name = fields.Char("Report Name") + amount = fields.Float("Amount") + +class SchoolTranscriptReport(models.Model): + _name = 'school.transcript.report' + _description = 'Transcript Report' + + student_id = fields.Many2one('school.application', string="Student", ondelete='set null') + grade = fields.Char("Grade") + +class SchoolScholarshipReport(models.Model): + _name = 'school.scholarship.report' + _description = 'Scholarship Report' + + student_id = fields.Many2one('school.application', string="Student", ondelete='set null') + scholarship_name = fields.Char("Scholarship Name") + awarded_amount = fields.Float("Awarded Amount") + +class SchoolReportCard(models.Model): + _name = 'school.report.card' + _description = 'Report Card' + + student_id = fields.Many2one('school.application', string="Student", ondelete='set null') + subject_id = fields.Many2one('school.subject', string="Subject Name", required=True) + score = fields.Float("Score") + +class SchoolConfigSettings(models.Model): + _name = 'school.config.settings' + _description = 'School Configuration Settings' + + key = fields.Char("Setting Key", required=True) + value = fields.Char("Setting Value") diff --git a/models/teacher_attendance.py b/models/teacher_attendance.py new file mode 100644 index 0000000..080edfc --- /dev/null +++ b/models/teacher_attendance.py @@ -0,0 +1,28 @@ +from odoo import models, fields, api +from odoo.exceptions import ValidationError + +class TeacherAttendance(models.Model): + _name = 'school.teacher.attendance' + _description = 'Teacher Attendance' + _order = 'date desc' + + teacher_id = fields.Many2one('school.subject.teacher.info', string='Teacher', required=True) + date = fields.Date(string='Date', required=True, default=fields.Date.today) + attendance_status = fields.Selection([ + ('present', 'Present'), + ('absent', 'Absent'), + ('on_leave', 'On Leave'), + ('late', 'Late') + ], string='Status', required=True, default='present') + remarks = fields.Text(string='Remarks') + + @api.constrains('date', 'teacher_id') + def _check_duplicate_attendance(self): + for rec in self: + existing = self.search([ + ('teacher_id', '=', rec.teacher_id.id), + ('date', '=', rec.date), + ('id', '!=', rec.id) + ]) + if existing: + raise ValidationError("Attendance for this teacher already exists on this date.") diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 5be56be..dc9143f 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -15,3 +15,11 @@ access_school_course_assignment,School Course Assignment,model_school_course_ass access_school_subject_lesson,School Subject Lesson,model_school_subject_lesson,,1,1,1,1 access_school_subject_teacher_info,School Subject Teacher Info,model_school_subject_teacher_info,,1,1,1,1 access_school_subject_teacher_info_admin,Subject Teacher Info,model_school_subject_teacher_info,school_management.group_school_admin,1,1,1,1 +access_teacher_attendance,Teacher Attendance,model_school_teacher_attendance,,1,1,1,1 +access_school_notice_board,School Notice Board,model_school_notice_board,,1,1,1,1 +access_school_reporting_dummy,School Reporting Dummy,model_school_reporting_dummy,,1,1,1,1 +access_school_config_settings,School Config Settings,model_school_config_settings,,1,1,1,1 +access_school_fees_report,Fees Report,model_school_fees_report,,1,1,1,1 +access_school_transcript_report,Transcript Report,model_school_transcript_report,,1,1,1,1 +access_school_scholarship_report,Scholarship Report,model_school_scholarship_report,,1,1,1,1 +access_school_report_card,Report Card,model_school_report_card,,1,1,1,1 \ No newline at end of file diff --git a/static/src/description/icon.png b/static/src/description/icon.png deleted file mode 100644 index e69de29..0000000 diff --git a/static/src/description/login.js b/static/src/description/login.js deleted file mode 100644 index aa96c78..0000000 --- a/static/src/description/login.js +++ /dev/null @@ -1,16 +0,0 @@ -// odoo.define('school_management.login_script', function (require) { -// "use strict"; - -// document.addEventListener("DOMContentLoaded", function () { -// const toggleBtn = document.querySelector("#toggle-password"); -// const pwField = document.querySelector("#password"); - -// if (toggleBtn && pwField) { -// toggleBtn.addEventListener("click", function () { -// const type = pwField.type === "password" ? "text" : "password"; -// pwField.type = type; -// toggleBtn.innerText = type === "password" ? "👁️" : "🙈"; -// }); -// } -// }); -// }); diff --git a/static/src/style.css b/static/src/style.css deleted file mode 100644 index 18fab5e..0000000 --- a/static/src/style.css +++ /dev/null @@ -1,650 +0,0 @@ -/* style.css - Main stylesheet for EduManage system */ - -/* Reset and Base Styles */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -html { - font-size: 16px; - scroll-behavior: smooth; -} - -body { - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - line-height: 1.6; - color: #333; - background-color: #f8fafc; -} - -/* Typography */ -h1, h2, h3, h4, h5, h6 { - color: #1a202c; - margin-bottom: 0.5rem; -} - -h1 { font-size: 2.5rem; font-weight: 700; } -h2 { font-size: 2rem; font-weight: 600; } -h3 { font-size: 1.5rem; font-weight: 600; } -h4 { font-size: 1.25rem; font-weight: 500; } -h5 { font-size: 1.125rem; font-weight: 500; } -h6 { font-size: 1rem; font-weight: 500; } - -p { - margin-bottom: 1rem; - color: #4a5568; -} - -a { - color: #3182ce; - text-decoration: none; - transition: color 0.2s ease; -} - -a:hover { - color: #2c5aa0; - text-decoration: underline; -} - -/* Layout Components */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 20px; -} - -.flex { - display: flex; -} - -.flex-column { - flex-direction: column; -} - -.justify-between { - justify-content: space-between; -} - -.justify-center { - justify-content: center; -} - -.align-center { - align-items: center; -} - -.text-center { - text-align: center; -} - -.text-right { - text-align: right; -} - -/* Header */ -.header { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 1rem 0; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - position: sticky; - top: 0; - z-index: 1000; -} - -.header .container { - display: flex; - justify-content: space-between; - align-items: center; -} - -.logo { - display: flex; - align-items: center; - font-size: 1.5rem; - font-weight: 700; -} - -.logo img { - height: 40px; - margin-right: 10px; -} - -.user-info { - display: flex; - align-items: center; - gap: 15px; -} - -.user-avatar { - width: 40px; - height: 40px; - border-radius: 50%; - border: 2px solid rgba(255, 255, 255, 0.3); -} - -.user-details h4 { - color: white; - margin: 0; -} - -.user-details span { - color: rgba(255, 255, 255, 0.8); - font-size: 0.875rem; -} - -/* Navigation */ -.sidebar { - background: white; - width: 250px; - min-height: calc(100vh - 80px); - box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1); - position: fixed; - left: 0; - top: 80px; - z-index: 999; - overflow-y: auto; -} - -.nav-menu { - padding: 20px 0; -} - -.nav-item { - display: flex; - align-items: center; - padding: 15px 25px; - color: #4a5568; - cursor: pointer; - transition: all 0.2s ease; - border-left: 3px solid transparent; -} - -.nav-item:hover { - background-color: #f7fafc; - color: #3182ce; - border-left-color: #3182ce; -} - -.nav-item.active { - background-color: #ebf8ff; - color: #3182ce; - border-left-color: #3182ce; - font-weight: 500; -} - -.nav-item i { - margin-right: 12px; - width: 20px; - text-align: center; -} - -/* Main Content */ -.main-content { - margin-left: 250px; - padding: 30px; - min-height: calc(100vh - 80px); -} - -.page-header { - margin-bottom: 30px; - padding-bottom: 20px; - border-bottom: 1px solid #e2e8f0; -} - -.page-title { - color: #1a202c; - margin-bottom: 5px; -} - -.page-subtitle { - color: #718096; - font-size: 0.875rem; -} - -/* Cards and Components */ -.card { - background: white; - border-radius: 8px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - margin-bottom: 20px; - overflow: hidden; - transition: box-shadow 0.2s ease; -} - -.card:hover { - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); -} - -.card-header { - padding: 20px; - background: #f7fafc; - border-bottom: 1px solid #e2e8f0; -} - -.card-title { - margin: 0; - color: #1a202c; -} - -.card-body { - padding: 20px; -} - -.card-footer { - padding: 15px 20px; - background: #f7fafc; - border-top: 1px solid #e2e8f0; -} - -/* Statistics Cards */ -.stats-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 20px; - margin-bottom: 30px; -} - -.stat-card { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 25px; - border-radius: 12px; - text-align: center; - box-shadow: 0 4px 12px rgba(102, 126, 234, 0.25); - transition: transform 0.2s ease; -} - -.stat-card:hover { - transform: translateY(-2px); -} - -.stat-card h3 { - color: rgba(255, 255, 255, 0.9); - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: 0.5px; - margin-bottom: 10px; -} - -.stat-value { - font-size: 2.5rem; - font-weight: 700; - color: white; -} - -.stat-change { - font-size: 0.875rem; - margin-top: 5px; - opacity: 0.8; -} - -/* Forms */ -.form-group { - margin-bottom: 20px; -} - -.form-label { - display: block; - margin-bottom: 5px; - color: #374151; - font-weight: 500; -} - -.form-input { - width: 100%; - padding: 12px 16px; - border: 1px solid #d1d5db; - border-radius: 6px; - font-size: 0.875rem; - transition: border-color 0.2s ease, box-shadow 0.2s ease; -} - -.form-input:focus { - outline: none; - border-color: #3182ce; - box-shadow: 0 0 0 3px rgba(49, 130, 206, 0.1); -} - -.form-select { - width: 100%; - padding: 12px 16px; - border: 1px solid #d1d5db; - border-radius: 6px; - background-color: white; - font-size: 0.875rem; - cursor: pointer; -} - -.form-textarea { - width: 100%; - padding: 12px 16px; - border: 1px solid #d1d5db; - border-radius: 6px; - font-size: 0.875rem; - resize: vertical; - min-height: 100px; -} - -/* Buttons */ -.btn { - display: inline-block; - padding: 12px 24px; - border: none; - border-radius: 6px; - font-size: 0.875rem; - font-weight: 500; - text-align: center; - cursor: pointer; - transition: all 0.2s ease; - text-decoration: none; -} - -.btn-primary { - background-color: #3182ce; - color: white; -} - -.btn-primary:hover { - background-color: #2c5aa0; - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(49, 130, 206, 0.25); -} - -.btn-secondary { - background-color: #e2e8f0; - color: #374151; -} - -.btn-secondary:hover { - background-color: #cbd5e0; -} - -.btn-success { - background-color: #38a169; - color: white; -} - -.btn-success:hover { - background-color: #2f855a; -} - -.btn-danger { - background-color: #e53e3e; - color: white; -} - -.btn-danger:hover { - background-color: #c53030; -} - -.btn-sm { - padding: 8px 16px; - font-size: 0.75rem; -} - -.btn-lg { - padding: 16px 32px; - font-size: 1rem; -} - -/* Tables */ -.table { - width: 100%; - border-collapse: collapse; - margin-top: 20px; -} - -.table th, -.table td { - padding: 12px 16px; - text-align: left; - border-bottom: 1px solid #e2e8f0; -} - -.table th { - background-color: #f7fafc; - font-weight: 600; - color: #374151; - text-transform: uppercase; - font-size: 0.75rem; - letter-spacing: 0.5px; -} - -.table tbody tr:hover { - background-color: #f7fafc; -} - -/* Login Page Styles */ -.login-container { - min-height: 100vh; - display: flex; - align-items: center; - justify-content: center; - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -} - -.login-card { - background: white; - padding: 40px; - border-radius: 12px; - box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); - width: 100%; - max-width: 400px; -} - -.login-header { - text-align: center; - margin-bottom: 30px; -} - -.login-logo { - height: 60px; - margin-bottom: 20px; -} - -/* Dashboard Specific Styles */ -.dashboard-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); - gap: 20px; - margin-top: 20px; -} - -.activity-item { - padding: 15px; - border-left: 4px solid #3182ce; - background: #f7fafc; - margin-bottom: 10px; - border-radius: 0 6px 6px 0; -} - -.activity-time { - color: #718096; - font-size: 0.75rem; - margin-top: 5px; -} - -/* Modals */ -.modal { - display: none; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - z-index: 10000; -} - -.modal-content { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background: white; - padding: 30px; - border-radius: 12px; - box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25); - max-width: 500px; - width: 90%; -} - -.modal-header { - margin-bottom: 20px; - padding-bottom: 15px; - border-bottom: 1px solid #e2e8f0; -} - -.modal-title { - margin: 0; - color: #1a202c; -} - -.close-btn { - position: absolute; - top: 15px; - right: 20px; - background: none; - border: none; - font-size: 1.5rem; - cursor: pointer; - color: #718096; -} - -.close-btn:hover { - color: #1a202c; -} - -/* Notifications */ -.notification { - position: fixed; - top: 20px; - right: 20px; - padding: 15px 20px; - border-radius: 6px; - color: white; - font-weight: 500; - z-index: 10001; - animation: slideIn 0.3s ease; -} - -.notification.info { - background-color: #3182ce; -} - -.notification.success { - background-color: #38a169; -} - -.notification.warning { - background-color: #d69e2e; -} - -.notification.error { - background-color: #e53e3e; -} - -@keyframes slideIn { - from { - transform: translateX(100%); - opacity: 0; - } - to { - transform: translateX(0); - opacity: 1; - } -} - -/* Responsive Design */ -@media (max-width: 768px) { - .sidebar { - transform: translateX(-100%); - transition: transform 0.3s ease; - } - - .sidebar.open { - transform: translateX(0); - } - - .main-content { - margin-left: 0; - padding: 20px 15px; - } - - .header .container { - padding: 0 15px; - } - - .stats-grid { - grid-template-columns: 1fr; - } - - .dashboard-grid { - grid-template-columns: 1fr; - } -} - -@media (max-width: 480px) { - .login-card { - margin: 20px; - padding: 30px 20px; - } - - .modal-content { - margin: 20px; - width: calc(100% - 40px); - } - - .stat-card { - padding: 20px; - } - - .stat-value { - font-size: 2rem; - } -} - -/* Utility Classes */ -.mt-10 { margin-top: 10px; } -.mt-20 { margin-top: 20px; } -.mb-10 { margin-bottom: 10px; } -.mb-20 { margin-bottom: 20px; } -.ml-10 { margin-left: 10px; } -.mr-10 { margin-right: 10px; } - -.p-10 { padding: 10px; } -.p-20 { padding: 20px; } -.pt-10 { padding-top: 10px; } -.pb-10 { padding-bottom: 10px; } - -.hidden { display: none; } -.visible { display: block; } - -.text-muted { color: #718096; } -.text-primary { color: #3182ce; } -.text-success { color: #38a169; } -.text-warning { color: #d69e2e; } -.text-danger { color: #e53e3e; } - -.bg-light { background-color: #f7fafc; } -.bg-primary { background-color: #3182ce; } -.bg-success { background-color: #38a169; } -.bg-warning { background-color: #d69e2e; } -.bg-danger { background-color: #e53e3e; } - -.border { border: 1px solid #e2e8f0; } -.border-top { border-top: 1px solid #e2e8f0; } -.border-bottom { border-bottom: 1px solid #e2e8f0; } -.border-left { border-left: 1px solid #e2e8f0; } -.border-right { border-right: 1px solid #e2e8f0; } - -.rounded { border-radius: 6px; } -.rounded-lg { border-radius: 12px; } -.rounded-full { border-radius: 50%; } - -.shadow { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } -.shadow-md { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } -.shadow-lg { box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); } \ No newline at end of file diff --git a/views/application.xml b/views/application.xml index 8200fcd..fb4e3c9 100644 --- a/views/application.xml +++ b/views/application.xml @@ -113,12 +113,9 @@
- -
+
- -


@@ -132,10 +129,36 @@
+ + + + school.application.pivot + school.application + + + + + + + + + + + + school.application.graph + school.application + + + + + + + + Applications school.application - list,form,kanban + list,form,kanban,graph,pivot diff --git a/views/enrollment.xml b/views/enrollment.xml index 33dcd4d..94fd5c9 100644 --- a/views/enrollment.xml +++ b/views/enrollment.xml @@ -119,11 +119,35 @@ + + school.enrollment.pivot + school.enrollment + + + + + + + + + + + + school.enrollment.graph + school.enrollment + + + + + + + + Enrollment school.enrollment - list,form,kanban + list,form,kanban,pivot,graph diff --git a/views/menu.xml b/views/menu.xml index d0fbf34..84b2502 100644 --- a/views/menu.xml +++ b/views/menu.xml @@ -28,40 +28,116 @@ action="action_school_class_schedule" sequence="50"/> + - - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + sequence="40"/> diff --git a/views/schedule.xml b/views/schedule.xml index 1e294cd..6326a49 100644 --- a/views/schedule.xml +++ b/views/schedule.xml @@ -82,8 +82,8 @@ - - + + Class Schedule school.class.schedule diff --git a/views/school_misc_views.xml b/views/school_misc_views.xml new file mode 100644 index 0000000..eaf990c --- /dev/null +++ b/views/school_misc_views.xml @@ -0,0 +1,108 @@ + + + school.notice.board.list + school.notice.board + + + + + + + + + + + + school.notice.board.form + school.notice.board + +
+ + + + + + + + + + + + + + +
+
+
+ + + + All Notices + school.notice.board + list,form + + + + school.reporting.dummy.list + school.reporting.dummy + + + + + + + + + + school.reporting.dummy.form + school.reporting.dummy + +
+ + + + +
+
+
+ + + + General Report + school.reporting.dummy + list,form + + + + school.config.settings.list + school.config.settings + + + + + + + + + + school.config.settings.form + school.config.settings + +
+ + + + +
+
+
+ + + + + Settings + school.config.settings + list,form + + +
diff --git a/views/school_reporting_views.xml b/views/school_reporting_views.xml new file mode 100644 index 0000000..4248172 --- /dev/null +++ b/views/school_reporting_views.xml @@ -0,0 +1,142 @@ + + + + + school.fees.report.list + school.fees.report + + + + + + + + + school.fees.report.form + school.fees.report + +
+ + + + + + +
+
+
+ + + + Fees Report + school.fees.report + list,form + + + + + + school.transcript.report.list + school.transcript.report + + + + + + + + + school.transcript.report.form + school.transcript.report + +
+ + + + + + +
+
+
+ + + + Transcript Report + school.transcript.report + list,form + + + + + + school.scholarship.report.list + school.scholarship.report + + + + + + + + + + school.scholarship.report.form + school.scholarship.report + +
+ + + + + + + +
+
+
+ + + + Scholarship Report + school.scholarship.report + list,form + + + + + + school.report.card.list + school.report.card + + + + + + + + + + school.report.card.form + school.report.card + +
+ + + + + + + +
+
+
+ + + + Report Card + school.report.card + list,form + + +
diff --git a/views/school_subject_teacher_info_views.xml b/views/school_subject_teacher_views.xml similarity index 79% rename from views/school_subject_teacher_info_views.xml rename to views/school_subject_teacher_views.xml index a9698ba..b5b7e2a 100644 --- a/views/school_subject_teacher_info_views.xml +++ b/views/school_subject_teacher_views.xml @@ -1,9 +1,9 @@ - - - school.subject.teacher.info.list + + + school.subject.teacher.list school.subject.teacher.info @@ -19,8 +19,8 @@ - - school.subject.teacher.info.form + + school.subject.teacher.form school.subject.teacher.info
@@ -56,8 +56,8 @@ - - school.subject.teacher.info.kanban + + school.subject.teacher.kanban school.subject.teacher.info @@ -86,8 +86,8 @@ - - school.subject.teacher.info.pivot + + school.subject.teacher.pivot school.subject.teacher.info @@ -100,14 +100,26 @@ + + + school.subject.teacher.search + school.subject.teacher.info + + + + + + + + + + + - Subject Teacher Info + All Teachers school.subject.teacher.info - list,form - -

Create Subject Teacher Information.

-
+ kanban,search,pivot,list,form
\ No newline at end of file diff --git a/views/teacher_attendance_view.xml b/views/teacher_attendance_view.xml new file mode 100644 index 0000000..a78e149 --- /dev/null +++ b/views/teacher_attendance_view.xml @@ -0,0 +1,40 @@ + + + + + teacher.attendance.list + school.teacher.attendance + + + + + + + + + + + + teacher.attendance.form + school.teacher.attendance + + + + + + + + + + + + + + + + Teacher Attendance + school.teacher.attendance + list,form + + +