Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 35988e9ce1 | |||
| 5fc4d8be30 | |||
| dcfd1f9542 | |||
| b99f816261 | |||
| 931e30b6f1 | |||
| 189bb1a628 | |||
| f04934039e | |||
| c13dcb07d1 | |||
| dd1d492c30 | |||
| a448288878 | |||
| 821e9cdc81 | |||
| 4e2d12e524 | |||
| 7bc999643a | |||
| 89e95b7851 | |||
| 2543df3d33 | |||
| 112d073235 | |||
| 2611730ec6 | |||
| 05dad52e10 | |||
| d158650be9 | |||
| 61facee902 | |||
| ed67836701 | |||
| d2abbc1458 | |||
| b52475ff0b | |||
| b2026812d5 | |||
| 58445b2a48 | |||
| 0f8a1fa0b1 | |||
| fee07bcceb | |||
| 70a6e2c104 | |||
| 11c93d3e82 | |||
| 7c5028a76d | |||
| aa1260afd6 | |||
| 35b9cba882 | |||
| a18198d547 | |||
| 97c3b03c39 | |||
| 7770b60658 | |||
| 4f5925e10a | |||
| 3cc5546733 | |||
| fe7b99581d | |||
| a6880ea14f |
@@ -1,180 +0,0 @@
|
|||||||
#--------------------------------------------------------------------
|
|
||||||
# Example Environment Configuration file
|
|
||||||
#
|
|
||||||
# This file can be used as a starting point for your own
|
|
||||||
# custom .env files, and contains most of the possible settings
|
|
||||||
# available in a default install.
|
|
||||||
#
|
|
||||||
# By default, all of the settings are commented out. If you want
|
|
||||||
# to override the setting, you must un-comment it by removing the '#'
|
|
||||||
# at the beginning of the line.
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# ENVIRONMENT
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
CI_ENVIRONMENT = development
|
|
||||||
|
|
||||||
# Which profile to use if none is supplied to sendEmail()
|
|
||||||
# Options: default, communication, payment, ...
|
|
||||||
MAIL_PROFILE_DEFAULT=default
|
|
||||||
|
|
||||||
# ===== DEFAULT (system) =====
|
|
||||||
# ---- Legacy fallbacks (kept for compatibility) ----
|
|
||||||
SMTP_HOST = smtp.gmail.com
|
|
||||||
SMTP_USER = alrahma.sunday.school@gmail.com
|
|
||||||
SMTP_PASS = "psnp emdq dykw ypul"
|
|
||||||
SMTP_PORT = 587
|
|
||||||
SMTP_ENCRYPTION = tls # was SSL; set to ssl to match 587
|
|
||||||
|
|
||||||
# Reply-To for all mail profiles
|
|
||||||
MAIL_DEFAULT_REPLY_TO=alrahma.isgl@gmail.com
|
|
||||||
MAIL_DEFAULT_REPLY_TO_NAME="Al Rahma Sunday School"
|
|
||||||
MAIL_COMMUNICATION_REPLY_TO=alrahma.isgl@gmail.com
|
|
||||||
MAIL_COMMUNICATION_REPLY_TO_NAME="School Communications"
|
|
||||||
MAIL_PAYMENT_REPLY_TO=alrahma.isgl@gmail.com
|
|
||||||
MAIL_PAYMENT_REPLY_TO_NAME="School Payments"
|
|
||||||
MAIL_DEFAULT_REPLY_TO="alrahma.isgl@gmail.com"
|
|
||||||
|
|
||||||
# Optional sender directory you already use elsewhere
|
|
||||||
MAIL_SENDERS="{\"general\":{\"email\":\"alrahma.isgl@gmail.com\",\"name\":\"Al Rahma No-Reply\"},\
|
|
||||||
\"registration\":{\"email\":\"alrahma.isgl@gmail.com\",\"name\":\"Al Rahma Register Office\"},\
|
|
||||||
\"notifications\":{\"email\":\"alrahma.isgl@gmail.com\",\"name\":\"Al Rahma Notifications\"},\
|
|
||||||
\"finance\":{\"email\":\"alrahma.isgl@gmail.com\",\"name\":\"Al Rahma Finance Office\"}}"
|
|
||||||
|
|
||||||
# Principal notification recipient for TimeOff requests (comma-separated allowed)
|
|
||||||
PRINCIPAL_EMAIL="principal@alrahmaisgl.org"
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# APP
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
# If you have trouble with `.`, you could also use `_`.
|
|
||||||
app_baseURL = 'http://localhost:8080/'
|
|
||||||
# app.forceGlobalSecureRequests = true
|
|
||||||
# app.CSPEnabled = false
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# DATABASE
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
database.default.hostname = 127.0.0.1
|
|
||||||
database.default.database = school
|
|
||||||
database.default.username = root
|
|
||||||
database.default.password = root
|
|
||||||
database.default.DBDriver = MySQLi
|
|
||||||
database.default.DBPrefix =
|
|
||||||
database.default.port = 3306
|
|
||||||
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# CONTENT SECURITY POLICY
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
# contentsecuritypolicy.reportOnly = false
|
|
||||||
# contentsecuritypolicy.defaultSrc = 'none'
|
|
||||||
# contentsecuritypolicy.scriptSrc = 'self'
|
|
||||||
# contentsecuritypolicy.styleSrc = 'self'
|
|
||||||
# contentsecuritypolicy.imageSrc = 'self'
|
|
||||||
# contentsecuritypolicy.baseURI = null
|
|
||||||
# contentsecuritypolicy.childSrc = null
|
|
||||||
# contentsecuritypolicy.connectSrc = 'self'
|
|
||||||
# contentsecuritypolicy.fontSrc = null
|
|
||||||
# contentsecuritypolicy.formAction = null
|
|
||||||
# contentsecuritypolicy.frameAncestors = null
|
|
||||||
# contentsecuritypolicy.frameSrc = null
|
|
||||||
# contentsecuritypolicy.mediaSrc = null
|
|
||||||
# contentsecuritypolicy.objectSrc = null
|
|
||||||
# contentsecuritypolicy.pluginTypes = null
|
|
||||||
# contentsecuritypolicy.reportURI = null
|
|
||||||
# contentsecuritypolicy.sandbox = false
|
|
||||||
# contentsecuritypolicy.upgradeInsecureRequests = false
|
|
||||||
# contentsecuritypolicy.styleNonceTag = '{csp-style-nonce}'
|
|
||||||
# contentsecuritypolicy.scriptNonceTag = '{csp-script-nonce}'
|
|
||||||
# contentsecuritypolicy.autoNonce = true
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# COOKIE
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
# cookie.prefix = ''
|
|
||||||
# cookie.expires = 0
|
|
||||||
# cookie.path = '/'
|
|
||||||
# cookie.domain = ''
|
|
||||||
# cookie.secure = false
|
|
||||||
# cookie.httponly = false
|
|
||||||
# cookie.samesite = 'Lax'
|
|
||||||
# cookie.raw = false
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# ENCRYPTION
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
# encryption.key =
|
|
||||||
# encryption.driver = OpenSSL
|
|
||||||
# encryption.blockSize = 16
|
|
||||||
# encryption.digest = SHA512
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# HONEYPOT
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
# honeypot.hidden = 'true'
|
|
||||||
# honeypot.label = 'Fill This Field'
|
|
||||||
# honeypot.name = 'honeypot'
|
|
||||||
# honeypot.template = '<label>{label}</label><input type="text" name="{name}" value=""/>'
|
|
||||||
# honeypot.container = '<div style="display:none">{template}</div>'
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# SECURITY
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
# security.csrfProtection = 'cookie'
|
|
||||||
# security.tokenRandomize = false
|
|
||||||
# security.tokenName = 'csrf_token_name'
|
|
||||||
# security.headerName = 'X-CSRF-TOKEN'
|
|
||||||
# security.cookieName = 'csrf_cookie_name'
|
|
||||||
# security.expires = 7200
|
|
||||||
# security.regenerate = true
|
|
||||||
# security.redirect = false
|
|
||||||
# security.samesite = 'Lax'
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# SESSION
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
# session.driver = 'CodeIgniter\Session\Handlers\FileHandler'
|
|
||||||
# session.cookieName = 'ci_session'
|
|
||||||
# session.expiration = 7200
|
|
||||||
# session.savePath = null
|
|
||||||
# session.matchIP = false
|
|
||||||
# session.timeToUpdate = 300
|
|
||||||
# session.regenerateDestroy = false
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# LOGGER
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
# logger.threshold = 4
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
# CURLRequest
|
|
||||||
#--------------------------------------------------------------------
|
|
||||||
|
|
||||||
# curlrequest.shareOptions = false
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mail.protocol = smtp
|
|
||||||
mail.SMTPHost = ${SMTP_HOST}
|
|
||||||
mail.SMTPUser = ${SMTP_USER}
|
|
||||||
mail.SMTPPass = ${SMTP_PASS}
|
|
||||||
mail.SMTPPort = ${SMTP_PORT}
|
|
||||||
mail.SMTPCrypto = tls
|
|
||||||
|
|
||||||
mail.fromEmail = ${SMTP_USER}
|
|
||||||
mail.fromName = "Al Rahma Sunday School"
|
|
||||||
mail.mailType = text
|
|
||||||
mail.charset = UTF-8
|
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
|
||||||
|
/vendor/
|
||||||
|
/node_modules/
|
||||||
|
|
||||||
|
/writable/cache/*
|
||||||
|
/writable/debugbar/*
|
||||||
|
/writable/logs/*
|
||||||
|
/writable/session/*
|
||||||
|
/writable/uploads/*
|
||||||
|
/writable/tmp/*
|
||||||
|
/writable/*.log
|
||||||
|
|
||||||
|
!/writable/.gitkeep
|
||||||
|
!/writable/cache/.gitkeep
|
||||||
|
!/writable/debugbar/.gitkeep
|
||||||
|
!/writable/logs/.gitkeep
|
||||||
|
!/writable/session/.gitkeep
|
||||||
|
!/writable/uploads/.gitkeep
|
||||||
|
!/writable/tmp/.gitkeep
|
||||||
|
|
||||||
|
/public/build/
|
||||||
|
/public/hot/
|
||||||
|
/public/uploads/**
|
||||||
|
!/public/uploads/**/index.html
|
||||||
|
!/public/uploads/.gitkeep
|
||||||
|
|
||||||
|
/uploads/**
|
||||||
|
!/uploads/**/index.html
|
||||||
|
!/uploads/.gitkeep
|
||||||
|
|
||||||
|
docker-compose.override.yml
|
||||||
|
docker-compose.local.yml
|
||||||
|
|
||||||
|
*.log
|
||||||
|
.swp
|
||||||
|
.swo
|
||||||
|
*~
|
||||||
|
.tmp
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
.codex/
|
||||||
|
|
||||||
|
/coverage/
|
||||||
|
/build/
|
||||||
|
/builds
|
||||||
|
/phpunit.xml.cache
|
||||||
|
/.phpunit.result.cache
|
||||||
|
/writable/reports/*
|
||||||
|
/writable/test.txt
|
||||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
+2
-6
@@ -393,8 +393,8 @@ $routes->get('print-requests/file/(:segment)', 'PrintRequests::serveFile/$1', ['
|
|||||||
$routes->get('print-requests/file/(:segment)/(:alpha)', 'PrintRequests::serveFile/$1/$2', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
$routes->get('print-requests/file/(:segment)/(:alpha)', 'PrintRequests::serveFile/$1/$2', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
||||||
$routes->get('uploads/print_requests/(:segment)', 'PrintRequests::serveFile/$1', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
$routes->get('uploads/print_requests/(:segment)', 'PrintRequests::serveFile/$1', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
||||||
|
|
||||||
$routes->get('exam-drafts/files/teacher/(:segment)', 'View\FilesController::examDraftTeacher/$1', ['filter' => 'auth:teacher,teacher_assistant,admin,administrator,principal']);
|
$routes->get('exam-drafts/files/teacher/(:segment)', 'View\FilesController::examDraftTeacher/$1', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
||||||
$routes->get('exam-drafts/files/final/(:segment)', 'View\FilesController::examDraftFinal/$1', ['filter' => 'auth:teacher,teacher_assistant,admin,administrator,principal']);
|
$routes->get('exam-drafts/files/final/(:segment)', 'View\FilesController::examDraftFinal/$1', ['filter' => 'auth:teacher,teacher_assistant,admin']);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -537,7 +537,6 @@ $routes->post('payment/event_charges', 'View\EventController::eventUpdate');
|
|||||||
$routes->get('administrator/event-charges', 'View\EventController::eventShow');
|
$routes->get('administrator/event-charges', 'View\EventController::eventShow');
|
||||||
$routes->post('administrator/event-charges/remove/(:num)', 'View\EventController::removeCharge/$1');
|
$routes->post('administrator/event-charges/remove/(:num)', 'View\EventController::removeCharge/$1');
|
||||||
$routes->post('administrator/event-charges/payment/(:num)', 'View\EventController::toggleEventPayment/$1');
|
$routes->post('administrator/event-charges/payment/(:num)', 'View\EventController::toggleEventPayment/$1');
|
||||||
$routes->post('administrator/event-charges/waiver/(:num)', 'View\EventController::toggleWaiverStatus/$1');
|
|
||||||
$routes->get('administrator/get-students-with-charges', 'View\EventController::getStudentsWithCharges');
|
$routes->get('administrator/get-students-with-charges', 'View\EventController::getStudentsWithCharges');
|
||||||
|
|
||||||
$routes->get('parent/events', 'View\ParentController::parentEventPage', ['filter' => 'auth:parent']);
|
$routes->get('parent/events', 'View\ParentController::parentEventPage', ['filter' => 'auth:parent']);
|
||||||
@@ -745,9 +744,6 @@ $routes->post('/administrator/teacher-submissions/notify', 'View\AdministratorCo
|
|||||||
$routes->get('/administrator/exam-drafts', 'View\ExamDraftController::adminIndex', ['filter' => 'auth:admin']);
|
$routes->get('/administrator/exam-drafts', 'View\ExamDraftController::adminIndex', ['filter' => 'auth:admin']);
|
||||||
$routes->post('/administrator/exam-drafts/review', 'View\ExamDraftController::adminReview', ['filter' => 'auth:admin']);
|
$routes->post('/administrator/exam-drafts/review', 'View\ExamDraftController::adminReview', ['filter' => 'auth:admin']);
|
||||||
$routes->post('/administrator/exam-drafts/upload-legacy', 'View\ExamDraftController::adminUploadLegacy', ['filter' => 'auth:admin']);
|
$routes->post('/administrator/exam-drafts/upload-legacy', 'View\ExamDraftController::adminUploadLegacy', ['filter' => 'auth:admin']);
|
||||||
$routes->get('/principal/exam-drafts', 'View\ExamDraftController::principalIndex', ['filter' => 'auth:admin']);
|
|
||||||
$routes->post('/principal/exam-drafts/review', 'View\ExamDraftController::principalReview', ['filter' => 'auth:admin']);
|
|
||||||
$routes->post('/principal/exam-drafts/upload-legacy', 'View\ExamDraftController::principalUploadLegacy', ['filter' => 'auth:admin']);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* --------------------------------------------------------------------
|
* --------------------------------------------------------------------
|
||||||
|
|||||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
+2
-54
@@ -2003,58 +2003,6 @@ class AttendanceTrackingController extends BaseController
|
|||||||
return [$subject, $body];
|
return [$subject, $body];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function buildFallbackTemplate(string $code, string $variant, array $context): array
|
|
||||||
{
|
|
||||||
$studentName = (string) ($context['{{student_name}}'] ?? 'the student');
|
|
||||||
$incident = (string) ($context['{{incident_date}}'] ?? date('Y-m-d'));
|
|
||||||
$parentName = (string) ($context['{{parent_name}}'] ?? 'Parent/Guardian');
|
|
||||||
$phone = (string) ($context['{{school_phone}}'] ?? 'the school office');
|
|
||||||
$voicemail = (string) ($context['{{voicemail_phone}}'] ?? 'your voicemail');
|
|
||||||
|
|
||||||
$subject = match (true) {
|
|
||||||
str_starts_with($code, 'ABS_1') => 'Attendance Notice: Unreported Absence',
|
|
||||||
str_starts_with($code, 'ABS_2') => 'Attendance Follow-Up: Two Consecutive Absences',
|
|
||||||
str_starts_with($code, 'ABS_3') => 'Attendance Follow-Up: Three Absences',
|
|
||||||
str_starts_with($code, 'LATE_2') => 'Attendance Notice: Repeated Lateness',
|
|
||||||
str_starts_with($code, 'LATE_3'),
|
|
||||||
str_starts_with($code, 'LATE_4'),
|
|
||||||
str_starts_with($code, 'MIX') => 'Attendance Follow-Up: Repeated Lateness and Absence',
|
|
||||||
default => 'Attendance Notice',
|
|
||||||
};
|
|
||||||
|
|
||||||
$intro = "<p>Insha Allah this email finds you well";
|
|
||||||
if ($variant === 'answered') {
|
|
||||||
$intro .= ", <strong>{$parentName}</strong>. Jazakum Allahu khayran for taking the time to speak with us today.</p>";
|
|
||||||
} elseif ($variant === 'no_answer') {
|
|
||||||
$intro .= ".</p><p>We tried to reach you but could not connect and left a voice message at <strong>{$voicemail}</strong>.</p>";
|
|
||||||
} else {
|
|
||||||
$intro .= ".</p>";
|
|
||||||
}
|
|
||||||
|
|
||||||
$details = match (true) {
|
|
||||||
str_starts_with($code, 'ABS_1')
|
|
||||||
=> "<p>This is to let you know that <strong>{$studentName}</strong> was absent on <strong>{$incident}</strong> without prior notice.</p>",
|
|
||||||
str_starts_with($code, 'ABS_2')
|
|
||||||
=> "<p>This is a reminder that <strong>{$studentName}</strong> has had repeated absences, most recently on <strong>{$incident}</strong>, without prior notice.</p>",
|
|
||||||
str_starts_with($code, 'ABS_3')
|
|
||||||
=> "<p>This is a reminder that <strong>{$studentName}</strong> has been absent three times, most recently on <strong>{$incident}</strong>, without prior notice.</p>",
|
|
||||||
str_starts_with($code, 'LATE_2')
|
|
||||||
=> "<p>This is a reminder that <strong>{$studentName}</strong> has been late multiple times, most recently on <strong>{$incident}</strong>.</p>",
|
|
||||||
str_starts_with($code, 'LATE_3'),
|
|
||||||
str_starts_with($code, 'LATE_4')
|
|
||||||
=> "<p>This is a follow-up that <strong>{$studentName}</strong> has had repeated lateness concerns, most recently on <strong>{$incident}</strong>.</p>",
|
|
||||||
str_starts_with($code, 'MIX')
|
|
||||||
=> "<p>This is a follow-up that <strong>{$studentName}</strong> has had a mix of repeated lateness and absence concerns, most recently on <strong>{$incident}</strong>.</p>",
|
|
||||||
default
|
|
||||||
=> "<p>We'd like to inform you about <strong>{$studentName}</strong>'s recent attendance concern dated <strong>{$incident}</strong>.</p>",
|
|
||||||
};
|
|
||||||
|
|
||||||
$closing = "<p>If your child will be absent or late due to illness or family commitments, please let us know ahead of time.</p>"
|
|
||||||
. "<p>You can email/call/text us at <strong>{$phone}</strong>.</p>";
|
|
||||||
|
|
||||||
return [$subject, $intro . $details . $closing];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function compose()
|
public function compose()
|
||||||
{
|
{
|
||||||
@@ -2085,8 +2033,8 @@ class AttendanceTrackingController extends BaseController
|
|||||||
$rendered = $this->renderTemplate($code, $variant, $ctx);
|
$rendered = $this->renderTemplate($code, $variant, $ctx);
|
||||||
|
|
||||||
if (!$rendered) {
|
if (!$rendered) {
|
||||||
log_message('warning', 'Attendance email template missing; using fallback compose body. code=' . $code . ' variant=' . $variant);
|
return redirect()->to(site_url('attendance/violations'))
|
||||||
$rendered = $this->buildFallbackTemplate($code, $variant, $ctx);
|
->with('error', 'Template not found for ' . $code . ' (' . $variant . ').');
|
||||||
}
|
}
|
||||||
|
|
||||||
[$subject, $body] = $rendered;
|
[$subject, $body] = $rendered;
|
||||||
|
|||||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user