change style css

This commit is contained in:
hamed
2026-07-02 10:51:48 +03:30
parent 6d594822bf
commit fb90e447d8
13 changed files with 6704 additions and 2068 deletions
@@ -0,0 +1,139 @@
# رفع بهم‌ریختگی کامل پنل ادمین روی iPhone 8 (Safari/Chrome iOS)
## پروژه
`clinicpro` (فقط CSS پنل ادمین React — بدون تغییر backend یا API)
## زمینه
پنل ادمین (`https://clinic-pro.ddev.site/admin`) روی دسکتاپ و موبایل‌های جدید درست است، اما روی **iPhone 8** با **هر دو مرورگر Chrome و Safari** کامل بهم‌ریخته دیده می‌شود (رنگ‌ها، پس‌زمینه‌ها، دکمه‌ها، بوردرها خراب).
نکته کلیدی: Chrome روی iOS هم از موتور **WebKit** استفاده می‌کند (نه Blink). پس «هر دو مرورگر خراب» یعنی مشکل از **موتور WebKit قدیمیِ iPhone 8** است، نه مرورگر. iPhone 8 حداکثر به iOS 16.7 می‌رسد و بسیاری از کاربران روی iOS ۱۵.x یا ۱۶.۰–۱۶.۱ می‌مانند.
## مشکل / هدف
استایل پنل به‌شدت به توابع رنگ مدرن CSS وابسته است که روی WebKit قدیمی پشتیبانی نمی‌شوند و مقدارشان **نامعتبر** می‌شود → مرورگر مقدار را دور می‌ریزد → رنگ به transparent/سیاه/ارثی می‌افتد → کل UI بهم می‌ریزد:
- **`oklch()`** — فقط Safari 15.4+ . روی iOS 15.015.3 خراب.
- **`color-mix()`** — فقط Safari 16.2+ . روی iOS 15.x و 16.0/16.1 خراب. (**۳۰ مورد** در فایل)
- **Tailwind v4** — رسماً فقط Safari ‏16.4+ را هدف می‌گیرد (`@property`, cascade layers, oklch). روی iPhone 8 قدیمی base/reset ناقص اجرا می‌شود.
هدف: افزودن fallback رنگ sRGB و گارد `@supports` تا پنل روی WebKit قدیمی هم صحیح رندر شود (progressive enhancement — روی مرورگر جدید دقیقاً مثل الان بماند).
## فایل‌های مرتبط
| فایل | نقش |
|------|-----|
| `clinicpro/assets/admin/styles.css` | تمام متغیرهای رنگ + ۳۰ مورد `color-mix` + `oklch` |
| `clinicpro/templates/admin/index.html.twig` | shell پنل (viewport موجود و درست) |
| `clinicpro/package.json` | Tailwind v4 (`tailwindcss@^4`, `@tailwindcss/postcss@^4`) |
## وضعیت فعلی
هیچ fallback و هیچ `@supports` وجود ندارد (`grep -c "@supports" = 0`).
متغیرهای رنگ فقط با `oklch` تعریف شده‌اند (خط ۳۰ و ۸۵):
```css
/* :root روشن */
--primary: oklch(0.55 var(--brand-c) var(--brand-h));
--primary-600: oklch(0.49 var(--brand-c) var(--brand-h));
--primary-700: oklch(0.43 var(--brand-c) var(--brand-h));
--primary-soft: oklch(0.95 0.03 var(--brand-h));
--primary-soft2: oklch(0.90 0.05 var(--brand-h));
--ring: color-mix(in oklch, var(--primary) 32%, transparent);
```
تم تیره (خط ۸۵+) کلاً روی `color-mix` سوار است → روی iOS قدیمی کامل خراب:
```css
[data-theme="dark"] {
--primary: oklch(0.66 var(--brand-c) var(--brand-h));
--primary-soft: color-mix(in oklch, var(--primary) 16%, var(--surface));
--success-bg: color-mix(in oklch, var(--success) 18%, var(--surface));
--warning-bg: color-mix(in oklch, var(--warning) 18%, var(--surface));
/* ... danger-bg, info-bg, violet-bg, accent-bg, stat-*-bg همه color-mix */
}
```
استفاده inline در قوانین (خط ۴۶۹–۴۷۳ و بلوک settings جدید):
```css
.appt-status.status-green { border-color: color-mix(in srgb, var(--success) 25%, transparent); }
.toggle-row.on { border-color: color-mix(in oklch, var(--primary) 40%, var(--border)); }
.save-bar.ok { border-color: color-mix(in oklch, var(--success) 45%, var(--border)); }
.gw-card ... /* و موارد مشابه */
```
## وظایف
### ۱. fallback هگز sRGB برای متغیرهای رنگِ مبتنی بر oklch
برای هر متغیری که با `oklch()` تعریف شده، یک خط هگز sRGB **قبل** از خط oklch بگذار. مرورگر قدیمی خط oklch را نامعتبر می‌بیند و خط هگز قبلی را نگه می‌دارد؛ مرورگر جدید oklch را استفاده می‌کند.
الگو (در `:root` روشن):
```css
:root {
/* primary = تقریب sRGB از brand-h:256 brand-c:0.15 */
--primary: #5b5ef0; /* fallback */
--primary: oklch(0.55 var(--brand-c) var(--brand-h));
--primary-600: #4a4dd6; /* fallback */
--primary-600: oklch(0.49 var(--brand-c) var(--brand-h));
--primary-700: #3d40b8; /* fallback */
--primary-700: oklch(0.43 var(--brand-c) var(--brand-h));
--primary-soft: #eceafd; /* fallback */
--primary-soft: oklch(0.95 0.03 var(--brand-h));
--primary-soft2: #d9d5fb; /* fallback */
--primary-soft2: oklch(0.90 0.05 var(--brand-h));
--ring: rgba(91,94,240,.32); /* fallback */
--ring: color-mix(in oklch, var(--primary) 32%, transparent);
}
```
- مقادیر هگز باید چشمی به رنگ oklch نزدیک باشند (با ابزار تبدیل oklch→sRGB بگیر؛ `--brand-h: 256`, `--brand-c: 0.15`).
- همین کار را برای **تم تیره** (`[data-theme="dark"]`) تکرار کن: `--primary`, `--primary-600/700`, و همه `*-soft`/`*-bg` که با color-mix ساخته شده‌اند، هرکدام یک هگز fallback قبل از خط color-mix بگیرند (رنگ تیره مناسب سطح تیره).
### ۲. fallback برای color-mix در قوانین inline
هرجا `color-mix()` مستقیم داخل یک قانون استفاده شده (نه در تعریف متغیر)، یک خط رنگ ساده **قبل** از آن بگذار:
```css
.appt-status.status-green {
border-color: rgba(21,163,90,.25); /* fallback */
border-color: color-mix(in srgb, var(--success) 25%, transparent);
}
.toggle-row.on {
border-color: var(--border-2); /* fallback */
border-color: color-mix(in oklch, var(--primary) 40%, var(--border));
}
.save-bar.ok {
border-color: var(--success); /* fallback */
border-color: color-mix(in oklch, var(--success) 45%, var(--border));
}
```
- کل ۳۰ مورد `color-mix` را پیدا کن (`grep -n "color-mix" assets/admin/styles.css`) و برای هرکدام fallback مناسب اضافه کن.
- `color-mix(in srgb, ...)` هم روی iOS < 16.2 خراب است؛ پس این‌ها هم باید fallback بگیرند.
### ۳. تصمیم درباره Tailwind v4
Tailwind v4 فقط Safari 16.4+ را هدف می‌گیرد. بررسی کن پنل چقدر به utilityهای Tailwind وابسته است (به‌نظر کم — بیشتر استایل‌ها inline یا کلاس‌های design-system سفارشی‌اند: `grep -rho 'className="[^"]*"' assets/admin | grep -oE '(flex|grid|text-|bg-|p-[0-9]|gap-|rounded)'`).
- اگر وابستگی کم بود: کافی است وظیفه ۱ و ۲ انجام شود؛ مشکل اصلی رنگ‌هاست.
- اگر جایی از رنگ‌های Tailwind (`bg-*`, `text-*`) استفاده شده که oklch تولید می‌کنند و روی iOS قدیمی خرابند، همان‌ها را با کلاس design-system سفارشی (که حالا fallback دارد) جایگزین کن.
- در فایل پرامپت خروجی، حداقل نسخهٔ پشتیبانی‌شده را مستند کن.
### ۴. تست
- با Safari دسکتاپ: Develop → Enter Responsive Design Mode → iPhone 8 و نسخه‌ی WebKit قدیمی؛ یا BrowserStack با iOS 15.x.
- چک کن: رنگ primary دکمه‌ها، پس‌زمینه کارت‌ها، بوردرها، تم تیره، chipهای وضعیت، صفحه `/admin/settings` (toggleها و gw-cardها).
- مطمئن شو روی مرورگر جدید هیچ تغییری در ظاهر ایجاد نشده (fallback فقط روی قدیمی فعال می‌شود).
## نکات مهم
- **ترتیب اعلان‌ها حیاتی است:** خط fallback باید *قبل* از خط مدرن بیاید. CSS اعلان نامعتبر را دور می‌ریزد و آخرین اعلانِ معتبر را نگه می‌دارد.
- تغییر فقط در `assets/admin/styles.css` (و در صورت نیاز جزئی در twig برای `theme-color`). backend/API دست نخورد → نیاز به migration یا آپدیت `docs/api/` نیست.
- بعد از تغییر CSS: `ddev exec yarn dev` بزن و کامپایل موفق را تأیید کن (خطای شناخته‌شدهٔ `lightningcss.linux-arm64-gnu` روی ddev بی‌ربط است).
- مراقب باش fallbackها با تم تیره تداخل نکنند؛ `[data-theme="dark"]` مقادیر خودش را دارد و باید fallback تیره بگیرد نه روشن.
- viewport در twig درست است (`width=device-width, initial-scale=1`) — دست نزن.
+63 -29
View File
@@ -27,11 +27,12 @@
--text: #0f1b2e; --text: #0f1b2e;
--text-2: #56657c; --text-2: #56657c;
--text-3: #8a98ad; --text-3: #8a98ad;
--primary: oklch(0.55 var(--brand-c) var(--brand-h)); /* مقادیر sRGB پایه (fallback WebKit قدیمی iPhone 8)؛ نسخه oklch در @supports پایین فایل */
--primary-600: oklch(0.49 var(--brand-c) var(--brand-h)); --primary: #5457dd;
--primary-700: oklch(0.43 var(--brand-c) var(--brand-h)); --primary-600: #464ac9;
--primary-soft: oklch(0.95 0.03 var(--brand-h)); --primary-700: #3b3eae;
--primary-soft2: oklch(0.90 0.05 var(--brand-h)); --primary-soft: #ecedfb;
--primary-soft2: #d9dbf6;
--on-primary: #ffffff; --on-primary: #ffffff;
--success: #15a35a; --success: #15a35a;
--success-bg: #e6f6ed; --success-bg: #e6f6ed;
@@ -52,7 +53,7 @@
--stat-violet-bg: rgba(85,89,206,0.08); --stat-violet-fg: #5559CE; --stat-violet-bg: rgba(85,89,206,0.08); --stat-violet-fg: #5559CE;
--stat-green-bg: rgba(0,157,121,0.10); --stat-green-fg: #009D79; --stat-green-bg: rgba(0,157,121,0.10); --stat-green-fg: #009D79;
--stat-pink-bg: rgba(241,119,50,0.10); --stat-pink-fg: #F17732; --stat-pink-bg: rgba(241,119,50,0.10); --stat-pink-fg: #F17732;
--ring: color-mix(in oklch, var(--primary) 32%, transparent); --ring: rgba(84,87,221,.32);
--shadow-sm: 0 1px 2px rgba(15,27,46,.06), 0 1px 3px rgba(15,27,46,.05); --shadow-sm: 0 1px 2px rgba(15,27,46,.06), 0 1px 3px rgba(15,27,46,.05);
--shadow: 0 2px 6px rgba(15,27,46,.06), 0 8px 24px rgba(15,27,46,.06); --shadow: 0 2px 6px rgba(15,27,46,.06), 0 8px 24px rgba(15,27,46,.06);
--shadow-lg: 0 12px 32px rgba(15,27,46,.12), 0 4px 10px rgba(15,27,46,.06); --shadow-lg: 0 12px 32px rgba(15,27,46,.12), 0 4px 10px rgba(15,27,46,.06);
@@ -82,29 +83,61 @@
--text: #e9eef7; --text: #e9eef7;
--text-2: #9eb0c6; --text-2: #9eb0c6;
--text-3: #67788e; --text-3: #67788e;
--primary: oklch(0.66 var(--brand-c) var(--brand-h)); /* مقادیر sRGB پایه (fallback WebKit قدیمی)؛ نسخه oklch/color-mix در @supports پایین فایل */
--primary-600: oklch(0.60 var(--brand-c) var(--brand-h)); --primary: #7a7cf1;
--primary-700: oklch(0.54 var(--brand-c) var(--brand-h)); --primary-600: #686ae6;
--primary-soft: color-mix(in oklch, var(--primary) 16%, var(--surface)); --primary-700: #565ad9;
--primary-soft2: color-mix(in oklch, var(--primary) 26%, var(--surface)); --primary-soft: #222a49;
--primary-soft2: #2c335d;
--on-primary: #07101f; --on-primary: #07101f;
--success-bg: color-mix(in oklch, var(--success) 18%, var(--surface)); --success-bg: #123332;
--warning-bg: color-mix(in oklch, var(--warning) 18%, var(--surface)); --warning-bg: #352e23;
--danger-bg: color-mix(in oklch, var(--danger) 18%, var(--surface)); --danger-bg: #36202f;
--info-bg: color-mix(in oklch, var(--info) 18%, var(--surface)); --info-bg: #162d48;
--violet-bg: color-mix(in oklch, var(--violet) 20%, var(--surface)); --violet-bg: #262751;
--accent: #f0763d; --accent: #f0763d;
--accent-600: #e0651f; --accent-600: #e0651f;
--accent-bg: color-mix(in oklch, var(--accent) 18%, var(--surface)); --accent-bg: #392b2d;
--stat-amber-bg: color-mix(in oklch, var(--warning) 16%, var(--surface)); --stat-amber-fg: var(--warning); --stat-amber-bg: #312c24; --stat-amber-fg: var(--warning);
--stat-violet-bg: color-mix(in oklch, var(--violet) 18%, var(--surface)); --stat-violet-fg: var(--violet); --stat-violet-bg: #24264d; --stat-violet-fg: var(--violet);
--stat-green-bg: color-mix(in oklch, var(--success) 16%, var(--surface)); --stat-green-fg: var(--success); --stat-green-bg: #123031; --stat-green-fg: var(--success);
--stat-pink-bg: color-mix(in oklch, var(--accent) 16%, var(--surface)); --stat-pink-fg: var(--accent); --stat-pink-bg: #35292c; --stat-pink-fg: var(--accent);
--shadow-sm: 0 1px 2px rgba(0,0,0,.4); --shadow-sm: 0 1px 2px rgba(0,0,0,.4);
--shadow: 0 2px 8px rgba(0,0,0,.4), 0 12px 30px rgba(0,0,0,.35); --shadow: 0 2px 8px rgba(0,0,0,.4), 0 12px 30px rgba(0,0,0,.35);
--shadow-lg: 0 18px 44px rgba(0,0,0,.55); --shadow-lg: 0 18px 44px rgba(0,0,0,.55);
} }
/* ── رنگ‌های مدرن (فقط مرورگرهای با پشتیبانی oklch/color-mix) ──────
iPhone 8 و WebKit قدیمی این بلوک را نادیده می‌گیرند و مقادیر sRGB بالا را
نگه می‌دارند؛ مرورگر مدرن این نسخه‌های oklch را استفاده می‌کند (بدون تغییر ظاهر). */
@supports (color: color-mix(in oklch, red, blue)) {
:root {
--primary: oklch(0.55 var(--brand-c) var(--brand-h));
--primary-600: oklch(0.49 var(--brand-c) var(--brand-h));
--primary-700: oklch(0.43 var(--brand-c) var(--brand-h));
--primary-soft: oklch(0.95 0.03 var(--brand-h));
--primary-soft2: oklch(0.90 0.05 var(--brand-h));
--ring: color-mix(in oklch, var(--primary) 32%, transparent);
}
[data-theme="dark"] {
--primary: oklch(0.66 var(--brand-c) var(--brand-h));
--primary-600: oklch(0.60 var(--brand-c) var(--brand-h));
--primary-700: oklch(0.54 var(--brand-c) var(--brand-h));
--primary-soft: color-mix(in oklch, var(--primary) 16%, var(--surface));
--primary-soft2: color-mix(in oklch, var(--primary) 26%, var(--surface));
--success-bg: color-mix(in oklch, var(--success) 18%, var(--surface));
--warning-bg: color-mix(in oklch, var(--warning) 18%, var(--surface));
--danger-bg: color-mix(in oklch, var(--danger) 18%, var(--surface));
--info-bg: color-mix(in oklch, var(--info) 18%, var(--surface));
--violet-bg: color-mix(in oklch, var(--violet) 20%, var(--surface));
--accent-bg: color-mix(in oklch, var(--accent) 18%, var(--surface));
--stat-amber-bg: color-mix(in oklch, var(--warning) 16%, var(--surface));
--stat-violet-bg: color-mix(in oklch, var(--violet) 18%, var(--surface));
--stat-green-bg: color-mix(in oklch, var(--success) 16%, var(--surface));
--stat-pink-bg: color-mix(in oklch, var(--accent) 16%, var(--surface));
}
}
/* ── Base ─────────────────────────────────────────────────────── */ /* ── Base ─────────────────────────────────────────────────────── */
*, *::before, *::after { font-family: var(--font-sans); box-sizing: border-box; } *, *::before, *::after { font-family: var(--font-sans); box-sizing: border-box; }
html { scroll-behavior: smooth; } html { scroll-behavior: smooth; }
@@ -366,6 +399,7 @@ body {
height: var(--topbar-h); flex: none; position: sticky; top: 0; z-index: 30; height: var(--topbar-h); flex: none; position: sticky; top: 0; z-index: 30;
display: flex; align-items: center; gap: 12px; display: flex; align-items: center; gap: 12px;
padding: 0 var(--gap); padding: 0 var(--gap);
background: var(--bg); /* fallback WebKit قدیمی */
background: color-mix(in srgb, var(--bg) 85%, transparent); background: color-mix(in srgb, var(--bg) 85%, transparent);
backdrop-filter: blur(12px); backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
@@ -466,11 +500,11 @@ body {
white-space: nowrap; border: 1.5px solid transparent; letter-spacing: 0.01em; white-space: nowrap; border: 1.5px solid transparent; letter-spacing: 0.01em;
} }
.appt-status-dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; flex-shrink: 0; } .appt-status-dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; flex-shrink: 0; }
.appt-status.status-green { color: var(--success); background: var(--success-bg); border-color: color-mix(in srgb, var(--success) 25%, transparent); } .appt-status.status-green { color: var(--success); background: var(--success-bg); border-color: rgba(21,163,90,.25); border-color: color-mix(in srgb, var(--success) 25%, transparent); }
.appt-status.status-amber { color: var(--warning); background: var(--warning-bg); border-color: color-mix(in srgb, var(--warning) 25%, transparent); } .appt-status.status-amber { color: var(--warning); background: var(--warning-bg); border-color: rgba(217,138,9,.25); border-color: color-mix(in srgb, var(--warning) 25%, transparent); }
.appt-status.status-red { color: var(--danger); background: var(--danger-bg); border-color: color-mix(in srgb, var(--danger) 25%, transparent); } .appt-status.status-red { color: var(--danger); background: var(--danger-bg); border-color: rgba(224,57,74,.25); border-color: color-mix(in srgb, var(--danger) 25%, transparent); }
.appt-status.status-blue { color: var(--info); background: var(--info-bg); border-color: color-mix(in srgb, var(--info) 25%, transparent); } .appt-status.status-blue { color: var(--info); background: var(--info-bg); border-color: rgba(43,134,216,.25); border-color: color-mix(in srgb, var(--info) 25%, transparent); }
.appt-status.status-violet { color: var(--violet); background: var(--violet-bg); border-color: color-mix(in srgb, var(--violet) 25%, transparent); } .appt-status.status-violet { color: var(--violet); background: var(--violet-bg); border-color: rgba(124,92,240,.25); border-color: color-mix(in srgb, var(--violet) 25%, transparent); }
.appt-status.status-gray { color: var(--text-2); background: var(--surface-3); border-color: var(--border); } .appt-status.status-gray { color: var(--text-2); background: var(--surface-3); border-color: var(--border); }
/* field-label utility */ /* field-label utility */
@@ -492,7 +526,7 @@ body {
.btn.soft:hover { background: var(--primary-soft2); } .btn.soft:hover { background: var(--primary-soft2); }
.btn.danger { background: var(--danger-bg); color: var(--danger); border-color: transparent; } .btn.danger { background: var(--danger-bg); color: var(--danger); border-color: transparent; }
.btn.danger:hover { filter: brightness(.97); } .btn.danger:hover { filter: brightness(.97); }
.btn.accent { background: var(--accent); color: #fff; box-shadow: 0 4px 14px color-mix(in oklch, var(--accent) 35%, transparent); } .btn.accent { background: var(--accent); color: #fff; box-shadow: 0 4px 14px rgba(240,104,42,.35); box-shadow: 0 4px 14px color-mix(in oklch, var(--accent) 35%, transparent); }
.btn.accent:hover { background: var(--accent-600); } .btn.accent:hover { background: var(--accent-600); }
.btn.outline { background: transparent; border-color: var(--primary); color: var(--primary); } .btn.outline { background: transparent; border-color: var(--primary); color: var(--primary); }
.btn.outline:hover { background: var(--primary-soft); } .btn.outline:hover { background: var(--primary-soft); }
@@ -751,7 +785,7 @@ table.t tbody tr:last-child td { border-bottom: none; }
border: 1px solid var(--border); background: var(--surface-2); transition: .15s; border: 1px solid var(--border); background: var(--surface-2); transition: .15s;
} }
.toggle-row + .toggle-row { margin-top: 10px; } .toggle-row + .toggle-row { margin-top: 10px; }
.toggle-row.on { border-color: color-mix(in oklch, var(--primary) 40%, var(--border)); background: var(--primary-soft); } .toggle-row.on { border-color: var(--border-2); border-color: color-mix(in oklch, var(--primary) 40%, var(--border)); background: var(--primary-soft); }
.toggle-row.warn.on { border-color: var(--warning); background: var(--warning-bg); } .toggle-row.warn.on { border-color: var(--warning); background: var(--warning-bg); }
.toggle-row .tr-title { font-size: 13.5px; font-weight: 600; color: var(--text); } .toggle-row .tr-title { font-size: 13.5px; font-weight: 600; color: var(--text); }
.toggle-row .tr-desc { font-size: 12px; color: var(--text-3); margin-top: 3px; line-height: 1.6; } .toggle-row .tr-desc { font-size: 12px; color: var(--text-3); margin-top: 3px; line-height: 1.6; }
@@ -776,7 +810,7 @@ table.t tbody tr:last-child td { border-bottom: none; }
} }
.save-bar .sb-msg { display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 600; color: var(--text-2); } .save-bar .sb-msg { display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 600; color: var(--text-2); }
.save-bar .sb-actions { display: flex; gap: 10px; } .save-bar .sb-actions { display: flex; gap: 10px; }
.save-bar.ok { border-color: color-mix(in oklch, var(--success) 45%, var(--border)); } .save-bar.ok { border-color: var(--success); border-color: color-mix(in oklch, var(--success) 45%, var(--border)); }
@media (max-width: 900px) { @media (max-width: 900px) {
.settings-layout { grid-template-columns: 1fr; } .settings-layout { grid-template-columns: 1fr; }
+1 -14
View File
@@ -653,8 +653,6 @@
"651": "Community 651", "651": "Community 651",
"652": "Community 652", "652": "Community 652",
"653": "Community 653", "653": "Community 653",
"654": "Community 654",
"655": "Community 655",
"656": "Community 656", "656": "Community 656",
"657": "Community 657", "657": "Community 657",
"658": "Community 658", "658": "Community 658",
@@ -663,8 +661,6 @@
"661": "Community 661", "661": "Community 661",
"662": "Community 662", "662": "Community 662",
"663": "Community 663", "663": "Community 663",
"664": "Community 664",
"665": "Community 665",
"666": "Community 666", "666": "Community 666",
"667": "Community 667", "667": "Community 667",
"668": "Community 668", "668": "Community 668",
@@ -672,16 +668,7 @@
"670": "Community 670", "670": "Community 670",
"671": "Community 671", "671": "Community 671",
"672": "Community 672", "672": "Community 672",
"673": "Community 673",
"674": "Community 674",
"675": "Community 675", "675": "Community 675",
"676": "Community 676", "676": "Community 676",
"677": "Community 677", "679": "Community 679"
"678": "Community 678",
"679": "Community 679",
"680": "Community 680",
"681": "Community 681",
"682": "Community 682",
"683": "Community 683",
"684": "Community 684"
} }
+144 -193
View File
@@ -1,16 +1,16 @@
# Graph Report - clinicpro (2026-07-02) # Graph Report - clinicpro (2026-07-02)
## Corpus Check ## Corpus Check
- 673 files · ~472,927 words - 674 files · ~473,936 words
- Verdict: corpus is large enough that graph structure adds value. - Verdict: corpus is large enough that graph structure adds value.
## Summary ## Summary
- 8473 nodes · 11675 edges · 685 communities (552 shown, 133 thin omitted) - 8487 nodes · 11688 edges · 672 communities (543 shown, 129 thin omitted)
- Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 265 edges (avg confidence: 0.8) - Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 265 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output - Token cost: 0 input · 0 output
## Graph Freshness ## Graph Freshness
- Built from commit: `949fddc5` - Built from commit: `6d594822`
- Run `git rev-parse HEAD` and compare to check if the graph is stale. - Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost). - Run `graphify update .` after code changes (no API cost).
@@ -655,8 +655,6 @@
- [[_COMMUNITY_Community 651|Community 651]] - [[_COMMUNITY_Community 651|Community 651]]
- [[_COMMUNITY_Community 652|Community 652]] - [[_COMMUNITY_Community 652|Community 652]]
- [[_COMMUNITY_Community 653|Community 653]] - [[_COMMUNITY_Community 653|Community 653]]
- [[_COMMUNITY_Community 654|Community 654]]
- [[_COMMUNITY_Community 655|Community 655]]
- [[_COMMUNITY_Community 656|Community 656]] - [[_COMMUNITY_Community 656|Community 656]]
- [[_COMMUNITY_Community 657|Community 657]] - [[_COMMUNITY_Community 657|Community 657]]
- [[_COMMUNITY_Community 658|Community 658]] - [[_COMMUNITY_Community 658|Community 658]]
@@ -665,26 +663,15 @@
- [[_COMMUNITY_Community 661|Community 661]] - [[_COMMUNITY_Community 661|Community 661]]
- [[_COMMUNITY_Community 662|Community 662]] - [[_COMMUNITY_Community 662|Community 662]]
- [[_COMMUNITY_Community 663|Community 663]] - [[_COMMUNITY_Community 663|Community 663]]
- [[_COMMUNITY_Community 664|Community 664]]
- [[_COMMUNITY_Community 665|Community 665]]
- [[_COMMUNITY_Community 666|Community 666]] - [[_COMMUNITY_Community 666|Community 666]]
- [[_COMMUNITY_Community 667|Community 667]] - [[_COMMUNITY_Community 667|Community 667]]
- [[_COMMUNITY_Community 668|Community 668]] - [[_COMMUNITY_Community 668|Community 668]]
- [[_COMMUNITY_Community 669|Community 669]] - [[_COMMUNITY_Community 669|Community 669]]
- [[_COMMUNITY_Community 671|Community 671]] - [[_COMMUNITY_Community 671|Community 671]]
- [[_COMMUNITY_Community 672|Community 672]] - [[_COMMUNITY_Community 672|Community 672]]
- [[_COMMUNITY_Community 673|Community 673]]
- [[_COMMUNITY_Community 674|Community 674]]
- [[_COMMUNITY_Community 675|Community 675]] - [[_COMMUNITY_Community 675|Community 675]]
- [[_COMMUNITY_Community 676|Community 676]] - [[_COMMUNITY_Community 676|Community 676]]
- [[_COMMUNITY_Community 677|Community 677]]
- [[_COMMUNITY_Community 678|Community 678]]
- [[_COMMUNITY_Community 679|Community 679]] - [[_COMMUNITY_Community 679|Community 679]]
- [[_COMMUNITY_Community 680|Community 680]]
- [[_COMMUNITY_Community 681|Community 681]]
- [[_COMMUNITY_Community 682|Community 682]]
- [[_COMMUNITY_Community 683|Community 683]]
- [[_COMMUNITY_Community 684|Community 684]]
## God Nodes (most connected - your core abstractions) ## God Nodes (most connected - your core abstractions)
1. `BaseController` - 76 edges 1. `BaseController` - 76 edges
@@ -701,55 +688,55 @@
## Surprising Connections (you probably didn't know these) ## Surprising Connections (you probably didn't know these)
- `ServiceTariffModal()` --calls--> `formatNumber()` [EXTRACTED] - `ServiceTariffModal()` --calls--> `formatNumber()` [EXTRACTED]
assets/admin/components/ServiceTariffModal.tsx → assets/admin/lib/utils.ts assets/admin/components/ServiceTariffModal.tsx → assets/admin/lib/utils.ts
- `PersianDatePicker()` --calls--> `formatDate()` [EXTRACTED] - `Pagination()` --calls--> `formatNumber()` [EXTRACTED]
assets/admin/components/ui/PersianDatePicker.tsx → assets/admin/lib/utils.ts assets/admin/components/ui/Pagination.tsx → assets/admin/lib/utils.ts
- `MyFinancialPage()` --calls--> `formatRial()` [EXTRACTED]
assets/admin/pages/MyFinancialPage.tsx → assets/admin/lib/utils.ts
- `SettlementsPage()` --calls--> `formatRial()` [EXTRACTED]
assets/admin/pages/SettlementsPage.tsx → assets/admin/lib/utils.ts
- `LogsPage()` --calls--> `formatDateTime()` [EXTRACTED] - `LogsPage()` --calls--> `formatDateTime()` [EXTRACTED]
assets/admin/pages/LogsPage.tsx → assets/admin/lib/utils.ts assets/admin/pages/LogsPage.tsx → assets/admin/lib/utils.ts
- `NewAppointmentModal()` --calls--> `useAuthStore` [EXTRACTED]
assets/admin/pages/AppointmentsPage.tsx → assets/admin/stores/authStore.ts
- `LogoUploadField()` --calls--> `useAuthStore` [EXTRACTED]
assets/admin/pages/CategoriesPage.tsx → assets/admin/stores/authStore.ts
## Import Cycles ## Import Cycles
- None detected. - None detected.
## Communities (685 total, 133 thin omitted) ## Communities (672 total, 129 thin omitted)
### Community 0 - "Community 0" ### Community 0 - "Community 0"
Cohesion: 0.05 Cohesion: 0.05
Nodes (42): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, AddForm, addSchema (+34 more) Nodes (48): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, get, BeforeInstallPromptEvent (+40 more)
### Community 1 - "Community 1" ### Community 1 - "Community 1"
Cohesion: 0.03 Cohesion: 0.03
Nodes (41): AddressData, AddrForm, addrSchema, AVATAR_COLORS, BookingMeta, CityOpt, DateOverrideData, DEFAULT_BOOKING_META (+33 more) Nodes (41): AddressData, AddrForm, addrSchema, AVATAR_COLORS, BookingMeta, CityOpt, DateOverrideData, DEFAULT_BOOKING_META (+33 more)
### Community 2 - "Community 2" ### Community 2 - "Community 2"
Cohesion: 0.08 Cohesion: 0.07
Nodes (23): get, api, getToken(), refreshOnce(), request(), FormData, schema, post (+15 more) Nodes (27): usePaymentConfig(), emptyFeatures(), FEATURE_KEYS, FEATURE_LABELS, PeriodForm, periodSchema, PLAN_DISPLAY, PlanForm (+19 more)
### Community 3 - "Community 3" ### Community 3 - "Community 3"
Cohesion: 0.06 Cohesion: 0.04
Nodes (40): ApiResponse, PaginatedResponse, formatDate(), STATUS_FILTERS, FILTERS, Breakdown, SOURCE_LABEL, Summary (+32 more) Nodes (71): PaginatedResponse, AddForm, addSchema, ClinicsPage(), HUES_LIST, FILTERS, Breakdown, SOURCE_LABEL (+63 more)
### Community 4 - "Community 4" ### Community 4 - "Community 4"
Cohesion: 0.08 Cohesion: 0.06
Nodes (5): Doctor, Collection, self, User, WeeklySchedule Nodes (8): DoctorService, Doctor, DoctorServiceRepository, Collection, self, User, WeeklySchedule, ManagerRegistry
### Community 5 - "Community 5" ### Community 5 - "Community 5"
Cohesion: 0.07 Cohesion: 0.07
Nodes (3): UserProfile, self, User Nodes (3): UserProfile, self, User
### Community 6 - "Community 6" ### Community 6 - "Community 6"
Cohesion: 0.12 Cohesion: 0.09
Nodes (12): SettlementController, SettlementRepository, WalletTransactionRepository, Settlement, JsonResponse, Request, User, ManagerRegistry (+4 more) Nodes (15): SettlementController, SettlementRepository, WalletTransactionRepository, CommissionService, Settlement, JsonResponse, Request, User (+7 more)
### Community 7 - "Community 7" ### Community 7 - "Community 7"
Cohesion: 0.07 Cohesion: 0.07
Nodes (5): Clinic, Collection, Doctor, self, User Nodes (5): Clinic, Collection, Doctor, self, User
### Community 8 - "Community 8" ### Community 8 - "Community 8"
Cohesion: 0.08 Cohesion: 0.07
Nodes (27): useSubscription(), AdminLayout(), avatarBg(), buildSections(), HUES, Props, ROLE_LABELS, Section (+19 more) Nodes (27): Contract, InsuranceOption, KIND_LABEL, AdminLayout(), Topbar(), DEGREE_OPTIONS, DoctorFormPage(), FormValues (+19 more)
### Community 9 - "Community 9" ### Community 9 - "Community 9"
Cohesion: 0.04 Cohesion: 0.04
@@ -768,20 +755,20 @@ Cohesion: 0.05
Nodes (44): Clinic Doctor Invitation API, DELETE `/api/v1/admin/clinic/invitation/{invUuid}`, Errors, Errors, Errors, Errors, Errors, Errors (+36 more) Nodes (44): Clinic Doctor Invitation API, DELETE `/api/v1/admin/clinic/invitation/{invUuid}`, Errors, Errors, Errors, Errors, Errors, Errors (+36 more)
### Community 13 - "Community 13" ### Community 13 - "Community 13"
Cohesion: 0.04 Cohesion: 0.05
Nodes (47): FreeVisitPrice(), Pricing, PaymentConfig, PaymentGatewayInfo, usePaymentConfig(), formatRial(), emptyFeatures(), FEATURE_KEYS (+39 more) Nodes (35): PaymentConfig, PaymentGatewayInfo, api, ApiError, ApiResponse, getToken(), refreshOnce(), request() (+27 more)
### Community 14 - "Community 14" ### Community 14 - "Community 14"
Cohesion: 0.10 Cohesion: 0.15
Nodes (12): AppointmentSettingsController, DateOverride, Holiday, DateOverrideRepository, HolidayRepository, JsonResponse, Request, User (+4 more) Nodes (8): AppointmentSettingsController, Holiday, HolidayRepository, JsonResponse, Request, User, Doctor, ManagerRegistry
### Community 15 - "Community 15" ### Community 15 - "Community 15"
Cohesion: 0.13 Cohesion: 0.21
Nodes (10): PaymentController, MockGateway, JsonResponse, Payment, PaymentGatewayInterface, Request, Response, User (+2 more) Nodes (6): PaymentController, JsonResponse, Payment, Request, Response, User
### Community 16 - "Community 16" ### Community 16 - "Community 16"
Cohesion: 0.06 Cohesion: 0.06
Nodes (9): PatientSession, SmsWallet, LogPruneService, AppointmentExpiryService, Appointment, Collection, PatientRecord, self (+1 more) Nodes (8): PatientSession, SmsWallet, AppLog, Appointment, Collection, PatientRecord, self, SessionService
### Community 17 - "Community 17" ### Community 17 - "Community 17"
Cohesion: 0.05 Cohesion: 0.05
@@ -793,19 +780,19 @@ Nodes (38): API, API, API, API, API, Route, Route, Route (+30 more)
### Community 19 - "Community 19" ### Community 19 - "Community 19"
Cohesion: 0.06 Cohesion: 0.06
Nodes (37): formatDateTime(), ALL_STATUSES, AppointmentDetailPage(), SessionRow(), PaymentDetailPage(), SmsPage(), STATUS_LOG_META, Tab (+29 more) Nodes (21): CityForm, citySchema, ImportError, InsuranceForm, insuranceSchema, LogoUploadField(), ProvinceForm, provinceSchema (+13 more)
### Community 20 - "Community 20" ### Community 20 - "Community 20"
Cohesion: 0.14 Cohesion: 0.05
Nodes (3): AdminApiController, JsonResponse, Request Nodes (13): AdminApiController, RepresentationActionController, DateTimeInterface, InputValidator, JalaliDateService, SlotCalculatorService, JsonResponse, Request (+5 more)
### Community 21 - "Community 21" ### Community 21 - "Community 21"
Cohesion: 0.05 Cohesion: 0.04
Nodes (35): formatNumber(), ClinicDetailPage(), AdminCharts, AdminDashboard(), AdminRecent, AdminStats, APPT_CLS, APPT_COLOR (+27 more) Nodes (46): formatNumber(), ClinicAddress, ClinicDetailPage(), ClinicDoctorItem, ClinicInvitation, EditForm, editSchema, HUES_LIST (+38 more)
### Community 22 - "Community 22" ### Community 22 - "Community 22"
Cohesion: 0.15 Cohesion: 0.11
Nodes (9): RatingController, Like, LikeRepository, JsonResponse, Request, User, Comment, ManagerRegistry (+1 more) Nodes (14): RatingController, Like, Rate, LikeRepository, RateRepository, JsonResponse, Request, User (+6 more)
### Community 23 - "Community 23" ### Community 23 - "Community 23"
Cohesion: 0.05 Cohesion: 0.05
@@ -824,8 +811,8 @@ Cohesion: 0.13
Nodes (8): InsuranceController, EntityInsurancePricing, EntityInsurancePricingRepository, TenantInsuranceCleanupService, JsonResponse, Request, User, ManagerRegistry Nodes (8): InsuranceController, EntityInsurancePricing, EntityInsurancePricingRepository, TenantInsuranceCleanupService, JsonResponse, Request, User, ManagerRegistry
### Community 27 - "Community 27" ### Community 27 - "Community 27"
Cohesion: 0.06 Cohesion: 0.05
Nodes (35): 55. 🟢 `GET` all tag, 56. 🟢 `GET` supplementary_insurance, 57. 🟢 `GET` categories list, 58. 🟢 `GET` all state, 59. 🟢 `GET` all city, 60. 🟢 `GET` all specially doctor, 62. 🟡 `PATCH` patch, 63. 🔴 `DELETE` DELETE (+27 more) Nodes (40): 55. 🟢 `GET` all tag, 56. 🟢 `GET` supplementary_insurance, 57. 🟢 `GET` categories list, 58. 🟢 `GET` all state, 59. 🟢 `GET` all city, 60. 🟢 `GET` all specially doctor, 61. 🔵 `POST` post, 62. 🟡 `PATCH` patch (+32 more)
### Community 28 - "Community 28" ### Community 28 - "Community 28"
Cohesion: 0.09 Cohesion: 0.09
@@ -880,8 +867,8 @@ Cohesion: 0.09
Nodes (4): User, PasswordAuthenticatedUserInterface, self, UserInterface Nodes (4): User, PasswordAuthenticatedUserInterface, self, UserInterface
### Community 41 - "Community 41" ### Community 41 - "Community 41"
Cohesion: 0.06 Cohesion: 0.21
Nodes (24): CityForm, citySchema, ImportError, InsuranceForm, insuranceSchema, LogoUploadField(), ProvinceForm, provinceSchema (+16 more) Nodes (5): DateOverrideOwnershipTest, DateOverride, DateOverrideRepository, Doctor, ManagerRegistry
### Community 42 - "Community 42" ### Community 42 - "Community 42"
Cohesion: 0.07 Cohesion: 0.07
@@ -928,8 +915,8 @@ Cohesion: 0.07
Nodes (26): الزامات UI, باگ‌فیکس صفحه نوبت‌ها, باگ ۱ — کرش تقویم, باگ ۲ — روز هفته در DateNavigator, باگ ۳ — پیام «slot نیست», باگ ۴ — نوبت جدید: نام اجباری + find-or-create patient, باگ ۵ — patient_mobile نشان می‌دهد موبایل پزشک, باگ ۶ — نوبت‌های رزرو شده در نمایش زمانبندی (+18 more) Nodes (26): الزامات UI, باگ‌فیکس صفحه نوبت‌ها, باگ ۱ — کرش تقویم, باگ ۲ — روز هفته در DateNavigator, باگ ۳ — پیام «slot نیست», باگ ۴ — نوبت جدید: نام اجباری + find-or-create patient, باگ ۵ — patient_mobile نشان می‌دهد موبایل پزشک, باگ ۶ — نوبت‌های رزرو شده در نمایش زمانبندی (+18 more)
### Community 53 - "Community 53" ### Community 53 - "Community 53"
Cohesion: 0.08 Cohesion: 0.10
Nodes (16): AppLogRepository, ClaimItemRepository, InvoiceItemRepository, PreRegistrationRepository, SessionServiceRepository, SmsSettingsRepository, ServiceEntityRepository, SmsSettings (+8 more) Nodes (13): AppLogRepository, ClaimItemRepository, DoctorInsuranceRepository, PreRegistrationRepository, SessionServiceRepository, ServiceEntityRepository, ManagerRegistry, ManagerRegistry (+5 more)
### Community 54 - "Community 54" ### Community 54 - "Community 54"
Cohesion: 0.10 Cohesion: 0.10
@@ -948,8 +935,8 @@ Cohesion: 0.08
Nodes (24): Blog API, DELETE `/api/v1/blog/{uuid}`, Errors, Errors, Errors, Errors, Errors, GET `/api/v1/blog/{slug}` (+16 more) Nodes (24): Blog API, DELETE `/api/v1/blog/{uuid}`, Errors, Errors, Errors, Errors, Errors, GET `/api/v1/blog/{slug}` (+16 more)
### Community 58 - "Community 58" ### Community 58 - "Community 58"
Cohesion: 0.15 Cohesion: 0.28
Nodes (8): Blog, BlogController, BlogRepository, JsonResponse, Request, User, ManagerRegistry, QueryBuilder Nodes (4): Blog, BlogRepository, ManagerRegistry, QueryBuilder
### Community 59 - "Community 59" ### Community 59 - "Community 59"
Cohesion: 0.22 Cohesion: 0.22
@@ -992,12 +979,12 @@ Cohesion: 0.08
Nodes (23): Access Token — همیشه در هدر Authorization, Endpoint ها, GET /oauth/userinfo, GET /session/token — CSRF, POST /api/v1/user/login, POST /oauth/logout, POST /oauth/token/refresh, Rate Limiting (+15 more) Nodes (23): Access Token — همیشه در هدر Authorization, Endpoint ها, GET /oauth/userinfo, GET /session/token — CSRF, POST /api/v1/user/login, POST /oauth/logout, POST /oauth/token/refresh, Rate Limiting (+15 more)
### Community 70 - "Community 70" ### Community 70 - "Community 70"
Cohesion: 0.31 Cohesion: 0.15
Nodes (6): ErrorCodes, ClinicServiceController, JsonResponse, Request, ServiceSection, User Nodes (12): رفع بهم‌ریختگی کامل پنل ادمین روی iPhone 8 (Safari/Chrome iOS), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی, وظایف, پروژه (+4 more)
### Community 71 - "Community 71" ### Community 71 - "Community 71"
Cohesion: 0.24 Cohesion: 0.08
Nodes (5): RepresentationActionController, JsonResponse, Representation, Request, User Nodes (14): Claim, ClaimItem, DebtRow, InsuranceOption, KIND_LABEL, STATUS_FILTERS, STATUS_META, EMPTY (+6 more)
### Community 72 - "Community 72" ### Community 72 - "Community 72"
Cohesion: 0.09 Cohesion: 0.09
@@ -1016,8 +1003,8 @@ Cohesion: 0.16
Nodes (5): DoctorSecretary, Clinic, Doctor, self, User Nodes (5): DoctorSecretary, Clinic, Doctor, self, User
### Community 77 - "Community 77" ### Community 77 - "Community 77"
Cohesion: 0.07 Cohesion: 0.20
Nodes (21): Contract, InsuranceOption, KIND_LABEL, Claim, ClaimItem, DebtRow, InsuranceOption, KIND_LABEL (+13 more) Nodes (8): AdminUser, ChangeRoleModal(), getPrimaryRole(), HUES_LIST, ROLE_META, ROLE_TABS, RoleBadge(), UserStats
### Community 78 - "Community 78" ### Community 78 - "Community 78"
Cohesion: 0.12 Cohesion: 0.12
@@ -1041,11 +1028,11 @@ Nodes (20): 10. مدیریت نظرات (Comment Moderation), 11. مدیریت
### Community 85 - "Community 85" ### Community 85 - "Community 85"
Cohesion: 0.07 Cohesion: 0.07
Nodes (29): devDependencies, @babel/core, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, core-js, @hotwired/stimulus, jsdom (+21 more) Nodes (30): devDependencies, @babel/core, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, core-js, @csstools/postcss-oklab-function, @hotwired/stimulus (+22 more)
### Community 86 - "Community 86" ### Community 86 - "Community 86"
Cohesion: 0.07 Cohesion: 0.07
Nodes (13): AppointmentExpiryServiceTest, DateOverrideOwnershipTest, LowTierFixesTest, SendCodeMobileRateLimitTest, ClaimsListPaginationTest, ServiceItemStaffOwnershipTest, KernelBrowser, CommentPaginationTest (+5 more) Nodes (13): AppointmentExpiryServiceTest, LowTierFixesTest, SendCodeMobileRateLimitTest, ClaimsListPaginationTest, ServiceItemStaffOwnershipTest, KernelBrowser, CommentPaginationTest, SecretaryListNPlusOneTest (+5 more)
### Community 87 - "Community 87" ### Community 87 - "Community 87"
Cohesion: 0.10 Cohesion: 0.10
@@ -1068,7 +1055,7 @@ Cohesion: 0.10
Nodes (20): DELETE `/api/v1/admin/users/{uuid}`, Errors, Errors, GET `/api/v1/admin/users`, GET `/api/v1/admin/users/stats`, GET `/api/v1/admin/users/{uuid}`, POST `/api/v1/admin/users/{uuid}/status`, PUT `/api/v1/admin/users/{uuid}` (+12 more) Nodes (20): DELETE `/api/v1/admin/users/{uuid}`, Errors, Errors, GET `/api/v1/admin/users`, GET `/api/v1/admin/users/stats`, GET `/api/v1/admin/users/{uuid}`, POST `/api/v1/admin/users/{uuid}/status`, PUT `/api/v1/admin/users/{uuid}` (+12 more)
### Community 92 - "Community 92" ### Community 92 - "Community 92"
Cohesion: 0.10 Cohesion: 0.09
Nodes (21): Bulk import / export, DELETE `/api/v1/admin/doctor-service/{id}`, Doctor Service API, Errors, Errors, Errors, Errors, GET `/api/v1/admin/doctor-services` (+13 more) Nodes (21): Bulk import / export, DELETE `/api/v1/admin/doctor-service/{id}`, Doctor Service API, Errors, Errors, Errors, Errors, GET `/api/v1/admin/doctor-services` (+13 more)
### Community 93 - "Community 93" ### Community 93 - "Community 93"
@@ -1112,8 +1099,8 @@ Cohesion: 0.10
Nodes (20): Bulk import / export, DELETE `/api/v1/admin/tag/{id}`, Errors, Errors, Errors, Errors, GET `/api/v1/admin/tags`, GET `/api/v1/tags` (+12 more) Nodes (20): Bulk import / export, DELETE `/api/v1/admin/tag/{id}`, Errors, Errors, Errors, Errors, GET `/api/v1/admin/tags`, GET `/api/v1/tags` (+12 more)
### Community 103 - "Community 103" ### Community 103 - "Community 103"
Cohesion: 0.35 Cohesion: 0.33
Nodes (5): PatientController, JsonResponse, PatientSession, Request, User Nodes (4): BlogController, JsonResponse, Request, User
### Community 104 - "Community 104" ### Community 104 - "Community 104"
Cohesion: 0.18 Cohesion: 0.18
@@ -1132,8 +1119,8 @@ Cohesion: 0.32
Nodes (6): AppointmentController, Appointment, Doctor, JsonResponse, Request, User Nodes (6): AppointmentController, Appointment, Doctor, JsonResponse, Request, User
### Community 108 - "Community 108" ### Community 108 - "Community 108"
Cohesion: 0.17 Cohesion: 0.18
Nodes (8): BaseController, CategoryController, SiteConfigController, JsonResponse, JsonResponse, Request, User, JsonResponse Nodes (7): BaseController, CategoryController, SmsMessageController, JsonResponse, JsonResponse, JsonResponse, Request
### Community 109 - "Community 109" ### Community 109 - "Community 109"
Cohesion: 0.29 Cohesion: 0.29
@@ -1188,8 +1175,8 @@ Cohesion: 0.26
Nodes (4): LocationController, City, JsonResponse, Request Nodes (4): LocationController, City, JsonResponse, Request
### Community 122 - "Community 122" ### Community 122 - "Community 122"
Cohesion: 0.26 Cohesion: 0.06
Nodes (4): SubscriptionController, JsonResponse, Request, User Nodes (27): DashboardController, HealthController, MyAppointmentsController, RepresentationController, SubscriptionController, EntityManagerInterface, ClinicInvitationService, Doctor (+19 more)
### Community 123 - "Community 123" ### Community 123 - "Community 123"
Cohesion: 0.12 Cohesion: 0.12
@@ -1363,6 +1350,10 @@ Nodes (14): select listها, select بیمه در فرم مراجعه, تعدا
Cohesion: 0.10 Cohesion: 0.10
Nodes (20): api.ir (استعلام هویت — Shahkar / IbanMatch), اتصال به دیتابیس‌های مستقل (الزامی), اسرار (الزامی — قبل از اولین دیپلوی), امنیت و منابع, بررسی سلامت, دامنه‌ها و CORS, دیپلوی‌های بعدی, راهنمای دیپلوی ClinicPro (Coolify + Docker Compose) (+12 more) Nodes (20): api.ir (استعلام هویت — Shahkar / IbanMatch), اتصال به دیتابیس‌های مستقل (الزامی), اسرار (الزامی — قبل از اولین دیپلوی), امنیت و منابع, بررسی سلامت, دامنه‌ها و CORS, دیپلوی‌های بعدی, راهنمای دیپلوی ClinicPro (Coolify + Docker Compose) (+12 more)
### Community 169 - "Community 169"
Cohesion: 0.31
Nodes (6): ErrorCodes, ClinicServiceController, JsonResponse, Request, ServiceSection, User
### Community 170 - "Community 170" ### Community 170 - "Community 170"
Cohesion: 0.13 Cohesion: 0.13
Nodes (14): ایندکس‌ها, جدول: clinics, جدول: doctor_addresses, جدول: doctor_cities (ManyToMany pivot), جدول: doctor_secretaries, جدول: doctor_services (ManyToMany pivot), جدول: doctor_specialties (ManyToMany pivot), جدول: doctor_states (ManyToMany pivot) (+6 more) Nodes (14): ایندکس‌ها, جدول: clinics, جدول: doctor_addresses, جدول: doctor_cities (ManyToMany pivot), جدول: doctor_secretaries, جدول: doctor_services (ManyToMany pivot), جدول: doctor_specialties (ManyToMany pivot), جدول: doctor_states (ManyToMany pivot) (+6 more)
@@ -1385,7 +1376,7 @@ Nodes (14): Doctor Management, Errors, Errors, GET `/api/v1/admin/doctors`, GET
### Community 175 - "Community 175" ### Community 175 - "Community 175"
Cohesion: 0.35 Cohesion: 0.35
Nodes (5): RepresentationController, JsonResponse, Representation, Request, User Nodes (5): PatientController, JsonResponse, PatientSession, Request, User
### Community 176 - "Community 176" ### Community 176 - "Community 176"
Cohesion: 0.33 Cohesion: 0.33
@@ -1484,8 +1475,8 @@ Cohesion: 0.20
Nodes (10): Admin API, Clinic Invitation Management, GET `/api/v1/admin/comments`, GET `/api/v1/admin/rates`, GET /api/v1/admin/settings, PATCH /api/v1/admin/settings, Query Parameters, Query Parameters (+2 more) Nodes (10): Admin API, Clinic Invitation Management, GET `/api/v1/admin/comments`, GET `/api/v1/admin/rates`, GET /api/v1/admin/settings, PATCH /api/v1/admin/settings, Query Parameters, Query Parameters (+2 more)
### Community 202 - "Community 202" ### Community 202 - "Community 202"
Cohesion: 0.15 Cohesion: 0.10
Nodes (13): DELETE `/api/v1/appointment-settings/holidays/{uuid}`, Errors, GET `/api/v1/appointment-settings/holidays/list/{doctorUuid}`, GET `/api/v1/appointment-settings/holidays/{uuid}`, Holidays, PATCH `/api/v1/appointment-settings/holidays/{uuid}`, POST `/api/v1/appointment-settings/holidays`, Request Body (+5 more) Nodes (19): Appointment Settings API, Available Locations, DELETE `/api/v1/appointment-settings/holidays/{uuid}`, Errors, Errors, `GET /api/v1/appointment-settings/available-locations/{doctorUuid}`, GET `/api/v1/appointment-settings/holidays/list/{doctorUuid}`, GET `/api/v1/appointment-settings/holidays/{uuid}` (+11 more)
### Community 203 - "Community 203" ### Community 203 - "Community 203"
Cohesion: 0.15 Cohesion: 0.15
@@ -1496,12 +1487,12 @@ Cohesion: 0.21
Nodes (6): AuthenticationException, ExceptionSubscriber, SecurityHeadersSubscriber, EventSubscriberInterface, ExceptionEvent, ResponseEvent Nodes (6): AuthenticationException, ExceptionSubscriber, SecurityHeadersSubscriber, EventSubscriberInterface, ExceptionEvent, ResponseEvent
### Community 205 - "Community 205" ### Community 205 - "Community 205"
Cohesion: 0.10 Cohesion: 0.07
Nodes (16): Command, CancelExpiredAppointmentsCommand, CreateAdminCommand, PruneLogsCommand, SeedCategoriesCommand, SeedSmsMessageTemplatesCommand, InputInterface, OutputInterface (+8 more) Nodes (20): Command, CancelExpiredAppointmentsCommand, CreateAdminCommand, PruneLogsCommand, SeedCategoriesCommand, SeedSmsMessageTemplatesCommand, SmsMessageTemplateRepository, SmsTextResolver (+12 more)
### Community 206 - "Community 206" ### Community 206 - "Community 206"
Cohesion: 0.35 Cohesion: 0.26
Nodes (6): DashboardController, Clinic, DoctorSecretary, JsonResponse, Request, User Nodes (3): MellatGateway, PaymentInitResult, PaymentVerifyResult
### Community 207 - "Community 207" ### Community 207 - "Community 207"
Cohesion: 0.15 Cohesion: 0.15
@@ -1560,20 +1551,20 @@ Cohesion: 0.24
Nodes (5): PaymentRepository, Appointment, ManagerRegistry, Payment, User Nodes (5): PaymentRepository, Appointment, ManagerRegistry, Payment, User
### Community 225 - "Community 225" ### Community 225 - "Community 225"
Cohesion: 0.31 Cohesion: 0.30
Nodes (4): ClinicInvitationService, Clinic, ClinicDoctorInvitation, User Nodes (6): AbstractAuthenticator, Passport, PasswordAuthenticator, Request, Response, TokenInterface
### Community 226 - "Community 226" ### Community 226 - "Community 226"
Cohesion: 0.15 Cohesion: 0.15
Nodes (12): Callback Mellat, frontend_address, Idempotency, درگاه‌های واقعی پروژه (از کد Drupal), شرط ایجاد پرداخت, قیمت از Config (نه Request), مجوزها, نکات پیاده‌سازی — تسک ۱۵: ماژول پرداخت (+4 more) Nodes (12): Callback Mellat, frontend_address, Idempotency, درگاه‌های واقعی پروژه (از کد Drupal), شرط ایجاد پرداخت, قیمت از Config (نه Request), مجوزها, نکات پیاده‌سازی — تسک ۱۵: ماژول پرداخت (+4 more)
### Community 227 - "Community 227" ### Community 227 - "Community 227"
Cohesion: 0.30 Cohesion: 0.36
Nodes (6): AbstractAuthenticator, Passport, PasswordAuthenticator, Request, Response, TokenInterface Nodes (4): SiteConfigController, JsonResponse, Request, User
### Community 228 - "Community 228" ### Community 228 - "Community 228"
Cohesion: 0.05 Cohesion: 0.04
Nodes (43): Bulk import / export, DELETE `/api/v1/admin/insurance/{id}`, DELETE `/api/v1/billing/tenant-insurances/{uuid}`, DELETE `/api/v1/insurance/{id}`, EntityInsurancePricing — قیمت‌گذاری ویزیت بر اساس بیمه, Errors, Errors, Errors (+35 more) Nodes (47): Bulk import / export, DELETE `/api/v1/admin/insurance/{id}`, DELETE `/api/v1/billing/tenant-insurances/{uuid}`, DELETE `/api/v1/insurance/{id}`, EntityInsurancePricing — قیمت‌گذاری ویزیت بر اساس بیمه, Errors, Errors, Errors (+39 more)
### Community 229 - "Community 229" ### Community 229 - "Community 229"
Cohesion: 0.15 Cohesion: 0.15
@@ -1667,6 +1658,10 @@ Nodes (4): SmsLogRepository, OtpService, SmsLog, ManagerRegistry
Cohesion: 0.45 Cohesion: 0.45
Nodes (4): NotificationMobileController, JsonResponse, Request, User Nodes (4): NotificationMobileController, JsonResponse, Request, User
### Community 253 - "Community 253"
Cohesion: 0.36
Nodes (3): DoctorServiceController, JsonResponse, Request
### Community 254 - "Community 254" ### Community 254 - "Community 254"
Cohesion: 0.18 Cohesion: 0.18
Nodes (11): 1. 🔵 `POST` refresh token, 1. احراز هویت (Authentication), 2. 🟢 `GET` X-CSRF-Token, 3. 🟢 `GET` user info 🆕, Request Body, بخش دوم — مستند کامل API, خطاهای عمومی, فهرست مطالب (+3 more) Nodes (11): 1. 🔵 `POST` refresh token, 1. احراز هویت (Authentication), 2. 🟢 `GET` X-CSRF-Token, 3. 🟢 `GET` user info 🆕, Request Body, بخش دوم — مستند کامل API, خطاهای عمومی, فهرست مطالب (+3 more)
@@ -1744,12 +1739,12 @@ Cohesion: 0.18
Nodes (10): Endpoint های موجود که تغییر می‌کنند, GET /api/v1/admin/dashboard/charts?from=UNIX&to=UNIX, GET /api/v1/dashboard/clinic, GET /api/v1/dashboard/doctor, تسک ۱۶: داشبورد هوشمند — چارت + فیلتر زمانی, توضیح, زمان تخمینی, فیلتر بازه زمانی (+2 more) Nodes (10): Endpoint های موجود که تغییر می‌کنند, GET /api/v1/admin/dashboard/charts?from=UNIX&to=UNIX, GET /api/v1/dashboard/clinic, GET /api/v1/dashboard/doctor, تسک ۱۶: داشبورد هوشمند — چارت + فیلتر زمانی, توضیح, زمان تخمینی, فیلتر بازه زمانی (+2 more)
### Community 274 - "Community 274" ### Community 274 - "Community 274"
Cohesion: 0.18 Cohesion: 0.20
Nodes (5): Authentication, ClinicPro — API Documentation Index, Error Code Reference, Modules, Standard Response Envelope Nodes (5): Authentication, ClinicPro — API Documentation Index, Error Code Reference, Modules, Standard Response Envelope
### Community 275 - "Community 275" ### Community 275 - "Community 275"
Cohesion: 0.38 Cohesion: 0.22
Nodes (5): MyAppointmentsController, Doctor, JsonResponse, Request, User Nodes (3): AppException, SlotTakenException, RuntimeException
### Community 276 - "Community 276" ### Community 276 - "Community 276"
Cohesion: 0.20 Cohesion: 0.20
@@ -1844,8 +1839,8 @@ Cohesion: 0.22
Nodes (9): require-dev, phpstan/phpstan, phpstan/phpstan-doctrine, phpstan/phpstan-symfony, phpunit/phpunit, symfony/browser-kit, symfony/css-selector, symfony/debug-bundle (+1 more) Nodes (9): require-dev, phpstan/phpstan, phpstan/phpstan-doctrine, phpstan/phpstan-symfony, phpunit/phpunit, symfony/browser-kit, symfony/css-selector, symfony/debug-bundle (+1 more)
### Community 300 - "Community 300" ### Community 300 - "Community 300"
Cohesion: 0.19 Cohesion: 0.42
Nodes (6): HealthController, PreRegistrationController, EntityManagerInterface, JsonResponse, Request, JsonResponse Nodes (3): PreRegistrationController, JsonResponse, Request
### Community 301 - "Community 301" ### Community 301 - "Community 301"
Cohesion: 0.17 Cohesion: 0.17
@@ -1861,7 +1856,7 @@ Nodes (16): آماده‌سازی پروژه ClinicPro برای دیپلوی ر
### Community 304 - "Community 304" ### Community 304 - "Community 304"
Cohesion: 0.22 Cohesion: 0.22
Nodes (9): 29. 🟢 `GET` clinic list 🆕, 30. 🟢 `GET` get 🆕, 36. 🟢 `GET` get my rate, 6. کلینیک (Clinic), هدرهای اضافی, پارامترهای Query, پاسخ‌ها, پاسخ‌ها (+1 more) Nodes (9): 30. 🟢 `GET` get 🆕, 33. 🔵 `POST` image_clinic, 43. 🟢 `GET` get, 6. کلینیک (Clinic), هدرهای اضافی, هدرهای اضافی, پاسخ‌ها, پاسخ‌ها (+1 more)
### Community 306 - "Community 306" ### Community 306 - "Community 306"
Cohesion: 0.07 Cohesion: 0.07
@@ -1872,8 +1867,8 @@ Cohesion: 0.28
Nodes (3): UserActiveContext, self, User Nodes (3): UserActiveContext, self, User
### Community 308 - "Community 308" ### Community 308 - "Community 308"
Cohesion: 0.22 Cohesion: 0.43
Nodes (3): AppException, SlotTakenException, RuntimeException Nodes (3): InvoiceItemRepository, InvoiceItem, ManagerRegistry
### Community 309 - "Community 309" ### Community 309 - "Community 309"
Cohesion: 0.22 Cohesion: 0.22
@@ -1907,10 +1902,6 @@ Nodes (4): SubscriptionPeriodRepository, ManagerRegistry, SubscriptionPeriod, Su
Cohesion: 0.36 Cohesion: 0.36
Nodes (3): SubscriptionPlanRepository, ManagerRegistry, SubscriptionPlan Nodes (3): SubscriptionPlanRepository, ManagerRegistry, SubscriptionPlan
### Community 317 - "Community 317"
Cohesion: 0.36
Nodes (3): DoctorServiceController, JsonResponse, Request
### Community 319 - "Community 319" ### Community 319 - "Community 319"
Cohesion: 0.39 Cohesion: 0.39
Nodes (3): UserRepository, ManagerRegistry, User Nodes (3): UserRepository, ManagerRegistry, User
@@ -2024,11 +2015,11 @@ Cohesion: 0.43
Nodes (3): SmsWalletRepository, ManagerRegistry, SmsWallet Nodes (3): SmsWalletRepository, ManagerRegistry, SmsWallet
### Community 351 - "Community 351" ### Community 351 - "Community 351"
Cohesion: 0.26 Cohesion: 0.22
Nodes (3): MellatGateway, PaymentInitResult, PaymentVerifyResult Nodes (4): MockGateway, PaymentGatewayInterface, PaymentInitResult, PaymentVerifyResult
### Community 352 - "Community 352" ### Community 352 - "Community 352"
Cohesion: 0.31 Cohesion: 0.27
Nodes (3): SepGateway, PaymentInitResult, PaymentVerifyResult Nodes (3): SepGateway, PaymentInitResult, PaymentVerifyResult
### Community 354 - "Community 354" ### Community 354 - "Community 354"
@@ -2103,6 +2094,10 @@ Nodes (7): Authentication, Authorization, Input Validation, Logging Security, Ra
Cohesion: 0.15 Cohesion: 0.15
Nodes (6): UniqueConstraintsTest, FinancialBreakdown, FinancialBreakdownRepository, FinancialBreakdownIntegrityTest, ManagerRegistry, Payment Nodes (6): UniqueConstraintsTest, FinancialBreakdown, FinancialBreakdownRepository, FinancialBreakdownIntegrityTest, ManagerRegistry, Payment
### Community 372 - "Community 372"
Cohesion: 0.50
Nodes (4): Errors, PATCH `/api/v1/insurance/{id}`, Request Body, Response `200`
### Community 374 - "Community 374" ### Community 374 - "Community 374"
Cohesion: 0.29 Cohesion: 0.29
Nodes (7): API, Entity جدید, Frontend, اپیک ۱ — پرسنل (Staff), توضیح, فایل‌های جدید, نیازمندی‌های کارکردی Nodes (7): API, Entity جدید, Frontend, اپیک ۱ — پرسنل (Staff), توضیح, فایل‌های جدید, نیازمندی‌های کارکردی
@@ -2200,48 +2195,44 @@ Cohesion: 0.29
Nodes (4): initiate(), verify(), PaymentInitResult, PaymentVerifyResult Nodes (4): initiate(), verify(), PaymentInitResult, PaymentVerifyResult
### Community 405 - "Community 405" ### Community 405 - "Community 405"
Cohesion: 0.47 Cohesion: 0.48
Nodes (3): CommissionService, Payment, Representation Nodes (3): SmsSettingsRepository, SmsSettings, ManagerRegistry
### Community 407 - "Community 407" ### Community 407 - "Community 407"
Cohesion: 0.36 Cohesion: 0.18
Nodes (3): SmsService, SendSmsMessage, SmsProviderInterface Nodes (4): RanginehProvider, SmsService, SendSmsMessage, SmsProviderInterface
### Community 418 - "Community 418" ### Community 418 - "Community 418"
Cohesion: 0.17 Cohesion: 0.17
Nodes (11): دیپلوی ClinicPro روی Coolify (Docker Compose), رفع اشکال, مراحل دیپلوی, معماری دیپلوی, نکات عملیاتی, چند دامنه فرانت‌اند (مهم), ۱. ساخت Resource در Coolify, ۲. اختصاص دامنه (+3 more) Nodes (11): دیپلوی ClinicPro روی Coolify (Docker Compose), رفع اشکال, مراحل دیپلوی, معماری دیپلوی, نکات عملیاتی, چند دامنه فرانت‌اند (مهم), ۱. ساخت Resource در Coolify, ۲. اختصاص دامنه (+3 more)
### Community 426 - "Community 426" ### Community 421 - "Community 421"
Cohesion: 0.23 Cohesion: 0.23
Nodes (5): AbstractMigration, Schema, Version20260611084046, Schema, Version20260614181629 Nodes (5): AbstractMigration, Schema, Version20260609132009, Schema, Version20260610140853
### Community 430 - "Community 430"
Cohesion: 0.39
Nodes (3): DoctorService, DoctorServiceRepository, ManagerRegistry
### Community 439 - "Community 439" ### Community 439 - "Community 439"
Cohesion: 0.29 Cohesion: 0.40
Nodes (6): Appointment Settings API, Available Locations, Errors, `GET /api/v1/appointment-settings/available-locations/{doctorUuid}`, Response `200`, Slot Calculation Logic (Reference) Nodes (5): 31. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 440 - "Community 440" ### Community 440 - "Community 440"
Cohesion: 0.11 Cohesion: 0.11
Nodes (18): [F10] راهنمای کهنه در `CLAUDE.md`: endpoint `categorys/{bundle}` منتقل شده, [F11] داشبورد دکتر `GET /api/v1/dashboard/doctor` همیشه 500 (فیلد ناموجود در DQL) — ✅ رفع شد, [F1] phpstan: مقایسهٔ همیشه‌درست در محاسبهٔ estimated SMS — ✅ رفع شد, [F2] تست‌های PHPUnit به API خارجی Kavenegar درخواست واقعی می‌زنند, [F3] دیتابیس تست seed نشده — فقط کاربر ادمین وجود دارد, [F4] اسکریپت seeder `create_test_users.php` وجود ندارد, [F5] ادمین با JWT معتبر به `/api/doc` (Swagger UI) دسترسی ندارد (401), [F6] ناسازگاری کدهای خطا بین دامنه‌ها (+10 more) Nodes (18): [F10] راهنمای کهنه در `CLAUDE.md`: endpoint `categorys/{bundle}` منتقل شده, [F11] داشبورد دکتر `GET /api/v1/dashboard/doctor` همیشه 500 (فیلد ناموجود در DQL) — ✅ رفع شد, [F1] phpstan: مقایسهٔ همیشه‌درست در محاسبهٔ estimated SMS — ✅ رفع شد, [F2] تست‌های PHPUnit به API خارجی Kavenegar درخواست واقعی می‌زنند, [F3] دیتابیس تست seed نشده — فقط کاربر ادمین وجود دارد, [F4] اسکریپت seeder `create_test_users.php` وجود ندارد, [F5] ادمین با JWT معتبر به `/api/doc` (Swagger UI) دسترسی ندارد (401), [F6] ناسازگاری کدهای خطا بین دامنه‌ها (+10 more)
### Community 452 - "Community 452" ### Community 452 - "Community 452"
Cohesion: 0.06 Cohesion: 0.07
Nodes (31): cn(), iranMobileOptionalSchema, iranMobileSchema, isValidIranMobile(), maskMobile(), sanitizeMobileInput(), toDate(), toEnglishDigits() (+23 more) Nodes (38): FreeVisitPrice(), Pricing, cn(), formatDate(), formatDateTime(), formatRial(), iranMobileOptionalSchema, iranMobileSchema (+30 more)
### Community 456 - "Community 456" ### Community 456 - "Community 456"
Cohesion: 0.38 Cohesion: 0.40
Nodes (5): Rate, RateRepository, Doctor, ManagerRegistry, User Nodes (5): 32. 🔵 `POST` post, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 458 - "Community 458" ### Community 458 - "Community 458"
Cohesion: 0.47 Cohesion: 0.47
Nodes (6): formatPersianDate(), gToJ(), jFirstDayOfWeek(), PersianDateInput(), todayGregorian(), toPersianNums() Nodes (6): formatPersianDate(), gToJ(), jFirstDayOfWeek(), PersianDateInput(), todayGregorian(), toPersianNums()
### Community 459 - "Community 459" ### Community 459 - "Community 459"
Cohesion: 0.40 Cohesion: 0.33
Nodes (5): API موجود (نیاز به تغییر ندارند), اپیک ۳ — منشی (Secretary) — تکمیل, تغییرات مورد نیاز, توضیح, نیازمندی‌های کارکردی Nodes (6): API موجود (نیاز به تغییر ندارند), اپیک‌ها, اپیک ۳ — منشی (Secretary) — تکمیل, تغییرات مورد نیاز, توضیح, نیازمندی‌های کارکردی
### Community 460 - "Community 460" ### Community 460 - "Community 460"
Cohesion: 0.33 Cohesion: 0.33
@@ -2320,8 +2311,8 @@ Cohesion: 0.40
Nodes (5): Errors, Notes, POST `/api/v1/notification-mobile/request-otp`, Request Body, Response `200` Nodes (5): Errors, Notes, POST `/api/v1/notification-mobile/request-otp`, Request Body, Response `200`
### Community 482 - "Community 482" ### Community 482 - "Community 482"
Cohesion: 0.38 Cohesion: 0.24
Nodes (3): RepositoryClassMappingTest, KernelTestCase, DbLoggerTest Nodes (4): RepositoryClassMappingTest, KernelTestCase, LoggerInterface, DbLoggerTest
### Community 483 - "Community 483" ### Community 483 - "Community 483"
Cohesion: 0.40 Cohesion: 0.40
@@ -2376,8 +2367,8 @@ Cohesion: 0.40
Nodes (5): addMinutes(), calcSlotCount(), hasOverlap(), parseMinutes(), SessionEditor() Nodes (5): addMinutes(), calcSlotCount(), hasOverlap(), parseMinutes(), SessionEditor()
### Community 500 - "Community 500" ### Community 500 - "Community 500"
Cohesion: 0.33 Cohesion: 0.40
Nodes (6): API موجود (نیاز به endpoint جدید ندارد), اپیک‌ها, اپیک ۷ — داشبورد هوشمند (Smart Dashboard), تغییر مورد نیاز, توضیح, نیازمندی‌های کارکردی Nodes (5): API موجود (نیاز به endpoint جدید ندارد), اپیک ۷ — داشبورد هوشمند (Smart Dashboard), تغییر مورد نیاز, توضیح, نیازمندی‌های کارکردی
### Community 501 - "Community 501" ### Community 501 - "Community 501"
Cohesion: 0.40 Cohesion: 0.40
@@ -2459,10 +2450,6 @@ Nodes (3): SmsTemplateRepository, SmsTemplate, ManagerRegistry
Cohesion: 0.12 Cohesion: 0.12
Nodes (16): دیپلوی ClinicPro (Symfony) روی لیارا با پلتفرم PHP (بدون داکر), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (کد واقعی), وظایف, پروژه (+8 more) Nodes (16): دیپلوی ClinicPro (Symfony) روی لیارا با پلتفرم PHP (بدون داکر), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (کد واقعی), وظایف, پروژه (+8 more)
### Community 525 - "Community 525"
Cohesion: 0.25
Nodes (4): SmsMessageTemplateRepository, SmsTextResolver, SmsMessageTemplate, ManagerRegistry
### Community 526 - "Community 526" ### Community 526 - "Community 526"
Cohesion: 0.50 Cohesion: 0.50
Nodes (4): Errors, POST `/api/v1/user/register`, Request Body, Response `201` Nodes (4): Errors, POST `/api/v1/user/register`, Request Body, Response `201`
@@ -2499,13 +2486,17 @@ Nodes (4): Errors, POST `/api/v1/user/verify-code`, Request Body, Response `200`
Cohesion: 0.50 Cohesion: 0.50
Nodes (4): Errors, GET `/api/v1/representation/{uuid}`, Path Parameters, Response `200` Nodes (4): Errors, GET `/api/v1/representation/{uuid}`, Path Parameters, Response `200`
### Community 537 - "Community 537"
Cohesion: 0.40
Nodes (3): Props, StatTone, TONE
### Community 539 - "Community 539" ### Community 539 - "Community 539"
Cohesion: 0.67 Cohesion: 0.67
Nodes (3): Errors, GET `/api/v1/notification-mobile/{target}`, Response `200` Nodes (3): Errors, GET `/api/v1/notification-mobile/{target}`, Response `200`
### Community 542 - "Community 542" ### Community 542 - "Community 542"
Cohesion: 0.43 Cohesion: 0.50
Nodes (3): SmsMessageController, JsonResponse, Request Nodes (4): 38. 🟢 `GET` Unapproved comments, هدرهای اضافی, پارامترهای Query, پاسخ‌ها
### Community 543 - "Community 543" ### Community 543 - "Community 543"
Cohesion: 0.53 Cohesion: 0.53
@@ -2676,8 +2667,8 @@ Cohesion: 0.67
Nodes (3): POST `/api/v1/admin/sms/template/{uuid}/approve`, Request Body (`application/json`), Response `200` Nodes (3): POST `/api/v1/admin/sms/template/{uuid}/approve`, Request Body (`application/json`), Response `200`
### Community 602 - "Community 602" ### Community 602 - "Community 602"
Cohesion: 0.48 Cohesion: 0.50
Nodes (3): DoctorInsuranceRepository, DoctorInsurance, ManagerRegistry Nodes (4): 44. 🟢 `GET` list comment, هدرهای اضافی, پارامترهای Query, پاسخ‌ها
### Community 603 - "Community 603" ### Community 603 - "Community 603"
Cohesion: 0.67 Cohesion: 0.67
@@ -2707,6 +2698,10 @@ Nodes (3): بک‌اند, فرانت‌اند, وضعیت فعلی کد (مهم
Cohesion: 0.12 Cohesion: 0.12
Nodes (6): ServiceItemDeleteCleanupTest, ServiceCoverageNPlusOneTest, TenantInsuranceCleanupTest, TenantServiceCoverageRepository, ManagerRegistry, TenantServiceCoverage Nodes (6): ServiceItemDeleteCleanupTest, ServiceCoverageNPlusOneTest, TenantInsuranceCleanupTest, TenantServiceCoverageRepository, ManagerRegistry, TenantServiceCoverage
### Community 625 - "Community 625"
Cohesion: 0.50
Nodes (4): 45. 🔵 `POST` post, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 631 - "Community 631" ### Community 631 - "Community 631"
Cohesion: 0.50 Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/representations`, Query Parameters, Representation Management, Response `200` Nodes (4): GET `/api/v1/admin/representations`, Query Parameters, Representation Management, Response `200`
@@ -2724,8 +2719,8 @@ Cohesion: 0.25
Nodes (8): ۲.۲ انواع دسته‌بندی (Category Types), ۲.۲.۱ تگ (Tag), ۲.۲.۲ استان (State), ۲.۲.۳ شهر (City), ۲.۲.۴ بیمه پایه (Basic Insurance), ۲.۲.۵ بیمه مکمل (Supplementary Insurance), ۲.۲.۶ تخصص دکتر (Doctor Specialty), ۲.۲.۷ خدمات دکتر (Doctor Services) Nodes (8): ۲.۲ انواع دسته‌بندی (Category Types), ۲.۲.۱ تگ (Tag), ۲.۲.۲ استان (State), ۲.۲.۳ شهر (City), ۲.۲.۴ بیمه پایه (Basic Insurance), ۲.۲.۵ بیمه مکمل (Supplementary Insurance), ۲.۲.۶ تخصص دکتر (Doctor Specialty), ۲.۲.۷ خدمات دکتر (Doctor Services)
### Community 635 - "Community 635" ### Community 635 - "Community 635"
Cohesion: 0.43 Cohesion: 0.50
Nodes (5): BeforeInstallPromptEvent, usePwaInstall(), PwaInstallBanner(), detectIOS(), PwaLoginCard() Nodes (4): 46. 🟡 `PATCH` patch, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 636 - "Community 636" ### Community 636 - "Community 636"
Cohesion: 0.50 Cohesion: 0.50
@@ -2752,24 +2747,24 @@ Cohesion: 0.40
Nodes (5): 41. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها Nodes (5): 41. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 649 - "Community 649" ### Community 649 - "Community 649"
Cohesion: 0.40 Cohesion: 0.67
Nodes (5): 31. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها Nodes (3): 29. 🟢 `GET` clinic list 🆕, پارامترهای Query, پاسخ‌ها
### Community 650 - "Community 650" ### Community 650 - "Community 650"
Cohesion: 0.40 Cohesion: 0.67
Nodes (5): 32. 🔵 `POST` post, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها Nodes (3): 34. 🔵 `POST` image logo, هدرهای اضافی, پاسخ‌ها
### Community 651 - "Community 651"
Cohesion: 0.67
Nodes (3): 36. 🟢 `GET` get my rate, هدرهای اضافی, پاسخ‌ها
### Community 652 - "Community 652" ### Community 652 - "Community 652"
Cohesion: 0.50 Cohesion: 0.50
Nodes (4): Errors, Path Parameters, POST `/api/v1/clinic-pro/doctor-address/from-clinic/{clinicUuid}`, Response `201` Nodes (4): Errors, Path Parameters, POST `/api/v1/clinic-pro/doctor-address/from-clinic/{clinicUuid}`, Response `201`
### Community 653 - "Community 653" ### Community 653 - "Community 653"
Cohesion: 0.50 Cohesion: 0.67
Nodes (4): 38. 🟢 `GET` Unapproved comments, هدرهای اضافی, پارامترهای Query, پاسخ‌ها Nodes (3): 42. 🔴 `DELETE` delete, هدرهای اضافی, پاسخ‌ها
### Community 654 - "Community 654"
Cohesion: 0.29
Nodes (3): ApiError, { refreshMock, logoutMock }, replaceMock
### Community 656 - "Community 656" ### Community 656 - "Community 656"
Cohesion: 0.40 Cohesion: 0.40
@@ -2795,14 +2790,6 @@ Nodes (5): 37. 🔵 `POST` post, Request Body, مثال Request, هدرهای ا
Cohesion: 0.29 Cohesion: 0.29
Nodes (7): Application Logs, DELETE `/api/v1/admin/logs`, GET `/api/v1/admin/logs`, Log Retention, Query Parameters, Response `200`, Response `200` Nodes (7): Application Logs, DELETE `/api/v1/admin/logs`, GET `/api/v1/admin/logs`, Log Retention, Query Parameters, Response `200`, Response `200`
### Community 664 - "Community 664"
Cohesion: 0.40
Nodes (5): 61. 🔵 `POST` post, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 665 - "Community 665"
Cohesion: 0.40
Nodes (3): Props, StatTone, TONE
### Community 666 - "Community 666" ### Community 666 - "Community 666"
Cohesion: 0.50 Cohesion: 0.50
Nodes (4): GET /api/v1/appointment-settings/slots — دریافت اسلات‌های خالی, POST /api/v1/appointment-settings/holidays — ثبت تعطیلی (فقط ادمین), POST /api/v1/appointment-settings/overrides — ثبت Override توسط دکتر, Task-09: API تنظیمات نوبت Nodes (4): GET /api/v1/appointment-settings/slots — دریافت اسلات‌های خالی, POST /api/v1/appointment-settings/holidays — ثبت تعطیلی (فقط ادمین), POST /api/v1/appointment-settings/overrides — ثبت Override توسط دکتر, Task-09: API تنظیمات نوبت
@@ -2819,14 +2806,6 @@ Nodes (4): ۲.۱۳ نظرات، لایک و امتیازدهی, ۲.۱۳.۱ نظ
Cohesion: 0.50 Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/settlements`, Query Parameters, Response `200`, Settlement Management Nodes (4): GET `/api/v1/admin/settlements`, Query Parameters, Response `200`, Settlement Management
### Community 673 - "Community 673"
Cohesion: 0.50
Nodes (4): Errors, GET `/api/v1/admin/insurances`, Query Parameters, Response `200`
### Community 674 - "Community 674"
Cohesion: 0.50
Nodes (4): Errors, POST `/api/v1/insurance/`, Request Body (`application/json`), Response `201`
### Community 675 - "Community 675" ### Community 675 - "Community 675"
Cohesion: 0.50 Cohesion: 0.50
Nodes (4): 39. 🟡 `PATCH` Comment confirmation, مثال Request, هدرهای اضافی, پاسخ‌ها Nodes (4): 39. 🟡 `PATCH` Comment confirmation, مثال Request, هدرهای اضافی, پاسخ‌ها
@@ -2835,53 +2814,25 @@ Nodes (4): 39. 🟡 `PATCH` Comment confirmation, مثال Request, هدرهای
Cohesion: 0.50 Cohesion: 0.50
Nodes (4): 40. 🔵 `POST` post, مثال Request, هدرهای اضافی, پاسخ‌ها Nodes (4): 40. 🔵 `POST` post, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 677 - "Community 677"
Cohesion: 0.50
Nodes (4): 44. 🟢 `GET` list comment, هدرهای اضافی, پارامترهای Query, پاسخ‌ها
### Community 678 - "Community 678"
Cohesion: 0.50
Nodes (4): 45. 🔵 `POST` post, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 680 - "Community 680"
Cohesion: 0.50
Nodes (4): 46. 🟡 `PATCH` patch, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 681 - "Community 681"
Cohesion: 0.67
Nodes (3): 33. 🔵 `POST` image_clinic, هدرهای اضافی, پاسخ‌ها
### Community 682 - "Community 682"
Cohesion: 0.67
Nodes (3): 34. 🔵 `POST` image logo, هدرهای اضافی, پاسخ‌ها
### Community 683 - "Community 683"
Cohesion: 0.67
Nodes (3): 42. 🔴 `DELETE` delete, هدرهای اضافی, پاسخ‌ها
### Community 684 - "Community 684"
Cohesion: 0.67
Nodes (3): 43. 🟢 `GET` get, هدرهای اضافی, پاسخ‌ها
## Knowledge Gaps ## Knowledge Gaps
- **3645 isolated node(s):** `ALLOWED_ROLES`, `Pricing`, `TenantInsurance`, `CoverageRow`, `Draft` (+3640 more) - **3656 isolated node(s):** `ALLOWED_ROLES`, `Pricing`, `TenantInsurance`, `CoverageRow`, `Draft` (+3651 more)
These have ≤1 connection - possible missing edges or undocumented components. These have ≤1 connection - possible missing edges or undocumented components.
- **133 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. - **129 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions ## Suggested Questions
_Questions this graph is uniquely positioned to answer:_ _Questions this graph is uniquely positioned to answer:_
- **Why does `BaseController` connect `Community 108` to `Community 6`, `Community 138`, `Community 139`, `Community 14`, `Community 15`, `Community 275`, `Community 20`, `Community 22`, `Community 26`, `Community 542`, `Community 164`, `Community 295`, `Community 300`, `Community 175`, `Community 176`, `Community 177`, `Community 58`, `Community 59`, `Community 317`, `Community 63`, `Community 64`, `Community 70`, `Community 71`, `Community 75`, `Community 206`, `Community 230`, `Community 103`, `Community 104`, `Community 107`, `Community 491`, `Community 109`, `Community 121`, `Community 122`, `Community 252`?** - **Why does `BaseController` connect `Community 108` to `Community 6`, `Community 138`, `Community 139`, `Community 14`, `Community 15`, `Community 20`, `Community 22`, `Community 26`, `Community 164`, `Community 295`, `Community 169`, `Community 300`, `Community 175`, `Community 176`, `Community 177`, `Community 59`, `Community 63`, `Community 64`, `Community 75`, `Community 227`, `Community 230`, `Community 103`, `Community 104`, `Community 107`, `Community 491`, `Community 109`, `Community 121`, `Community 122`, `Community 252`, `Community 253`?**
_High betweenness centrality (0.033) - this node is a cross-community bridge._ _High betweenness centrality (0.032) - this node is a cross-community bridge._
- **Why does `AppointmentRepository` connect `Community 119` to `Community 53`?** - **Why does `AppointmentRepository` connect `Community 119` to `Community 53`?**
_High betweenness centrality (0.019) - this node is a cross-community bridge._ _High betweenness centrality (0.019) - this node is a cross-community bridge._
- **Why does `Version20260614181657` connect `Community 431` to `Community 426`?** - **Why does `Version20260614181657` connect `Community 431` to `Community 421`?**
_High betweenness centrality (0.015) - this node is a cross-community bridge._ _High betweenness centrality (0.015) - this node is a cross-community bridge._
- **What connects `ALLOWED_ROLES`, `Pricing`, `TenantInsurance` to the rest of the system?** - **What connects `ALLOWED_ROLES`, `Pricing`, `TenantInsurance` to the rest of the system?**
_3645 weakly-connected nodes found - possible documentation gaps or missing edges._ _3656 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 0` be split into smaller, more focused modules?** - **Should `Community 0` be split into smaller, more focused modules?**
_Cohesion score 0.048633879781420766 - nodes in this community are weakly interconnected._ _Cohesion score 0.05004389815627744 - nodes in this community are weakly interconnected._
- **Should `Community 1` be split into smaller, more focused modules?** - **Should `Community 1` be split into smaller, more focused modules?**
_Cohesion score 0.028985507246376812 - nodes in this community are weakly interconnected._ _Cohesion score 0.028985507246376812 - nodes in this community are weakly interconnected._
- **Should `Community 2` be split into smaller, more focused modules?** - **Should `Community 2` be split into smaller, more focused modules?**
_Cohesion score 0.07823613086770982 - nodes in this community are weakly interconnected._ _Cohesion score 0.0659536541889483 - nodes in this community are weakly interconnected._
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1113 -843
View File
File diff suppressed because it is too large Load Diff
+9 -4
View File
@@ -780,13 +780,13 @@
"semantic_hash": "" "semantic_hash": ""
}, },
"package.json": { "package.json": {
"mtime": 1782728407.1808863, "mtime": 1782976135.2818882,
"ast_hash": "954f828ef2f79f0ac46b6154fb18c6dd", "ast_hash": "a1d6d0993877d027bf35d702f382e373",
"semantic_hash": "" "semantic_hash": ""
}, },
"postcss.config.js": { "postcss.config.js": {
"mtime": 1781030344.3535159, "mtime": 1782976147.0592823,
"ast_hash": "d75cf5f9f66171ccb397e82a93408a65", "ast_hash": "5b09c51f443a992b100f644d2899c9b6",
"semantic_hash": "" "semantic_hash": ""
}, },
"public/index.php": { "public/index.php": {
@@ -3508,5 +3508,10 @@
"mtime": 1782974183.0364032, "mtime": 1782974183.0364032,
"ast_hash": "dc5d90afffa97b8150bcacba60846c8d", "ast_hash": "dc5d90afffa97b8150bcacba60846c8d",
"semantic_hash": "" "semantic_hash": ""
},
".claude/prompt/admin-ios-safari-css-fallbacks.md": {
"mtime": 1782975691.9747198,
"ast_hash": "9583fb5ebc728ab1014038ac44d1d09a",
"semantic_hash": ""
} }
} }
+2950 -452
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -4,6 +4,7 @@
"@babel/preset-env": "^7.16.0", "@babel/preset-env": "^7.16.0",
"@babel/preset-react": "^7.0.0", "@babel/preset-react": "^7.0.0",
"@babel/preset-typescript": "^7.0.0", "@babel/preset-typescript": "^7.0.0",
"@csstools/postcss-oklab-function": "^5.0.6",
"@hotwired/stimulus": "^3.0.0", "@hotwired/stimulus": "^3.0.0",
"@symfony/stimulus-bridge": "^3.2.0 || ^4.0.0", "@symfony/stimulus-bridge": "^3.2.0 || ^4.0.0",
"@symfony/ux-react": "file:vendor/symfony/ux-react/assets", "@symfony/ux-react": "file:vendor/symfony/ux-react/assets",
+3
View File
@@ -1,5 +1,8 @@
module.exports = { module.exports = {
plugins: { plugins: {
'@tailwindcss/postcss': {}, '@tailwindcss/postcss': {},
// sRGB fallback خودکار برای oklch()های استاتیک (پالت Tailwind v4) روی WebKit قدیمی iPhone 8.
// preserve:true → مرورگر مدرن همچنان oklch می‌گیرد؛ قدیمی fallback rgb.
'@csstools/postcss-oklab-function': { preserve: true, subFeatures: { displayP3: false } },
}, },
}; };
+2278 -532
View File
File diff suppressed because it is too large Load Diff