Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 1 addition & 48 deletions .claude/settings.local.json
Original file line number Diff line number Diff line change
@@ -1,21 +1,14 @@
{
"permissions": {
"allow": [
"mcp__dual-graph__graph_continue",
"mcp__dual-graph__graph_read",
"Bash(dotnet build:*)",
"mcp__dual-graph__graph_register_edit",
"mcp__dual-graph__graph_scan",
"Bash(find /g/Resgrid/Resgrid -type d \\\\\\(-name *mobile* -o -name *Mobile* -o -name *app* -o -name *App* -o -name *apps* -o -name *Apps* \\\\\\))",
"Bash(xargs grep:*)",
"Bash(grep -r \"mapbox\\\\|react-native\\\\|rnmapbox\" /g/Resgrid/Resgrid --include=package.json --include=*.ts --include=*.tsx)",
"Bash(find G:ResgridResgridWebResgrid.WebAreasUserViews -type f -name *.cshtml)",
"Bash(grep -r \"google.maps\\\\|mapboxgl\\\\|leaflet\\\\|openstreetmap\" G:/Resgrid/Resgrid/Web/Resgrid.Web/Areas/User/Apps/src --include=*.ts)",
"Bash(grep -r \"leaflet\\\\|L\\\\.tileLayer\\\\|OpenStreetMap\" /g/Resgrid/Resgrid/Web/Resgrid.Web.Services --include=*.cs)",
"Bash(find /g/Resgrid/Resgrid -type f -name *.swift -o -name *.kt -o -name *.java)",
"mcp__graperoot-pro__graph_continue",
"mcp__graperoot-pro__fallback_rg",
"mcp__graperoot-pro__graph_read",
"Bash(export PATH=\"$PATH:/usr/local/share/dotnet\")",
"Read(//usr/local/**)",
"Read(//opt/**)",
Expand All @@ -24,51 +17,11 @@
"Bash(brew --prefix dotnet)",
"Bash(/opt/homebrew/opt/dotnet/bin/dotnet build:*)",
"Bash(brew info:*)",
"mcp__graperoot-pro__graph_register_edit",
"mcp__graperoot-pro__graph_grep_all",
"Bash(/usr/local/share/dotnet/dotnet build *)",
"Bash(awk 'NR>=94 && /HttpGet\\\\\\(\"IncomingMessage\"\\\\\\)/{f=1} f{print NR\": \"$0} f && /^\\\\t\\\\t\\\\}$/{c++; if\\(c==1\\) exit}')",
"Bash(dotnet test *)",
"Bash(git -C /Volumes/USBSSD/dev/Resgrid/Core log --oneline -1 -- Providers/Resgrid.Providers.Migrations/Migrations/M0094_AddIncidentCommandNameAndLocations.cs)"
]
},
"enableAllProjectMcpServers": true,
"enabledMcpjsonServers": [
"graperoot-pro"
],
"hooks": {
"PreToolUse": [
{
"matcher": "Bash|Read",
"hooks": [
{
"type": "command",
"command": "DG_DATA_DIR=\"/Volumes/USBSSD/dev/Resgrid/Core/.dual-graph-pro\" /Users/shawn/.graperoot-pro/venv/bin/python3 \"/Users/shawn/.graperoot-pro/graph_gate.py\""
}
]
}
],
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "DG_DATA_DIR=\"/Volumes/USBSSD/dev/Resgrid/Core/.dual-graph-pro\" /Users/shawn/.graperoot-pro/venv/bin/python3 \"/Users/shawn/.graperoot-pro/graph_sync.py\""
}
]
}
],
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "/Users/shawn/.graperoot-pro/venv/bin/python3 \"/Users/shawn/.graperoot-pro/stop_hook.py\""
}
]
}
]
}
"enableAllProjectMcpServers": true
}
18 changes: 18 additions & 0 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,31 @@ jobs:
with:
dotnet-version: ${{ env.DOTNET_VERSION }}

