From 6c4a8233c79d293dec203833aa1be7f39d697a62 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Sun, 20 Sep 2026 17:32:00 +0330 Subject: [PATCH] last ... --- RPK Apps.xlsx | Bin 10783 -> 19377 bytes RPK_Packages_Inventory_2026-09-20.xlsx | Bin 0 -> 14721 bytes Samples/xReleaseAssistant.json | 1594 ++++++++++++++++++++++++ Samples/xReleaseAssistant_Real_4.json | 226 ++++ xReleaseAssistant.html | 364 ++++-- xReleaseAssistant_6.html | 453 +++++-- 6 files changed, 2467 insertions(+), 170 deletions(-) create mode 100644 RPK_Packages_Inventory_2026-09-20.xlsx create mode 100644 Samples/xReleaseAssistant.json create mode 100644 Samples/xReleaseAssistant_Real_4.json diff --git a/RPK Apps.xlsx b/RPK Apps.xlsx index 347f9e2125c8d281cfc43e7485810246442c4a51..537a915db2d9fe6579ad8f5afd788da51acba718 100644 GIT binary patch delta 13002 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 delta 4347 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 h_2?0`?}o6mn4C8xC7x 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 S0{~z?Ug#fwtH}Dt)BgjKe3Bdh literal 0 HcmV?d00001 diff --git a/Samples/xReleaseAssistant.json b/Samples/xReleaseAssistant.json new file mode 100644 index 0000000..586bc4f --- /dev/null +++ b/Samples/xReleaseAssistant.json @@ -0,0 +1,1594 @@ +{ + "environments": [ + { + "id": "env-dev", + "name": "توسعه (Dev)", + "description": "محیط توسعه و تست اولیه", + "backgroundColor": "#38a169", + "textColor": "#ffffff" + }, + { + "id": "env-staging", + "name": "پیش‌تولید (Staging)", + "description": "محیط پیش از تولید", + "backgroundColor": "#dd6b20", + "textColor": "#ffffff" + }, + { + "id": "env-prod", + "name": "تولید (Production)", + "description": "محیط عملیاتی اصلی", + "backgroundColor": "#e53e3e", + "textColor": "#ffffff" + }, + { + "id": "env-uat", + "name": "تست پذیرش (UAT)", + "description": "محیط تست کاربر", + "backgroundColor": "#3182ce", + "textColor": "#ffffff" + }, + { + "id": "env-dr", + "name": "بازیابی فاجعه (DR)", + "description": "محیط Disaster Recovery", + "backgroundColor": "#805ad5", + "textColor": "#ffffff" + } + ], + "products": [ + { + "id": "prod-1001", + "title": "سامانه بانکداری الکترونیک", + "description": "پلتفرم جامع بانکداری دیجیتال", + "metadata": { + "createdAt": "2026-01-15T10:00:00Z", + "owner": "علی محمدی" + }, + "projects": [ + { + "id": "proj-2001", + "title": "API Gateway", + "type": "backend", + "description": "درگاه ورودی اصلی", + "repositoryUrl": "https://git.example.com/api-gateway", + "metadata": { + "createdAt": "2026-01-15T10:00:00Z", + "owner": "رضا احمدی", + "framework": ".NET 8", + "language": "C#" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3001", + "environmentId": "env-dev", + "version": "2.1.0", + "deploymentDate": "2026-09-18T14:30:00Z", + "releaseNotes": "افزودن پشتیبانی از OAuth2", + "status": "active", + "requiredDeployments": [] + }, + { + "id": "dep-3002", + "environmentId": "env-dev", + "version": "2.0.5", + "deploymentDate": "2026-09-10T10:00:00Z", + "releaseNotes": "رفع باگ احراز هویت", + "status": "archived", + "archivedAt": "2026-09-18T15:00:00Z", + "requiredDeployments": [] + }, + { + "id": "dep-3003", + "environmentId": "env-staging", + "version": "2.1.0", + "deploymentDate": "2026-09-19T09:00:00Z", + "releaseNotes": "آماده برای تست", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2002", + "title": "سرویس احراز هویت", + "type": "service", + "description": "مدیریت کاربران و توکن - سرویس مرکزی احراز هویت برای کل سازمان", + "repositoryUrl": "https://git.example.com/auth-service", + "metadata": { + "createdAt": "2026-01-20T10:00:00Z", + "owner": "سارا کریمی", + "framework": "Spring Boot", + "language": "Java" + }, + "dependencies": ["proj-2001"], + "deployments": [ + { + "id": "dep-3004", + "environmentId": "env-dev", + "version": "1.5.2", + "deploymentDate": "2026-09-15T11:00:00Z", + "releaseNotes": "بهبود عملکرد", + "status": "active", + "requiredDeployments": [ + { + "projectId": "proj-2001", + "deploymentId": "dep-3001" + } + ] + } + ] + }, + { + "id": "proj-2003", + "title": "پایگاه داده مشتریان", + "type": "database", + "description": "ذخیره اطلاعات مشتریان", + "repositoryUrl": "https://git.example.com/customer-db", + "metadata": { + "createdAt": "2026-01-25T10:00:00Z", + "framework": "PostgreSQL", + "language": "SQL" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3005", + "environmentId": "env-prod", + "version": "3.0.0", + "deploymentDate": "2026-08-01T08:00:00Z", + "releaseNotes": "نسخه پایدار", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2004", + "title": "اپلیکیشن موبایل", + "type": "mobile", + "description": "نسخه موبایل بانکداری", + "repositoryUrl": "https://git.example.com/mobile-app", + "metadata": { + "createdAt": "2026-02-01T10:00:00Z", + "owner": "مریم حسینی", + "framework": "Flutter", + "language": "Dart" + }, + "dependencies": ["proj-2001", "proj-2002"], + "deployments": [] + } + ] + }, + { + "id": "prod-1002", + "title": "فروشگاه آنلاین", + "description": "پلتفرم تجارت الکترونیک", + "metadata": { + "createdAt": "2026-02-10T10:00:00Z", + "owner": "حسن رضایی" + }, + "projects": [ + { + "id": "proj-2005", + "title": "وب‌سایت فرانت‌اند", + "type": "frontend", + "description": "رابط کاربری فروشگاه", + "repositoryUrl": "https://git.example.com/shop-frontend", + "metadata": { + "createdAt": "2026-02-10T10:00:00Z", + "owner": "زهرا موسوی", + "framework": "Angular 17", + "language": "TypeScript" + }, + "dependencies": ["proj-2006"], + "deployments": [ + { + "id": "dep-3006", + "environmentId": "env-prod", + "version": "4.2.1", + "deploymentDate": "2026-09-20T08:00:00Z", + "releaseNotes": "بهبود UX", + "status": "active", + "requiredDeployments": [] + }, + { + "id": "dep-3007", + "environmentId": "env-prod", + "version": "4.2.0", + "deploymentDate": "2026-09-05T08:00:00Z", + "releaseNotes": "نسخه قبلی", + "status": "archived", + "archivedAt": "2026-09-20T09:00:00Z", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2006", + "title": "سرویس سفارشات", + "type": "backend", + "description": "مدیریت سفارشات و پرداخت", + "repositoryUrl": "https://git.example.com/order-service", + "metadata": { + "createdAt": "2026-02-15T10:00:00Z", + "owner": "امیر تقوی", + "framework": "Node.js", + "language": "JavaScript" + }, + "dependencies": ["proj-2007"], + "deployments": [ + { + "id": "dep-3008", + "environmentId": "env-dev", + "version": "2.3.0", + "deploymentDate": "2026-09-17T14:00:00Z", + "releaseNotes": "افزودن درگاه پرداخت جدید", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2007", + "title": "پایگاه داده محصولات", + "type": "database", + "description": "کاتالوگ محصولات", + "repositoryUrl": "https://git.example.com/product-db", + "metadata": { + "createdAt": "2026-02-20T10:00:00Z", + "framework": "MongoDB", + "language": "JavaScript" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3009", + "environmentId": "env-prod", + "version": "1.8.0", + "deploymentDate": "2026-07-15T10:00:00Z", + "releaseNotes": "بهینه‌سازی کوئری‌ها", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2008", + "title": "سرویس اطلاع‌رسانی", + "type": "service", + "description": "ارسال ایمیل و SMS", + "repositoryUrl": "https://git.example.com/notification-service", + "metadata": { + "createdAt": "2026-02-25T10:00:00Z", + "owner": "فاطمه نوری", + "framework": "Python", + "language": "Python" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3010", + "environmentId": "env-staging", + "version": "1.2.0", + "deploymentDate": "2026-09-16T16:00:00Z", + "releaseNotes": "پشتیبانی از WhatsApp", + "status": "active", + "requiredDeployments": [] + } + ] + } + ] + }, + { + "id": "prod-1003", + "title": "سامانه مدیریت منابع انسانی", + "description": "HRMS جامع", + "metadata": { + "createdAt": "2026-03-01T10:00:00Z", + "owner": "محمد جعفری" + }, + "projects": [ + { + "id": "proj-2009", + "title": "ماژول حضور و غیاب", + "type": "backend", + "description": "ثبت و مدیریت حضور", + "repositoryUrl": "https://git.example.com/attendance", + "metadata": { + "createdAt": "2026-03-01T10:00:00Z", + "owner": "نرگس صادقی", + "framework": ".NET 7", + "language": "C#" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3011", + "environmentId": "env-prod", + "version": "3.1.0", + "deploymentDate": "2026-06-20T09:00:00Z", + "releaseNotes": "نسخه پایدار", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2010", + "title": "ماژول حقوق و دستمزد", + "type": "backend", + "description": "محاسبه حقوق", + "repositoryUrl": "https://git.example.com/payroll", + "metadata": { + "createdAt": "2026-03-05T10:00:00Z", + "owner": "کامران رحیمی", + "framework": ".NET 7", + "language": "C#" + }, + "dependencies": ["proj-2009"], + "deployments": [ + { + "id": "dep-3012", + "environmentId": "env-dev", + "version": "2.0.0-beta", + "deploymentDate": "2026-09-19T11:00:00Z", + "releaseNotes": "نسخه آزمایشی", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2011", + "title": "پورتال کارکنان", + "type": "frontend", + "description": "رابط کاربری کارکنان", + "repositoryUrl": "https://git.example.com/employee-portal", + "metadata": { + "createdAt": "2026-03-10T10:00:00Z", + "owner": "لیلا عباسی", + "framework": "React", + "language": "TypeScript" + }, + "dependencies": ["proj-2009", "proj-2010"], + "deployments": [] + }, + { + "id": "proj-2012", + "title": "زیرساخت سرور", + "type": "infrastructure", + "description": "پیکربندی سرورها", + "repositoryUrl": "https://git.example.com/infra", + "metadata": { + "createdAt": "2026-03-15T10:00:00Z", + "framework": "Terraform", + "language": "HCL" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3013", + "environmentId": "env-prod", + "version": "1.0.0", + "deploymentDate": "2026-05-01T08:00:00Z", + "releaseNotes": "راه‌اندازی اولیه", + "status": "active", + "requiredDeployments": [] + } + ] + } + ] + }, + { + "id": "prod-1004", + "title": "سامانه مدیریت پروژه", + "description": "Project Management Tool", + "metadata": { + "createdAt": "2026-03-20T10:00:00Z", + "owner": "رضا کاظمی" + }, + "projects": [ + { + "id": "proj-2013", + "title": "API اصلی", + "type": "backend", + "description": "Backend اصلی", + "repositoryUrl": "https://git.example.com/pm-api", + "metadata": { + "createdAt": "2026-03-20T10:00:00Z", + "owner": "مهدی یوسفی", + "framework": "Go", + "language": "Go" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3014", + "environmentId": "env-dev", + "version": "1.4.0", + "deploymentDate": "2026-09-18T10:00:00Z", + "releaseNotes": "افزودن WebSocket", + "status": "active", + "requiredDeployments": [] + }, + { + "id": "dep-3015", + "environmentId": "env-dev", + "version": "1.3.5", + "deploymentDate": "2026-09-12T10:00:00Z", + "releaseNotes": "رفع باگ", + "status": "archived", + "archivedAt": "2026-09-18T11:00:00Z", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2014", + "title": "وب‌اپلیکیشن", + "type": "frontend", + "description": "Frontend اصلی", + "repositoryUrl": "https://git.example.com/pm-web", + "metadata": { + "createdAt": "2026-03-25T10:00:00Z", + "owner": "شیما توکلی", + "framework": "Vue.js", + "language": "TypeScript" + }, + "dependencies": ["proj-2013"], + "deployments": [ + { + "id": "dep-3016", + "environmentId": "env-staging", + "version": "2.1.0", + "deploymentDate": "2026-09-19T15:00:00Z", + "releaseNotes": "بهبود عملکرد", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2015", + "title": "اپلیکیشن موبایل", + "type": "mobile", + "description": "نسخه موبایل", + "repositoryUrl": "https://git.example.com/pm-mobile", + "metadata": { + "createdAt": "2026-04-01T10:00:00Z", + "owner": "پویا مرادی", + "framework": "React Native", + "language": "JavaScript" + }, + "dependencies": ["proj-2013"], + "deployments": [] + }, + { + "id": "proj-2016", + "title": "پایگاه داده", + "type": "database", + "description": "ذخیره داده‌ها", + "repositoryUrl": "https://git.example.com/pm-db", + "metadata": { + "createdAt": "2026-04-05T10:00:00Z", + "framework": "MySQL", + "language": "SQL" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3017", + "environmentId": "env-prod", + "version": "2.0.0", + "deploymentDate": "2026-08-10T08:00:00Z", + "releaseNotes": "Migration به MySQL 8", + "status": "active", + "requiredDeployments": [] + } + ] + } + ] + }, + { + "id": "prod-1005", + "title": "سامانه مدیریت محتوا", + "description": "CMS سازمانی", + "metadata": { + "createdAt": "2026-04-10T10:00:00Z" + }, + "projects": [ + { + "id": "proj-2017", + "title": "Engine اصلی", + "type": "backend", + "description": "هسته CMS", + "repositoryUrl": "https://git.example.com/cms-engine", + "metadata": { + "createdAt": "2026-04-10T10:00:00Z", + "owner": "آرش نیکزاد", + "framework": "Django", + "language": "Python" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3018", + "environmentId": "env-prod", + "version": "5.0.0", + "deploymentDate": "2026-07-01T09:00:00Z", + "releaseNotes": "نسخه_MAJOR", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2018", + "title": "پنل مدیریت", + "type": "frontend", + "description": "رابط ادمین", + "repositoryUrl": "https://git.example.com/cms-admin", + "metadata": { + "createdAt": "2026-04-15T10:00:00Z", + "owner": "نگار صالحی", + "framework": "Angular 16", + "language": "TypeScript" + }, + "dependencies": ["proj-2017"], + "deployments": [ + { + "id": "dep-3019", + "environmentId": "env-dev", + "version": "3.2.1", + "deploymentDate": "2026-09-17T13:00:00Z", + "releaseNotes": "بهبود UI", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2019", + "title": "سرویس مدیا", + "type": "service", + "description": "مدیریت فایل‌ها", + "repositoryUrl": "https://git.example.com/cms-media", + "metadata": { + "createdAt": "2026-04-20T10:00:00Z", + "framework": "Node.js", + "language": "JavaScript" + }, + "dependencies": [], + "deployments": [] + }, + { + "id": "proj-2020", + "title": "پایگاه داده محتوا", + "type": "database", + "description": "ذخیره محتوا", + "repositoryUrl": "https://git.example.com/cms-db", + "metadata": { + "createdAt": "2026-04-25T10:00:00Z", + "framework": "Elasticsearch", + "language": "JSON" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3020", + "environmentId": "env-prod", + "version": "1.5.0", + "deploymentDate": "2026-06-15T10:00:00Z", + "releaseNotes": "بهینه‌سازی جستجو", + "status": "active", + "requiredDeployments": [] + } + ] + } + ] + }, + { + "id": "prod-1006", + "title": "سامانه تحلیل داده", + "description": "Data Analytics Platform", + "metadata": { + "createdAt": "2026-05-01T10:00:00Z", + "owner": "سعید امینی" + }, + "projects": [ + { + "id": "proj-2021", + "title": "Data Pipeline", + "type": "backend", + "description": "پردازش داده‌ها - سرویس مرکزی ETL برای کل سازمان", + "repositoryUrl": "https://git.example.com/data-pipeline", + "metadata": { + "createdAt": "2026-05-01T10:00:00Z", + "owner": "مینا قاسمی", + "framework": "Apache Spark", + "language": "Scala" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3021", + "environmentId": "env-prod", + "version": "2.4.0", + "deploymentDate": "2026-08-20T08:00:00Z", + "releaseNotes": "پشتیبانی از Real-time", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2022", + "title": "داشبورد تحلیل", + "type": "frontend", + "description": "نمایش گزارش‌ها - با یکپارچگی داده‌های CMS", + "repositoryUrl": "https://git.example.com/analytics-dashboard", + "metadata": { + "createdAt": "2026-05-05T10:00:00Z", + "owner": "حمید باقری", + "framework": "React", + "language": "TypeScript" + }, + "dependencies": ["proj-2021", "proj-2017"], + "deployments": [ + { + "id": "dep-3022", + "environmentId": "env-staging", + "version": "1.8.0", + "deploymentDate": "2026-09-18T16:00:00Z", + "releaseNotes": "افزودن نمودارهای جدید", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2023", + "title": "Data Warehouse", + "type": "database", + "description": "انبار داده", + "repositoryUrl": "https://git.example.com/data-warehouse", + "metadata": { + "createdAt": "2026-05-10T10:00:00Z", + "framework": "Snowflake", + "language": "SQL" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3023", + "environmentId": "env-prod", + "version": "3.0.0", + "deploymentDate": "2026-07-10T09:00:00Z", + "releaseNotes": "Migration کامل", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2024", + "title": "سرویس ML", + "type": "service", + "description": "مدل‌های یادگیری ماشین", + "repositoryUrl": "https://git.example.com/ml-service", + "metadata": { + "createdAt": "2026-05-15T10:00:00Z", + "owner": "الهام شریفی", + "framework": "TensorFlow", + "language": "Python" + }, + "dependencies": ["proj-2021"], + "deployments": [] + } + ] + }, + { + "id": "prod-1007", + "title": "سامانه پیام‌رسان", + "description": "Messaging Platform", + "metadata": { + "createdAt": "2026-05-20T10:00:00Z", + "owner": "جواد ملکی" + }, + "projects": [ + { + "id": "proj-2025", + "title": "Message Broker", + "type": "backend", + "description": "صف پیام", + "repositoryUrl": "https://git.example.com/message-broker", + "metadata": { + "createdAt": "2026-05-20T10:00:00Z", + "owner": "فرزاد حیدری", + "framework": "RabbitMQ", + "language": "Erlang" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3024", + "environmentId": "env-prod", + "version": "4.1.0", + "deploymentDate": "2026-08-05T10:00:00Z", + "releaseNotes": "بهبود throughput", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2026", + "title": "وب‌چت", + "type": "frontend", + "description": "رابط کاربری چت", + "repositoryUrl": "https://git.example.com/webchat", + "metadata": { + "createdAt": "2026-05-25T10:00:00Z", + "owner": "نازنین کمالی", + "framework": "Svelte", + "language": "TypeScript" + }, + "dependencies": ["proj-2025"], + "deployments": [ + { + "id": "dep-3025", + "environmentId": "env-dev", + "version": "2.0.0", + "deploymentDate": "2026-09-19T10:00:00Z", + "releaseNotes": "نسخه جدید با Video Call", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2027", + "title": "اپلیکیشن موبایل", + "type": "mobile", + "description": "نسخه موبایل", + "repositoryUrl": "https://git.example.com/chat-mobile", + "metadata": { + "createdAt": "2026-06-01T10:00:00Z", + "owner": "بهار احمدی", + "framework": "Kotlin", + "language": "Kotlin" + }, + "dependencies": ["proj-2025"], + "deployments": [] + }, + { + "id": "proj-2028", + "title": "سرویس نوتیفیکیشن", + "type": "service", + "description": "ارسال اعلان", + "repositoryUrl": "https://git.example.com/notification", + "metadata": { + "createdAt": "2026-06-05T10:00:00Z", + "framework": "Node.js", + "language": "JavaScript" + }, + "dependencies": ["proj-2025"], + "deployments": [ + { + "id": "dep-3026", + "environmentId": "env-staging", + "version": "1.3.0", + "deploymentDate": "2026-09-16T14:00:00Z", + "releaseNotes": "پشتیبانی از Push", + "status": "active", + "requiredDeployments": [] + } + ] + } + ] + }, + { + "id": "prod-1008", + "title": "سامانه مدیریت ارتباط با مشتری", + "description": "CRM System - با یکپارچگی به سرویس احراز هویت مرکزی", + "metadata": { + "createdAt": "2026-06-10T10:00:00Z", + "owner": "مهرداد سلطانی" + }, + "projects": [ + { + "id": "proj-2029", + "title": "CRM Core", + "type": "backend", + "description": "هسته CRM - وابسته به سرویس احراز هویت مرکزی بانکداری", + "repositoryUrl": "https://git.example.com/crm-core", + "metadata": { + "createdAt": "2026-06-10T10:00:00Z", + "owner": "شیرین پناهی", + "framework": ".NET 8", + "language": "C#" + }, + "dependencies": ["proj-2002"], + "deployments": [ + { + "id": "dep-3027", + "environmentId": "env-prod", + "version": "6.0.0", + "deploymentDate": "2026-07-20T09:00:00Z", + "releaseNotes": "نسخه_MAJOR", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2030", + "title": "پورتال فروش", + "type": "frontend", + "description": "رابط تیم فروش - یکپارچه با وب‌سایت فروشگاه", + "repositoryUrl": "https://git.example.com/crm-sales", + "metadata": { + "createdAt": "2026-06-15T10:00:00Z", + "owner": "کوروش رستمی", + "framework": "Blazor", + "language": "C#" + }, + "dependencies": ["proj-2029", "proj-2005"], + "deployments": [ + { + "id": "dep-3028", + "environmentId": "env-dev", + "version": "3.5.0", + "deploymentDate": "2026-09-18T11:00:00Z", + "releaseNotes": "افزودن گزارش‌های جدید", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2031", + "title": "پایگاه داده مشتریان", + "type": "database", + "description": "اطلاعات مشتریان", + "repositoryUrl": "https://git.example.com/crm-db", + "metadata": { + "createdAt": "2026-06-20T10:00:00Z", + "framework": "SQL Server", + "language": "SQL" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3029", + "environmentId": "env-prod", + "version": "2.2.0", + "deploymentDate": "2026-08-15T08:00:00Z", + "releaseNotes": "بهینه‌سازی ایندکس‌ها", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2032", + "title": "سرویس ایمیل", + "type": "service", + "description": "ارسال ایمیل مارکتینگ", + "repositoryUrl": "https://git.example.com/crm-email", + "metadata": { + "createdAt": "2026-06-25T10:00:00Z", + "owner": "ترانه موسوی", + "framework": "Python", + "language": "Python" + }, + "dependencies": ["proj-2029"], + "deployments": [] + } + ] + }, + { + "id": "prod-1009", + "title": "سامانه مدیریت انبار", + "description": "Warehouse Management", + "metadata": { + "createdAt": "2026-07-01T10:00:00Z", + "owner": "یحیی نوری" + }, + "projects": [ + { + "id": "proj-2033", + "title": "WMS Backend", + "type": "backend", + "description": "منطق انبار - سرویس مرکزی مدیریت انبار", + "repositoryUrl": "https://git.example.com/wms-backend", + "metadata": { + "createdAt": "2026-07-01T10:00:00Z", + "owner": "پریسا فتحی", + "framework": "Java", + "language": "Java" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3030", + "environmentId": "env-prod", + "version": "4.3.0", + "deploymentDate": "2026-08-25T10:00:00Z", + "releaseNotes": "پشتیبانی از Barcode", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2034", + "title": "اپلیکیشن انباردار", + "type": "mobile", + "description": "اسکنر موبایل", + "repositoryUrl": "https://git.example.com/wms-mobile", + "metadata": { + "createdAt": "2026-07-05T10:00:00Z", + "owner": "سینا قاسمی", + "framework": "Flutter", + "language": "Dart" + }, + "dependencies": ["proj-2033"], + "deployments": [ + { + "id": "dep-3031", + "environmentId": "env-staging", + "version": "2.1.0", + "deploymentDate": "2026-09-17T15:00:00Z", + "releaseNotes": "بهبود اسکن", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2035", + "title": "پایگاه داده انبار", + "type": "database", + "description": "موجودی و کالا", + "repositoryUrl": "https://git.example.com/wms-db", + "metadata": { + "createdAt": "2026-07-10T10:00:00Z", + "framework": "Oracle", + "language": "SQL" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3032", + "environmentId": "env-prod", + "version": "3.1.0", + "deploymentDate": "2026-07-30T09:00:00Z", + "releaseNotes": "Partitioning جداول", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2036", + "title": "سرویس گزارش‌گیری", + "type": "service", + "description": "گزارش‌های انبار", + "repositoryUrl": "https://git.example.com/wms-report", + "metadata": { + "createdAt": "2026-07-15T10:00:00Z", + "framework": "Node.js", + "language": "JavaScript" + }, + "dependencies": ["proj-2033"], + "deployments": [] + } + ] + }, + { + "id": "prod-1010", + "title": "سامانه مدیریت مالی", + "description": "Financial Management", + "metadata": { + "createdAt": "2026-07-20T10:00:00Z", + "owner": "بهزاد طاهری" + }, + "projects": [ + { + "id": "proj-2037", + "title": "حسابداری", + "type": "backend", + "description": "ماژول حسابداری", + "repositoryUrl": "https://git.example.com/accounting", + "metadata": { + "createdAt": "2026-07-20T10:00:00Z", + "owner": "مونا کریمی", + "framework": ".NET 8", + "language": "C#" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3033", + "environmentId": "env-prod", + "version": "5.2.0", + "deploymentDate": "2026-08-30T08:00:00Z", + "releaseNotes": "پشتیبانی از مالیات جدید", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2038", + "title": "پورتال مالی", + "type": "frontend", + "description": "رابط کاربری مالی", + "repositoryUrl": "https://git.example.com/finance-portal", + "metadata": { + "createdAt": "2026-07-25T10:00:00Z", + "owner": "رامین جعفری", + "framework": "Angular 17", + "language": "TypeScript" + }, + "dependencies": ["proj-2037"], + "deployments": [ + { + "id": "dep-3034", + "environmentId": "env-dev", + "version": "3.0.0", + "deploymentDate": "2026-09-19T09:00:00Z", + "releaseNotes": "نسخه جدید", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2039", + "title": "پایگاه داده مالی", + "type": "database", + "description": "تراکنش‌ها", + "repositoryUrl": "https://git.example.com/finance-db", + "metadata": { + "createdAt": "2026-07-30T10:00:00Z", + "framework": "PostgreSQL", + "language": "SQL" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3035", + "environmentId": "env-prod", + "version": "4.0.0", + "deploymentDate": "2026-08-10T10:00:00Z", + "releaseNotes": "Archive داده‌های قدیمی", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2040", + "title": "سرویس گزارش مالی", + "type": "service", + "description": "گزارش‌های مالی - با استفاده از Data Pipeline مرکزی", + "repositoryUrl": "https://git.example.com/finance-report", + "metadata": { + "createdAt": "2026-08-01T10:00:00Z", + "owner": "گلناز حسینی", + "framework": "Python", + "language": "Python" + }, + "dependencies": ["proj-2037", "proj-2021"], + "deployments": [] + } + ] + }, + { + "id": "prod-1011", + "title": "سامانه مدیریت زنجیره تأمین", + "description": "Supply Chain Management", + "metadata": { + "createdAt": "2026-08-05T10:00:00Z", + "owner": "فرهاد محمدی" + }, + "projects": [ + { + "id": "proj-2041", + "title": "SCM Core", + "type": "backend", + "description": "هسته SCM", + "repositoryUrl": "https://git.example.com/scm-core", + "metadata": { + "createdAt": "2026-08-05T10:00:00Z", + "owner": "آتنا رضایی", + "framework": "Spring Boot", + "language": "Java" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3036", + "environmentId": "env-prod", + "version": "3.4.0", + "deploymentDate": "2026-09-01T09:00:00Z", + "releaseNotes": "بهینه‌سازی الگوریتم", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2042", + "title": "پورتال تأمین‌کنندگان", + "type": "frontend", + "description": "رابط تأمین‌کنندگان", + "repositoryUrl": "https://git.example.com/scm-supplier", + "metadata": { + "createdAt": "2026-08-10T10:00:00Z", + "owner": "کیوان احمدی", + "framework": "React", + "language": "TypeScript" + }, + "dependencies": ["proj-2041"], + "deployments": [ + { + "id": "dep-3037", + "environmentId": "env-staging", + "version": "2.2.0", + "deploymentDate": "2026-09-18T14:00:00Z", + "releaseNotes": "بهبود UX", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2043", + "title": "پایگاه داده SCM", + "type": "database", + "description": "داده‌های زنجیره", + "repositoryUrl": "https://git.example.com/scm-db", + "metadata": { + "createdAt": "2026-08-15T10:00:00Z", + "framework": "MongoDB", + "language": "JavaScript" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3038", + "environmentId": "env-prod", + "version": "2.5.0", + "deploymentDate": "2026-08-20T10:00:00Z", + "releaseNotes": "Sharding", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2044", + "title": "سرویس لجستیک", + "type": "service", + "description": "مدیریت حمل‌ونقل - وابسته به WMS Backend", + "repositoryUrl": "https://git.example.com/scm-logistics", + "metadata": { + "createdAt": "2026-08-20T10:00:00Z", + "owner": "سپهر نوری", + "framework": "Node.js", + "language": "JavaScript" + }, + "dependencies": ["proj-2041", "proj-2033"], + "deployments": [] + } + ] + }, + { + "id": "prod-1012", + "title": "سامانه مدیریت آموزش", + "description": "Learning Management System", + "metadata": { + "createdAt": "2026-08-25T10:00:00Z", + "owner": "نگار صادقی" + }, + "projects": [ + { + "id": "proj-2045", + "title": "LMS Backend", + "type": "backend", + "description": "هسته LMS", + "repositoryUrl": "https://git.example.com/lms-backend", + "metadata": { + "createdAt": "2026-08-25T10:00:00Z", + "owner": "میلاد تقوی", + "framework": "Django", + "language": "Python" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3039", + "environmentId": "env-prod", + "version": "4.1.0", + "deploymentDate": "2026-09-05T10:00:00Z", + "releaseNotes": "افزودن Video Streaming", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2046", + "title": "پورتال دانشجویان", + "type": "frontend", + "description": "رابط دانشجویان", + "repositoryUrl": "https://git.example.com/lms-student", + "metadata": { + "createdAt": "2026-08-30T10:00:00Z", + "owner": "یاسمن کریمی", + "framework": "Vue.js", + "language": "TypeScript" + }, + "dependencies": ["proj-2045"], + "deployments": [ + { + "id": "dep-3040", + "environmentId": "env-dev", + "version": "2.3.0", + "deploymentDate": "2026-09-19T11:00:00Z", + "releaseNotes": "بهبود تجربه کاربری", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2047", + "title": "پایگاه داده دوره‌ها", + "type": "database", + "description": "محتوای آموزشی", + "repositoryUrl": "https://git.example.com/lms-db", + "metadata": { + "createdAt": "2026-09-01T10:00:00Z", + "framework": "PostgreSQL", + "language": "SQL" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3041", + "environmentId": "env-prod", + "version": "3.0.0", + "deploymentDate": "2026-08-25T09:00:00Z", + "releaseNotes": "ساختار جدید", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2048", + "title": "سرویس آزمون", + "type": "service", + "description": "مدیریت آزمون‌ها", + "repositoryUrl": "https://git.example.com/lms-exam", + "metadata": { + "createdAt": "2026-09-05T10:00:00Z", + "owner": "حامد رضایی", + "framework": "Node.js", + "language": "JavaScript" + }, + "dependencies": ["proj-2045"], + "deployments": [] + } + ] + }, + { + "id": "prod-1013", + "title": "سامانه مدیریت بیمارستان", + "description": "Hospital Management System - با احراز هویت متمرکز", + "metadata": { + "createdAt": "2026-09-01T10:00:00Z", + "owner": "دکتر محمدی" + }, + "projects": [ + { + "id": "proj-2049", + "title": "HIS Core", + "type": "backend", + "description": "هسته HIS", + "repositoryUrl": "https://git.example.com/his-core", + "metadata": { + "createdAt": "2026-09-01T10:00:00Z", + "owner": "دکتر احمدی", + "framework": ".NET 8", + "language": "C#" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3042", + "environmentId": "env-prod", + "version": "5.0.0", + "deploymentDate": "2026-09-10T08:00:00Z", + "releaseNotes": "نسخه_MAJOR", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2050", + "title": "پورتال پزشکان", + "type": "frontend", + "description": "رابط پزشکان - با احراز هویت از سرویس مرکزی بانکداری", + "repositoryUrl": "https://git.example.com/his-doctor", + "metadata": { + "createdAt": "2026-09-05T10:00:00Z", + "owner": "دکتر کریمی", + "framework": "Angular 17", + "language": "TypeScript" + }, + "dependencies": ["proj-2049", "proj-2002"], + "deployments": [ + { + "id": "dep-3043", + "environmentId": "env-staging", + "version": "3.1.0", + "deploymentDate": "2026-09-18T10:00:00Z", + "releaseNotes": "افزودن نسخه الکترونیک", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2051", + "title": "پایگاه داده بیماران", + "type": "database", + "description": "اطلاعات بیماران", + "repositoryUrl": "https://git.example.com/his-db", + "metadata": { + "createdAt": "2026-09-10T10:00:00Z", + "framework": "Oracle", + "language": "SQL" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3044", + "environmentId": "env-prod", + "version": "4.2.0", + "deploymentDate": "2026-09-01T09:00:00Z", + "releaseNotes": "رمزنگاری داده‌ها", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2052", + "title": "سرویس نوبت‌دهی", + "type": "service", + "description": "مدیریت نوبت‌ها", + "repositoryUrl": "https://git.example.com/his-appointment", + "metadata": { + "createdAt": "2026-09-15T10:00:00Z", + "owner": "دکتر رضایی", + "framework": "Python", + "language": "Python" + }, + "dependencies": ["proj-2049"], + "deployments": [] + } + ] + }, + { + "id": "prod-1014", + "title": "سامانه مدیریت حمل‌ونقل", + "description": "Transportation Management", + "metadata": { + "createdAt": "2026-09-10T10:00:00Z", + "owner": "مهندس موسوی" + }, + "projects": [ + { + "id": "proj-2053", + "title": "TMS Backend", + "type": "backend", + "description": "هسته TMS", + "repositoryUrl": "https://git.example.com/tms-backend", + "metadata": { + "createdAt": "2026-09-10T10:00:00Z", + "owner": "مهندس تقوی", + "framework": "Go", + "language": "Go" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3045", + "environmentId": "env-prod", + "version": "2.0.0", + "deploymentDate": "2026-09-15T10:00:00Z", + "releaseNotes": "نسخه اولیه", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2054", + "title": "اپلیکیشن رانندگان", + "type": "mobile", + "description": "نسخه موبایل رانندگان", + "repositoryUrl": "https://git.example.com/tms-driver", + "metadata": { + "createdAt": "2026-09-12T10:00:00Z", + "owner": "مهندس نوری", + "framework": "Flutter", + "language": "Dart" + }, + "dependencies": ["proj-2053"], + "deployments": [ + { + "id": "dep-3046", + "environmentId": "env-dev", + "version": "1.2.0", + "deploymentDate": "2026-09-19T14:00:00Z", + "releaseNotes": "GPS Tracking", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2055", + "title": "پایگاه داده حمل‌ونقل", + "type": "database", + "description": "داده‌های لجستیک", + "repositoryUrl": "https://git.example.com/tms-db", + "metadata": { + "createdAt": "2026-09-15T10:00:00Z", + "framework": "PostgreSQL", + "language": "SQL" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3047", + "environmentId": "env-prod", + "version": "1.5.0", + "deploymentDate": "2026-09-12T09:00:00Z", + "releaseNotes": "بهینه‌سازی", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2056", + "title": "سرویس مسیریابی", + "type": "service", + "description": "محاسبه مسیر", + "repositoryUrl": "https://git.example.com/tms-routing", + "metadata": { + "createdAt": "2026-09-18T10:00:00Z", + "owner": "مهندس جعفری", + "framework": "Python", + "language": "Python" + }, + "dependencies": ["proj-2053"], + "deployments": [] + } + ] + }, + { + "id": "prod-1015", + "title": "سامانه مدیریت انرژی", + "description": "Energy Management System", + "metadata": { + "createdAt": "2026-09-15T10:00:00Z", + "owner": "مهندس کاظمی" + }, + "projects": [ + { + "id": "proj-2057", + "title": "EMS Backend", + "type": "backend", + "description": "هسته EMS", + "repositoryUrl": "https://git.example.com/ems-backend", + "metadata": { + "createdAt": "2026-09-15T10:00:00Z", + "owner": "مهندس یوسفی", + "framework": "Java", + "language": "Java" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3048", + "environmentId": "env-prod", + "version": "1.0.0", + "deploymentDate": "2026-09-18T08:00:00Z", + "releaseNotes": "نسخه اولیه", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2058", + "title": "داشبورد مانیتورینگ", + "type": "frontend", + "description": "نمایش مصرف انرژی", + "repositoryUrl": "https://git.example.com/ems-dashboard", + "metadata": { + "createdAt": "2026-09-16T10:00:00Z", + "owner": "مهندس توکلی", + "framework": "React", + "language": "TypeScript" + }, + "dependencies": ["proj-2057"], + "deployments": [ + { + "id": "dep-3049", + "environmentId": "env-staging", + "version": "1.1.0", + "deploymentDate": "2026-09-19T16:00:00Z", + "releaseNotes": "Real-time monitoring", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2059", + "title": "پایگاه داده سنسورها", + "type": "database", + "description": "داده‌های IoT", + "repositoryUrl": "https://git.example.com/ems-db", + "metadata": { + "createdAt": "2026-09-17T10:00:00Z", + "framework": "InfluxDB", + "language": "Flux" + }, + "dependencies": [], + "deployments": [ + { + "id": "dep-3050", + "environmentId": "env-prod", + "version": "1.0.0", + "deploymentDate": "2026-09-17T09:00:00Z", + "releaseNotes": "راه‌اندازی اولیه", + "status": "active", + "requiredDeployments": [] + } + ] + }, + { + "id": "proj-2060", + "title": "سرویس تحلیل مصرف", + "type": "service", + "description": "تحلیل الگوهای مصرف", + "repositoryUrl": "https://git.example.com/ems-analytics", + "metadata": { + "createdAt": "2026-09-18T10:00:00Z", + "owner": "مهندس مرادی", + "framework": "Python", + "language": "Python" + }, + "dependencies": ["proj-2057"], + "deployments": [] + } + ] + } + ], + "boards": [], + "boardTags": [] +} \ No newline at end of file diff --git a/Samples/xReleaseAssistant_Real_4.json b/Samples/xReleaseAssistant_Real_4.json new file mode 100644 index 0000000..53f88e9 --- /dev/null +++ b/Samples/xReleaseAssistant_Real_4.json @@ -0,0 +1,226 @@ +{ + "environments": [ + { + "id": "env-1789757606914", + "name": "کاوش - توسعه", + "description": "این محیط فقط برای تست عملیاتی توسعه دهندگان است", + "backgroundColor": "#3f94ee", + "textColor": "#ffffff" + }, + { + "id": "env-1789757658261", + "name": "کاوش تست", + "description": "این محیط برای تست محصول توسط تیم های تضمین کیفیت و تحلیل است", + "backgroundColor": "#df3416", + "textColor": "#ffffff" + }, + { + "id": "env-1789757730121", + "name": "کانون - قرمز", + "description": "محیطی برای تست محصولات در فضای کانون", + "backgroundColor": "#ff0000", + "textColor": "#ffffff" + }, + { + "id": "env-1789757791901", + "name": "کانون - آبی", + "description": "محیط انتشار عمومی محصولات در کانون", + "backgroundColor": "#0000ff", + "textColor": "#ffffff" + }, + { + "id": "env-1789757853333", + "name": "سازمان - قرمز", + "description": "محیطی برای تست محصولات در سازمان", + "backgroundColor": "#ff0000", + "textColor": "#ffffff" + }, + { + "id": "env-1789757900213", + "name": "سازمان - آبی", + "description": "محیط انتشار عمومی محصولات در سازمان", + "backgroundColor": "#0000ff", + "textColor": "#ffffff" + } + ], + "products": [ + { + "id": "prod-1789906178306", + "title": "زیرساخت", + "description": "کلیه پروژه هایی که بعنوان زیرساخت برای سایر محصولات شرکت مورد استفاده قرار می گیرند ...", + "metadata": { + "createdAt": "2026-09-20T12:09:38.306Z", + "owner": "تیم آتنا", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789906450942", + "title": "کنترل سنتر", + "description": "مدیریت تنظیمات و ارائه اطلاعات پایه برای پروژه های مختلف ...", + "metadata": { + "createdAt": "2026-09-20T12:14:10.942Z", + "owner": "تیم آتنا", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789906580440", + "title": "مانا", + "description": "مدیریت ارجاع نقشه برداران ایران", + "metadata": { + "createdAt": "2026-09-20T12:16:20.440Z", + "owner": "تیم کاداستر", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789906612889", + "title": "مدام", + "description": "مدیریت داده های مکانی", + "metadata": { + "createdAt": "2026-09-20T12:16:52.889Z", + "owner": "تیم کاداستر", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789906649432", + "title": "مدیریت قرارداد ها", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:17:29.432Z", + "owner": "تیم کاداستر", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907070679", + "title": "پیام رسان", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:24:30.679Z", + "owner": "تیم کاداستر", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907660064", + "title": "تفکیک آپارتمانی - کاداستر", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:34:20.064Z", + "owner": "تیم کاداستر", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907676416", + "title": "ابزار WebGIS", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:34:36.416Z", + "owner": "تیم کاداستر", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907707481", + "title": "سرویس های املاک", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:35:07.481Z", + "owner": "تیم کاداستر", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907737585", + "title": "ساماندهی", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:35:37.585Z", + "owner": "تیم املاک", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907760114", + "title": "تعیین تکلیف", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:36:00.114Z", + "owner": "تیم املاک", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907772450", + "title": "دفترچه ای", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:36:12.450Z", + "owner": "تیم املاک", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907792986", + "title": "تفکیک آپارتمانی", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:36:32.986Z", + "owner": "تیم املاک", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907850075", + "title": "ثبت اطلاعات سامانه املاک", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:37:30.075Z", + "owner": "تیم املاک", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907867139", + "title": "املاک من", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:37:47.139Z", + "owner": "تیم املاک", + "customFields": {} + }, + "projects": [] + }, + { + "id": "prod-1789907887203", + "title": "شروع از کارگزاری", + "description": "", + "metadata": { + "createdAt": "2026-09-20T12:38:07.203Z", + "owner": "تیم املاک", + "customFields": {} + }, + "projects": [] + } + ], + "boards": [], + "boardTags": [] +} \ No newline at end of file diff --git a/xReleaseAssistant.html b/xReleaseAssistant.html index b70c5c0..183e697 100644 --- a/xReleaseAssistant.html +++ b/xReleaseAssistant.html @@ -3017,6 +3017,12 @@ +
+ 👤 + +
@@ -3296,32 +3302,38 @@
@@ -3505,8 +3524,8 @@
@@ -3524,8 +3543,8 @@
@@ -3543,8 +3562,8 @@
@@ -3581,8 +3600,8 @@
@@ -4283,9 +4302,10 @@ }; /* ==================== TOOLBAR MANAGER ==================== */ const ToolbarManager = { - currentFilters: { query: "", typeFilter: "", envFilter: "" }, + currentFilters: { query: "", typeFilter: "", envFilter: "", ownerFilter: "" }, init() { this.populateEnvironmentFilter(); + this.populateOwnerFilter(); this.bindEvents(); this.updateStats(); }, @@ -4298,10 +4318,28 @@ .map((e) => ``) .join(""); }, + populateOwnerFilter() { + const s = document.getElementById("filterOwner"); + if (!s) return; + const owners = new Set(); + (projectData.appData.products || []).forEach((p) => { + const owner = p.metadata?.owner?.trim(); + if (owner) owners.add(owner); + }); + const sortedOwners = Array.from(owners).sort((a, b) => + a.localeCompare(b, "fa"), + ); + s.innerHTML = + '' + + sortedOwners + .map((o) => ``) + .join(""); + }, bindEvents() { const si = document.getElementById("toolbarSearch"), ft = document.getElementById("filterType"), - fe = document.getElementById("filterEnvironment"); + fe = document.getElementById("filterEnvironment"), + fo = document.getElementById("filterOwner"); if (si) si.addEventListener("input", () => { this.applyFilters(); @@ -4317,6 +4355,11 @@ this.applyFilters(); refreshUI(); }); + if (fo) + fo.addEventListener("change", () => { + this.applyFilters(); + refreshUI(); + }); }, applyFilters() { this.currentFilters = { @@ -4324,8 +4367,8 @@ .trim() .toLowerCase(), typeFilter: document.getElementById("filterType")?.value || "", - envFilter: - document.getElementById("filterEnvironment")?.value || "", + envFilter: document.getElementById("filterEnvironment")?.value || "", + ownerFilter: document.getElementById("filterOwner")?.value || "", }; this.updateStats(); }, @@ -4350,7 +4393,15 @@ }, shouldShowProduct(product) { const f = this.currentFilters; + if (!f.query && !f.typeFilter && !f.envFilter && !f.ownerFilter) return true; + + if (f.ownerFilter) { + const prodOwner = product.metadata?.owner?.trim(); + if (prodOwner !== f.ownerFilter) return false; + } + if (!f.query && !f.typeFilter && !f.envFilter) return true; + return (product.projects || []).some((pr) => { const mq = !f.query || @@ -4362,6 +4413,7 @@ (pr.deployments || []) .filter((d) => d.status === "active") .some((d) => d.environmentId === f.envFilter); + return mq && mt && me; }); }, @@ -4891,6 +4943,7 @@ updateProjectUI(); renderToolGroups(); ToolbarManager.populateEnvironmentFilter(); + ToolbarManager.populateOwnerFilter(); refreshUI(); showToast("📂 بارگذاری شد", "success"); } catch (err) { @@ -4913,6 +4966,7 @@ }; AutosaveManager.clear(); ToolbarManager.populateEnvironmentFilter(); + ToolbarManager.populateOwnerFilter(); refreshUI(); showToast("🗑️ پاکسازی شد", "success"); }, @@ -5132,7 +5186,13 @@ return null; }, getActiveDeployments(proj) { - return (proj.deployments || []).filter((d) => d.status === "active"); + return (proj.deployments || []) + .filter((d) => d.status === "active") + .sort((a, b) => { + const dateA = a.deploymentDate ? new Date(a.deploymentDate).getTime() : 0; + const dateB = b.deploymentDate ? new Date(b.deploymentDate).getTime() : 0; + return dateB - dateA; + }); }, getEnvironmentsWithoutDeployment(proj) { const allEnvIds = projectData.appData.environments.map((e) => e.id); @@ -5154,7 +5214,9 @@ (s, pr) => s + this.getActiveDeployments(pr).length, 0, ); + let html = `
ℹ️ اطلاعات محصول
عنوان${prod.title}
توضیحات${prod.description || "—"}
تاریخ ایجاد${prod.metadata?.createdAt ? new Date(prod.metadata.createdAt).toLocaleDateString("fa-IR") : "—"}
مالک${prod.metadata?.owner || "—"}
تعداد پروژه${projects.length}
استقرارهای فعال${totalDeploys}
🌿 پروژه‌ها (${projects.length})
`; + if (projects.length === 0) { html += '
🌿 هیچ پروژه‌ای نیست
'; } else { @@ -5163,21 +5225,43 @@ const ti = this.getTypeInfo(pr.type); const deps = pr.dependencies || []; const deploys = this.getActiveDeployments(pr); - const emptyEnvs = this.getEnvironmentsWithoutDeployment(pr); - const canAdd = emptyEnvs.length > 0; - html += `
${ti.icon}${pr.title}${ti.label}
${pr.description || ""}
${pr.metadata?.framework ? `
فریم‌ورک${pr.metadata.framework}
` : ""}${pr.metadata?.language ? `
زبان${pr.metadata.language}
` : ""}${deps.length > 0 - ? `
وابستگی‌ها (${deps.length})${deps + const archivedDeploys = (pr.deployments || []) + .filter((d) => d.status === "archived") + .sort((a, b) => { + const dateA = a.archivedAt ? new Date(a.archivedAt).getTime() : 0; + const dateB = b.archivedAt ? new Date(b.archivedAt).getTime() : 0; + return dateB - dateA; + }); + const hasEnvs = projectData.appData.environments.length > 0; + + html += `
${ti.icon}${pr.title}${ti.label}
${pr.description || ""}
`; + + if (pr.metadata?.owner) { + html += `
👤 مالک${pr.metadata.owner}
`; + } + + if (pr.metadata?.framework) { + html += `
فریم‌ورک${pr.metadata.framework}
`; + } + + if (pr.metadata?.language) { + html += `
زبان${pr.metadata.language}
`; + } + + if (deps.length > 0) { + html += `
وابستگی‌ها (${deps.length})${deps .map((depId) => { const dp = this.findProjectById(depId); return dp ? dp.title : depId; }) - .join("، ")}
` - : "" - }
`; - html += `
🚀 استقرارهای فعال (${deploys.length})${canAdd ? `` : '✓ کامل'}
`; + .join("، ")}
`; + } + + html += `
`; + html += `
🚀 استقرارهای فعال (${deploys.length})${hasEnvs ? `` : '⚠️ محیطی تعریف نشده'}
`; + if (deploys.length === 0) { - html += - '
هنوز استقرار ندارد
'; + html += '
هنوز استقرار ندارد
'; } else { html += '
'; deploys.forEach((d) => { @@ -5186,13 +5270,22 @@ const fd = d.deploymentDate ? new Date(d.deploymentDate).toLocaleString("fa-IR") : "—"; - html += `
${en}v${d.version}📅 ${fd}
`; - if (d.releaseNotes) + + html += `
${en}v${d.version}📅 ${fd}
`; + + html += ``; + + html += ``; + + html += ``; + + html += `
`; + + if (d.releaseNotes) { html += `
📝 ${d.releaseNotes}
`; - if ( - d.requiredDeployments && - d.requiredDeployments.length > 0 - ) { + } + + if (d.requiredDeployments && d.requiredDeployments.length > 0) { html += `
🔗 نیازمندی‌ها: ${d.requiredDeployments .map((rd) => { const rp = this.findProjectById(rd.projectId); @@ -5207,14 +5300,62 @@ }) .join("، ")}
`; } + html += `
`; }); html += "
"; } + + html += `
`; + html += `
`; + html += `📜 تاریخچه استقرارها (${archivedDeploys.length})`; + if (archivedDeploys.length > 0) { + html += ``; + } + html += `
`; + + if (archivedDeploys.length === 0) { + html += `
هنوز استقراری آرشیو نشده است
`; + } else { + html += ``; + } + + html += `
`; + html += `
`; }); html += "
"; } + html += `
`; document.getElementById("projectDetailBody").innerHTML = html; ModalManager.open("projectDetailModal"); @@ -5259,6 +5400,7 @@ }); ModalManager.close("addProductModal"); refreshUI(); + ToolbarManager.populateOwnerFilter(); showToast(`"${title}" ایجاد شد`, "success"); }, openDependencyManager(productId, projId) { @@ -5449,6 +5591,7 @@ prod.metadata.updatedAt = new Date().toISOString(); ModalManager.close("productEditModal"); refreshUI(); + ToolbarManager.populateOwnerFilter(); this.showDetail(pid); showToast(`"${prod.title}" ویرایش شد`, "success"); }, @@ -5460,6 +5603,7 @@ document.getElementById("newProjectTitle").value = ""; document.getElementById("newProjectType").value = ""; document.getElementById("newProjectFramework").value = ""; + document.getElementById("newProjectOwner").value = ""; // 🆕 document.getElementById("newProjectLanguage").value = ""; document.getElementById("newProjectRepo").value = ""; document.getElementById("newProjectDescription").value = ""; @@ -5482,20 +5626,18 @@ const np = { id: `proj-${Date.now()}`, title, - description: - document.getElementById("newProjectDescription").value.trim() || - "", + description: document.getElementById("newProjectDescription").value.trim() || "", type, - repositoryUrl: document - .getElementById("newProjectRepo") - .value.trim(), - metadata: { createdAt: new Date().toISOString(), customFields: {} }, + repositoryUrl: document.getElementById("newProjectRepo").value.trim(), + metadata: { + createdAt: new Date().toISOString(), + owner: document.getElementById("newProjectOwner").value.trim() || "", // 🆕 + customFields: {} + }, dependencies: [], deployments: [], }; - const fw = document - .getElementById("newProjectFramework") - .value.trim(); + const fw = document.getElementById("newProjectFramework").value.trim(); if (fw) np.metadata.framework = fw; const lg = document.getElementById("newProjectLanguage").value.trim(); if (lg) np.metadata.language = lg; @@ -5506,9 +5648,7 @@ showToast(`"${title}" ایجاد شد`, "success"); }, openProjectEditModal(productId, projId) { - const prod = projectData.appData.products.find( - (p) => p.id === productId, - ); + const prod = projectData.appData.products.find((p) => p.id === productId); if (!prod) return; const pr = prod.projects.find((p) => p.id === projId); if (!pr) return; @@ -5517,14 +5657,11 @@ document.getElementById("editProjId").value = pr.id; document.getElementById("editProjTitle").value = pr.title; document.getElementById("editProjType").value = pr.type; - document.getElementById("editProjFramework").value = - pr.metadata?.framework || ""; - document.getElementById("editProjLanguage").value = - pr.metadata?.language || ""; - document.getElementById("editProjRepo").value = - pr.repositoryUrl || ""; - document.getElementById("editProjDescription").value = - pr.description || ""; + document.getElementById("editProjFramework").value = pr.metadata?.framework || ""; + document.getElementById("editProjOwner").value = pr.metadata?.owner || ""; // 🆕 + document.getElementById("editProjLanguage").value = pr.metadata?.language || ""; + document.getElementById("editProjRepo").value = pr.repositoryUrl || ""; + document.getElementById("editProjDescription").value = pr.description || ""; ModalManager.open("editProjectModal"); }, saveProjectEdit() { @@ -5545,15 +5682,15 @@ AutosaveManager.scheduleSave(); pr.title = nt; pr.type = nty; - pr.description = - document.getElementById("editProjDescription").value.trim() || ""; - pr.repositoryUrl = document - .getElementById("editProjRepo") - .value.trim(); + pr.description = document.getElementById("editProjDescription").value.trim() || ""; + pr.repositoryUrl = document.getElementById("editProjRepo").value.trim(); if (!pr.metadata) pr.metadata = {}; const fw = document.getElementById("editProjFramework").value.trim(); if (fw) pr.metadata.framework = fw; else delete pr.metadata.framework; + const owner = document.getElementById("editProjOwner").value.trim(); // 🆕 + if (owner) pr.metadata.owner = owner; + else delete pr.metadata.owner; const lg = document.getElementById("editProjLanguage").value.trim(); if (lg) pr.metadata.language = lg; else delete pr.metadata.language; @@ -5565,36 +5702,39 @@ }, openAddDeploymentModal(productId, projId) { if (!productId || !projId) return; - const prod = projectData.appData.products.find( - (p) => p.id === productId, - ); + const prod = projectData.appData.products.find((p) => p.id === productId); if (!prod) return; const pr = prod.projects.find((p) => p.id === projId); if (!pr) return; - const emptyEnvs = this.getEnvironmentsWithoutDeployment(pr); - if (emptyEnvs.length === 0) { - showToast("همه محیط‌ها استقرار دارند", "warning"); + + const allEnvs = projectData.appData.environments; + if (allEnvs.length === 0) { + showToast("ابتدا یک محیط عملیاتی ایجاد کنید", "warning"); return; } + this.currentDeploymentProjId = projId; this.currentDeploymentMode = "add"; this.currentDeploymentEnvId = null; this.currentEditDeploymentId = null; + document.getElementById("deploymentModalTitle").innerHTML = "🚀افزودن نسخه استقرار"; + const envGroup = document.getElementById("deploymentEnvGroup"); - const envs = projectData.appData.environments.filter((e) => - emptyEnvs.includes(e.id), - ); + const envs = allEnvs; + envGroup.innerHTML = ``; + document.getElementById("depVersion").value = ""; document.getElementById("depDate").value = ""; document.getElementById("depReleaseNotes").value = ""; + this.renderRequiredDeploymentsSection(); ModalManager.open("deploymentModal"); }, @@ -5762,7 +5902,26 @@ this.showDetail(pid); }, removeDeployment(productId, projId, depId) { - if (!confirm("حذف این استقرار؟")) return; + if (!confirm("⚠️ حذف کامل این استقرار؟\n\nاین عمل غیرقابل بازگشت است.\nاگر می‌خواهید فقط از لیست فعال خارج شود، از دکمه «آرشیو» استفاده کنید.")) return; + const prod = projectData.appData.products.find( + (p) => p.id === productId, + ); + if (!prod) return; + const pr = prod.projects.find((p) => p.id === projId); + if (!pr) return; + + HistoryManager.pushState(); + AutosaveManager.scheduleSave(); + + pr.deployments = (pr.deployments || []).filter((d) => d.id !== depId); + + refreshUI(); + this.showDetail(productId); + showToast("🗑️ استقرار به‌طور کامل حذف شد", "warning"); + }, + archiveDeployment(productId, projId, depId) { + if (!confirm("📦 انتقال این استقرار به تاریخچه؟\n\nاستقرار از لیست فعال خارج شده و در بخش تاریخچه نگهداری می‌شود.")) return; + const prod = projectData.appData.products.find( (p) => p.id === productId, ); @@ -5771,12 +5930,16 @@ if (!pr) return; const dep = (pr.deployments || []).find((d) => d.id === depId); if (!dep) return; + HistoryManager.pushState(); AutosaveManager.scheduleSave(); - dep.status = "removed"; + + dep.status = "archived"; + dep.archivedAt = new Date().toISOString(); + refreshUI(); this.showDetail(productId); - showToast("استقرار حذف شد", "warning"); + showToast("📦 استقرار به تاریخچه منتقل شد", "success"); }, removeProduct(productId) { const prod = projectData.appData.products.find( @@ -5790,6 +5953,7 @@ (p) => p.id !== productId, ); refreshUI(); + ToolbarManager.populateOwnerFilter(); ModalManager.close("projectDetailModal"); showToast(`"${prod.title}" حذف شد`, "warning"); }, @@ -5809,6 +5973,35 @@ this.showDetail(productId); showToast(`"${pr.title}" حذف شد`, "warning"); }, + toggleArchiveVisibility(projId) { + const list = document.getElementById(`archiveList-${projId}`); + if (!list) return; + const isHidden = list.style.display === "none"; + list.style.display = isHidden ? "flex" : "none"; + }, + restoreDeployment(productId, projId, depId) { + if (!confirm("↩️ بازگرداندن این استقرار به لیست فعال؟")) return; + + const prod = projectData.appData.products.find( + (p) => p.id === productId, + ); + if (!prod) return; + const pr = prod.projects.find((p) => p.id === projId); + if (!pr) return; + const dep = (pr.deployments || []).find((d) => d.id === depId); + if (!dep) return; + + HistoryManager.pushState(); + AutosaveManager.scheduleSave(); + + // ✅ بازگرداندن به وضعیت active + dep.status = "active"; + delete dep.archivedAt; + + refreshUI(); + this.showDetail(productId); + showToast("↩️ استقرار به لیست فعال بازگردانده شد", "success"); + }, }; /* ==================== DASHBOARD MANAGER ==================== */ const DashboardManager = { @@ -6710,6 +6903,7 @@ updateProjectUI(); renderToolGroups(); ToolbarManager.populateEnvironmentFilter(); + ToolbarManager.populateOwnerFilter(); refreshUI(); if (ReleaseBoardsManager) { ReleaseBoardsManager.render(true); diff --git a/xReleaseAssistant_6.html b/xReleaseAssistant_6.html index 2b38688..e235d52 100644 --- a/xReleaseAssistant_6.html +++ b/xReleaseAssistant_6.html @@ -3017,6 +3017,12 @@
+
+ 👤 + +
@@ -3296,32 +3302,38 @@