{ "ListFormCode": "App.DeveloperKit.CustomComponents", "KeyFieldName": "Id", "GeneratedAt": "2026-10-04T15:00:00Z", "Order": 0, "Rows": [ { "Id": "23744edc-eda9-512e-8079-fe2e8e5fd2a8", "Name": "MyLeaveWidget", "RoutePath": null, "Description": "Intranet panosu: çalışanın izin bakiyesi, süren talepleri ve izin talebi/taleplerim/bakiyem bağlantıları", "IsActive": true, "Dependencies": [], "Code": "// Calisanin kendi izin ozeti. Veri ekranlarin kendi sorgusundan okunur: satir suzmesi\n// (EmployeeId = oturum acan kullanici) ve yetki ListForm'da kalir, bilesen yalnizca toplar.\nconst REQUESTS = 'App.Hr.MyLeaveRequest'\nconst BALANCE = 'App.Hr.MyLeaveBalance'\nconst OPEN_STATUSES = ['Onaya Gönderildi', 'Müdür Onayı', 'İK Onayı']\n\nconst loadRows = async (listFormCode) => {\n const response = await apiService.fetchData({\n method: 'GET',\n url: '/api/app/list-form-select/select',\n params: { listFormCode, take: 500 },\n })\n return response.data?.data ?? []\n}\n\nconst formatDays = (value) => {\n const number = Number(value ?? 0)\n return Number.isInteger(number) ? String(number) : number.toFixed(1)\n}\n\nconst formatDate = (value) => {\n if (!value) return '-'\n const [year, month, day] = String(value).slice(0, 10).split('-')\n return `${day}.${month}.${year}`\n}\n\nconst Stat = ({ label, value, className }) => (\n
\n
{value}
\n
{label}
\n
\n)\n\nconst MyLeaveWidget = () => {\n const [requests, setRequests] = useState([])\n const [ledger, setLedger] = useState([])\n const [loading, setLoading] = useState(true)\n const canSeeBalance = checkPermission(BALANCE)\n\n useEffect(() => {\n let active = true\n Promise.all([loadRows(REQUESTS), canSeeBalance ? loadRows(BALANCE) : Promise.resolve([])])\n .then(([requestRows, ledgerRows]) => {\n if (!active) return\n setRequests(requestRows)\n setLedger(ledgerRows)\n })\n .catch(() => {})\n .finally(() => active && setLoading(false))\n return () => {\n active = false\n }\n }, [canSeeBalance])\n\n const sum = (field) => ledger.reduce((total, row) => total + Number(row[field] ?? 0), 0)\n const remaining = sum('RemainingDays')\n const hasSeniority = ledger.some((row) => Number(row.YearNo) > 0) || ledger.some((row) => row.NextAccrualDate)\n const next = ledger.find((row) => row.NextAccrualDate)\n const open = requests\n .filter((row) => !row.ApprovalStatus || OPEN_STATUSES.includes(row.ApprovalStatus))\n .sort((a, b) => String(a.StartDate).localeCompare(String(b.StartDate)))\n\n return (\n
\n
\n \n

\n {translate('::App.DashboardWidget.MyLeave')}\n

\n
\n
\n {loading ? (\n
...
\n ) : (\n <>\n {canSeeBalance && (\n <>\n
\n \n \n \n
\n {next ? (\n
\n {translate('::App.DashboardWidget.Leave.NextAccrual', {\n date: formatDate(next.NextAccrualDate),\n days: formatDays(next.NextAccrualDays),\n })}\n
\n ) : (\n !hasSeniority && (\n
\n {translate('::App.DashboardWidget.Leave.NoSeniority')}\n
\n )\n )}\n \n )}\n
\n
\n {translate('::App.DashboardWidget.Leave.OpenRequests')}\n
\n {open.length === 0 ? (\n
\n {translate('::App.DashboardWidget.Leave.NoOpenRequest')}\n
\n ) : (\n
    \n {open.slice(0, 3).map((row) => (\n \n \n {formatDate(row.StartDate)} – {formatDate(row.EndDate)} · {formatDays(row.Days)}{' '}\n {translate('::App.DashboardWidget.Leave.Days')}\n \n \n {row.ApprovalStatus}\n \n \n ))}\n
\n )}\n
\n \n )}\n
\n \n {translate('::App.DashboardWidget.Leave.CreateRequest')}\n \n \n {translate('::App.DashboardWidget.Leave.MyRequests')}\n \n {canSeeBalance && (\n \n {translate('::App.DashboardWidget.Leave.MyBalance')}\n \n )}\n
\n
\n
\n )\n}\n\nexport default MyLeaveWidget\n", "Props": null, "DataSources": [], "SeoTitle": null, "SeoDescription": null, "SeoKeywords": null, "SeoOgImage": null, "SeoCanonicalUrl": null, "SeoNoIndex": true, "SeoIncludeInSitemap": false, "SeoChangeFrequency": null, "SeoPriority": null, "SeoStructuredData": null } ] }