# Headless browser tests for the web scripts (Tests/Resgrid.Tests/Web/*.test.cjs) run inside
# `dotnet test` through BrowserScriptTests; they need node, the pinned Playwright and a browser.
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '22'
cache: npm
cache-dependency-path: Tests/Resgrid.Tests/Web/package-lock.json

- name: Install browser test dependencies
working-directory: Tests/Resgrid.Tests/Web
run: |
npm ci --no-audit --no-fund
npx playwright install --with-deps chromium

- name: Restore dependencies
run: dotnet restore

- name: Build
run: dotnet build --no-restore --configuration Release

- name: Test
env:
RESGRID_PLAYWRIGHT_CHANNEL: chromium
RESGRID_BROWSER_TESTS: required
run: dotnet test --no-build --configuration Release --verbosity normal

# ───────────────────────────────────────────────
Expand Down
6 changes: 6 additions & 0 deletions Core/Resgrid.Config/DataProtectionConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,12 @@ public static class DataProtectionConfig
/// <summary>Operator ceiling on StepUpWindowMinutes; departments cannot exceed it.</summary>
public static int StepUpMaximumMinutes = 480;

/// <summary>
/// Seconds before a Protected Data Grant expires at which the web reveal module warns the user and offers
/// an in-place re-verification, so revealed fields and typed work on an edit page are not lost at expiry.
/// </summary>
public static int StepUpExpiryWarningSeconds = 120;

/// <summary>
/// ADP migration worker: maximum departments whose night runs in one sweep
/// (BackOffice-adjustable). Executions are SEQUENTIAL within the sweep — this caps how many
Expand Down
100 changes: 100 additions & 0 deletions Core/Resgrid.Localization/Areas/User/Records/Records.ar.resx
Original file line number Diff line number Diff line change
Expand Up @@ -964,4 +964,104 @@
<data name="CredentialRequiredForGrantTypeChange" xml:space="preserve">
<value>يلزم إدخال بيانات اعتماد جديدة عند تغيير نوع منح الوصول في NERIS.</value>
</data>
<data name="DisclosureSettingsHeader" xml:space="preserve"><value>الإفصاح عن السجلات العامة</value></data>
<data name="DisclosureSettingsIntro" xml:space="preserve"><value>الإعدادات الافتراضية لسير عمل الإفصاح: مهلة الرد القانونية، وملف التنقيح الذي يبدأ به الطلب الجديد، ومن يصدر الحزمة المنتجة.</value></data>
<data name="StatutoryClockDays" xml:space="preserve"><value>مهلة الرد القانونية (أيام)</value></data>
<data name="StatutoryClockDaysHelp" xml:space="preserve"><value>عدد الأيام لاستحقاق الطلب الجديد، محسوبة من تاريخ الاستلام. من 1 إلى 365.</value></data>
<data name="DefaultRedactionProfile" xml:space="preserve"><value>ملف التنقيح الافتراضي</value></data>
<data name="DefaultRedactionProfileHelp" xml:space="preserve"><value>يُطبَّق على الطلب الجديد ما لم يختر الضابط ملفاً آخر.</value></data>
<data name="DisclosureReleaseApprover" xml:space="preserve"><value>الموافق على الإصدار</value></data>
<data name="DisclosureReleaseApproverHelp" xml:space="preserve"><value>العضو الذي يصدر الحزم المنتجة. اتركه فارغاً لأي مسؤول قسم.</value></data>
<data name="DisclosureApproverAnyAdmin" xml:space="preserve"><value>أي مسؤول قسم</value></data>
<data name="RedactionProfileStandard" xml:space="preserve"><value>قياسي - حجب المحتوى المقيد</value></data>
<data name="RedactionProfileNoPersonalIdentifiers" xml:space="preserve"><value>بدون معرفات شخصية - حجب هويات المشاركين أيضاً</value></data>
<data name="RedactionProfileFullDisclosure" xml:space="preserve"><value>إفصاح كامل - إصدار كل ما هو محفوظ</value></data>
<data name="NfirsLegacyHeader" xml:space="preserve"><value>عرض NFIRS (تاريخي)</value></data>
<data name="NfirsLegacyButton" xml:space="preserve"><value>عرض NFIRS</value></data>
<data name="NfirsLegacyIntro" xml:space="preserve"><value>حقول وحدة NFIRS الأساسية كما يمكن قراءتها من البيانات التي يحتفظ بها هذا القسم بالفعل، وحقيقة أو قسم NERIS الذي يحمل كلاً منها لاحقاً.</value></data>
<data name="NfirsLegacyReadOnlyNotice" xml:space="preserve"><value>للقراءة فقط. توقف NFIRS في 2026-01-31؛ لا يتم استيراد أو تحرير أو إرسال أي شيء في هذه الصفحة.</value></data>
<data name="NfirsField" xml:space="preserve"><value>حقل NFIRS</value></data>
<data name="NfirsStatus" xml:space="preserve"><value>حالة الحقل</value></data>
<data name="NfirsStatusPopulated" xml:space="preserve"><value>معبأ</value></data>
<data name="NfirsStatusMissing" xml:space="preserve"><value>مفقود</value></data>
<data name="NfirsStatusNotCaptured" xml:space="preserve"><value>غير مسجل</value></data>
<data name="NfirsRequired" xml:space="preserve"><value>مطلوب في NFIRS</value></data>
<data name="NfirsRequiredLegend" xml:space="preserve"><value>* مطلوب بموجب وحدة NFIRS الأساسية.</value></data>
<data name="NerisEquivalent" xml:space="preserve"><value>المكافئ في NERIS</value></data>
<data name="NerisNoEquivalent" xml:space="preserve"><value>لا يوجد مكافئ في NERIS (للقسم فقط)</value></data>
<data name="NerisCarried" xml:space="preserve"><value>محمول في تقرير NERIS</value></data>
<data name="NerisNotYetCarried" xml:space="preserve"><value>ليس بعد في تقرير NERIS</value></data>
<data name="NfirsCrosswalkSummary" xml:space="preserve"><value>ملخص المطابقة</value></data>
<data name="NfirsNoNerisReport" xml:space="preserve"><value>لم يبدأ أي تقرير NERIS لهذه المكالمة.</value></data>
<data name="NfirsRequiredMissing" xml:space="preserve"><value>الحقول المطلوبة المفقودة</value></data>
<data name="NfirsCrosswalked" xml:space="preserve"><value>الحقول التي لها مكافئ في NERIS</value></data>
<data name="NfirsSunsetNote" xml:space="preserve"><value>تُعرض بيانات NFIRS للاستمرارية التاريخية فقط. التقارير الجديدة تذهب إلى NERIS.</value></data>
<data name="IncidentReport" xml:space="preserve"><value>تقرير الحادث</value></data>
<data name="Value" xml:space="preserve"><value>القيمة</value></data>
<data name="GeneratedOn" xml:space="preserve"><value>تم الإنشاء</value></data>
<data name="ExportTemplates" xml:space="preserve"><value>تصدير التقارير</value></data>
<data name="ExportTemplatesIntro" xml:space="preserve"><value>صمّم الملف الذي تستلمه جهة لا تملك واجهة برمجية: اختر الأعمدة والتنسيق والنطاق، ثم أرفق التصدير بخطوة سير عمل أو ضعه في جدول زمني.</value></data>
<data name="NewExportTemplate" xml:space="preserve"><value>تصدير جديد</value></data>
<data name="EditExportTemplate" xml:space="preserve"><value>تعديل التصدير</value></data>
<data name="ExportTemplateName" xml:space="preserve"><value>اسم التصدير</value></data>
<data name="ExportTemplateKey" xml:space="preserve"><value>المفتاح</value></data>
<data name="ExportTemplateKeyHelp" xml:space="preserve"><value>أحرف صغيرة وأرقام وشرطات. تعتمد عليه خطوة سير العمل واستيراد الجهة، لذا لا يتغيّر بعد استخدامه.</value></data>
<data name="ExportTemplateDescription" xml:space="preserve"><value>الوصف</value></data>
<data name="ExportFormat" xml:space="preserve"><value>التنسيق</value></data>
<data name="ExportScope" xml:space="preserve"><value>النطاق</value></data>
<data name="ExportScopeTriggeringRecord" xml:space="preserve"><value>السجل المُطلِق</value></data>
<data name="ExportScopeWindow" xml:space="preserve"><value>جميع السجلات المُنهاة ضمن فترة</value></data>
<data name="ExportDefinitions" xml:space="preserve"><value>تعريفات السجلات</value></data>
<data name="ExportDefinitionsHelp" xml:space="preserve"><value>اترك جميع التعريفات دون تحديد لتصديرها كلها.</value></data>
<data name="ExportColumns" xml:space="preserve"><value>الأعمدة</value></data>
<data name="ExportColumnsHelp" xml:space="preserve"><value>تُؤخذ الأعمدة من فهرس ثابت ومُراجَع. تحتاج أعمدة السرد والأعمدة المقيّدة إلى مفتاحها أدناه وإقرار بالإخراج.</value></data>
<data name="ExportIncludeNarrative" xml:space="preserve"><value>تضمين السرد والبيانات الشخصية (المستوى 2)</value></data>
<data name="ExportIncludeRestricted" xml:space="preserve"><value>تضمين الأقسام المقيّدة (المستوى 1)</value></data>
<data name="ExportEgressAcknowledge" xml:space="preserve"><value>أقرّ بأن هذا التصدير يرسل محتوى سرديًا أو مقيّدًا خارج Resgrid إلى الوجهة التي يحددها سير العمل.</value></data>
<data name="ExportEgressAcknowledgedOn" xml:space="preserve"><value>تم الإقرار بالإخراج</value></data>
<data name="ExportFileNameTemplate" xml:space="preserve"><value>اسم الملف</value></data>
<data name="ExportFileNameHelp" xml:space="preserve"><value>الرموز: {template} و{date} و{record}. يتبع الامتداد التنسيق.</value></data>
<data name="ExportIncludeHeader" xml:space="preserve"><value>تضمين صف العناوين</value></data>
<data name="ExportDelimiter" xml:space="preserve"><value>الفاصل</value></data>
<data name="ExportSchedule" xml:space="preserve"><value>الجدول الزمني</value></data>
<data name="ExportScheduleNone" xml:space="preserve"><value>بدون جدول زمني (سير العمل فقط)</value></data>
<data name="ExportScheduleDaily" xml:space="preserve"><value>يوميًا</value></data>
<data name="ExportScheduleWeekly" xml:space="preserve"><value>أسبوعيًا</value></data>
<data name="ExportScheduleMonthly" xml:space="preserve"><value>شهريًا</value></data>
<data name="ExportScheduleHour" xml:space="preserve"><value>الساعة (التوقيت المحلي للقسم)</value></data>
<data name="ExportScheduleDayOfWeek" xml:space="preserve"><value>يوم الأسبوع (0 = الأحد)</value></data>
<data name="ExportScheduleDayOfMonth" xml:space="preserve"><value>يوم الشهر (1-28)</value></data>
<data name="ExportWindowDays" xml:space="preserve"><value>الفترة (أيام)</value></data>
<data name="ExportWindowDaysHelp" xml:space="preserve"><value>يستخدم 0 فترة الجدول: يوم أو أسبوع أو شهر ينتهي عند التشغيل.</value></data>
<data name="ExportEnabled" xml:space="preserve"><value>مفعّل</value></data>
<data name="ExportNextRun" xml:space="preserve"><value>التشغيل التالي</value></data>
<data name="ExportLastRun" xml:space="preserve"><value>آخر تشغيل</value></data>
<data name="ExportRuns" xml:space="preserve"><value>عمليات التشغيل</value></data>
<data name="ExportRunNow" xml:space="preserve"><value>تشغيل الآن</value></data>
<data name="ExportRunNowHelp" xml:space="preserve"><value>يُنشئ التصدير لمراجعته قبل أن تراه الجهة. يُسجَّل كل سجل فيه كتصدير في سجل التدقيق.</value></data>
<data name="ExportRunNowNeedsRecord" xml:space="preserve"><value>يغطي هذا التصدير سجلًا مُطلِقًا واحدًا: أدخل معرّف السجل.</value></data>
<data name="ExportRunGenerated" xml:space="preserve"><value>تم الإنشاء</value></data>
<data name="ExportRunRecords" xml:space="preserve"><value>السجلات</value></data>
<data name="ExportRunSize" xml:space="preserve"><value>بايت</value></data>
<data name="ExportRunRedacted" xml:space="preserve"><value>حُجبت الحقول المحمية من هذا الملف</value></data>
<data name="ExportRunDownload" xml:space="preserve"><value>تنزيل</value></data>
<data name="ExportRunTrigger" xml:space="preserve"><value>المُطلِق</value></data>
<data name="ExportTemplateSaved" xml:space="preserve"><value>تم حفظ التصدير.</value></data>
<data name="ExportTemplateDeleted" xml:space="preserve"><value>تم حذف التصدير. ستفشل خطوات سير العمل التي كانت تستخدمه حتى يتم تحديثها.</value></data>
<data name="ExportTemplateDeleteConfirm" xml:space="preserve"><value>هل تريد حذف هذا التصدير؟</value></data>
<data name="ExportNoTemplates" xml:space="preserve"><value>لم يتم تصميم أي تصدير بعد.</value></data>
<data name="ExportWorkflowHint" xml:space="preserve"><value>في مصمّم سير العمل، يمكن لخطوة بريد إلكتروني أو رفع ملف على مُطلِق السجلات إرفاق أي تصدير مدرج هنا؛ ويُطلق التصدير المجدول مُطلِقه الخاص عند تشغيله.</value></data>
<data name="ExportTierSafe" xml:space="preserve"><value>الهوية والتواريخ والرموز والأعداد</value></data>
<data name="ExportTierNarrative" xml:space="preserve"><value>السرد والبيانات الشخصية (المستوى 2)</value></data>
<data name="ExportTierRestricted" xml:space="preserve"><value>الأقسام المقيّدة (المستوى 1)</value></data>
<data name="ExportAdpWarning" xml:space="preserve"><value>يُطبَّق نظام حماية البيانات المتقدّمة على هذا القسم. تُحجب الأعمدة المحمية (REDACTED) في كل تشغيل ما لم يُسجَّل إقرار الإخراج للتصدير.</value></data>
<data name="ProtectedRecordBanner" xml:space="preserve"><value>سجل محمي</value></data>
<data name="ProtectedIncidentBanner" xml:space="preserve"><value>تقرير حادث محمي</value></data>
<data name="ProtectedEditHint" xml:space="preserve"><value>تبقى الحقول المحمية مخفية حتى تتحقق من هويتك. يتطلب حفظ هذا النموذج التحقق أيضًا، لذا تحقق قبل التحرير.</value></data>
<data name="ProtectedEditRevealed" xml:space="preserve"><value>المحتوى المحمي ظاهر لجلسة التحرير هذه. يبقى محميًا عند الحفظ.</value></data>
<data name="NerisProtectedEgress" xml:space="preserve"><value>السماح بإرسال محتوى الحوادث المحمي إلى NERIS</value></data>
<data name="NerisProtectedEgressHelp" xml:space="preserve"><value>بموجب حماية البيانات المتقدّمة تكون الحمولة الموضوعة في الطابور مختومة. بهذا الإقرار تفتحها خدمة الإرسال للتسليم فقط عبر قناة الوسيط المخصصة؛ وبدونه يفشل الإرسال المحمي بأمان.</value></data>
<data name="NerisProtectedEgressAcknowledged" xml:space="preserve"><value>تم الإقرار في</value></data>
<data name="NerisProtectedEgressRequired" xml:space="preserve"><value>يُطبَّق نظام حماية البيانات المتقدّمة: ستفشل عمليات الإرسال المحمية حتى يُسجَّل هذا الإقرار.</value></data>
<data name="RecordId" xml:space="preserve"><value>معرّف السجل</value></data>
</root>
Loading
Loading