From 51aeddf13b421577d60d6be2f2f381b1624ddb59 Mon Sep 17 00:00:00 2001 From: renshen <1005457301@qq.com> Date: Fri, 11 Sep 2026 15:25:26 +0800 Subject: [PATCH 1/4] feat: add basic data top-level navigation --- config/business_navigation.php | 6 ++++++ tests/Unit/View/BasicDataNavigationTest.php | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 tests/Unit/View/BasicDataNavigationTest.php diff --git a/config/business_navigation.php b/config/business_navigation.php index 1855f019..680f167b 100644 --- a/config/business_navigation.php +++ b/config/business_navigation.php @@ -289,6 +289,12 @@ $navigation = [ ], ], ], + [ + 'slug' => 'basic-data', + 'title' => '基础数据', + 'icon' => 'folder', + 'pages' => [], + ], [ 'slug' => 'product-inventory', 'title' => '商品及库存管理', diff --git a/tests/Unit/View/BasicDataNavigationTest.php b/tests/Unit/View/BasicDataNavigationTest.php new file mode 100644 index 00000000..2f369af1 --- /dev/null +++ b/tests/Unit/View/BasicDataNavigationTest.php @@ -0,0 +1,21 @@ +assertNotFalse($index); + $this->assertSame('基础数据', $navigation[$index]['title']); + $this->assertSame([], $navigation[$index]['pages']); + $this->assertSame('invoice-management', $slugs[$index + 1]); + $this->assertCount(1, array_keys($slugs, 'basic-data', true)); + } +} -- 2.47.2 From 0aae48aae6288b888cd523a041511858c9898999 Mon Sep 17 00:00:00 2001 From: renshen <1005457301@qq.com> Date: Fri, 11 Sep 2026 16:50:58 +0800 Subject: [PATCH 2/4] feat: group orders and refunds under basic data --- app/Listeners/Menu/ShowInAdmin.php | 29 ++++++++++++++++++++- tests/Unit/View/BasicDataNavigationTest.php | 25 ++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/app/Listeners/Menu/ShowInAdmin.php b/app/Listeners/Menu/ShowInAdmin.php index d2c94b1d..b1d0f791 100644 --- a/app/Listeners/Menu/ShowInAdmin.php +++ b/app/Listeners/Menu/ShowInAdmin.php @@ -20,7 +20,34 @@ class ShowInAdmin */ public function handle(Event $event): void { - $this->renderSections($event->menu, self::groupPayables(SidebarPermissions::navigationFor(user()))); + $this->renderSections($event->menu, self::groupBasicData(self::groupPayables(SidebarPermissions::navigationFor(user())))); + } + + public static function groupBasicData(array $navigation): array + { + $keys = ['order-data', 'refunds']; + $children = array_values(array_filter($navigation, static fn (array $section): bool => in_array($section['slug'], $keys, true))); + if ($children === []) { + return $navigation; + } + + $group = ['slug' => 'basic-data', 'title' => '基础数据', 'icon' => 'folder', 'sections' => $children]; + $hasDirectory = in_array('basic-data', array_column($navigation, 'slug'), true); + $result = []; + foreach ($navigation as $section) { + if ($section['slug'] === 'basic-data') { + $result[] = array_replace($section, ['sections' => $children]); + } elseif (in_array($section['slug'], $keys, true)) { + if (! $hasDirectory) { + $result[] = $group; + $hasDirectory = true; + } + } else { + $result[] = $section; + } + } + + return $result; } public static function groupPayables(array $navigation): array diff --git a/tests/Unit/View/BasicDataNavigationTest.php b/tests/Unit/View/BasicDataNavigationTest.php index 2f369af1..162b25db 100644 --- a/tests/Unit/View/BasicDataNavigationTest.php +++ b/tests/Unit/View/BasicDataNavigationTest.php @@ -3,9 +3,34 @@ namespace Tests\Unit\View; use PHPUnit\Framework\TestCase; +use App\Listeners\Menu\ShowInAdmin; + +require_once dirname(__DIR__, 3) . '/app/Listeners/Menu/ShowInAdmin.php'; class BasicDataNavigationTest extends TestCase { + public function test_group_moves_only_order_data_and_refunds_without_changing_pages(): void + { + $navigation = require dirname(__DIR__, 3) . '/config/business_navigation.php'; + $grouped = ShowInAdmin::groupBasicData($navigation); + $slugs = array_column($grouped, 'slug'); + $group = $grouped[array_search('basic-data', $slugs, true)]; + $this->assertSame(['order-data', 'refunds'], array_column($group['sections'], 'slug')); + $this->assertNotContains('order-data', $slugs); + $this->assertNotContains('refunds', $slugs); + foreach ($group['sections'] as $section) { + $this->assertSame($navigation[array_search($section['slug'], array_column($navigation, 'slug'), true)], $section); + } + } + + public function test_group_contains_only_authorized_sections_even_without_directory_permission(): void + { + $allowed = [['slug' => 'refunds', 'title' => '退款', 'pages' => [['slug' => 'non-jingxi-refund-data']]]]; + $grouped = ShowInAdmin::groupBasicData($allowed); + $this->assertSame($allowed, $grouped[0]['sections']); + $this->assertSame([], ShowInAdmin::groupBasicData([])); + } + public function test_basic_data_is_an_empty_top_level_directory_before_invoice_management(): void { $navigation = require dirname(__DIR__, 3) . '/config/business_navigation.php'; -- 2.47.2 From 1dbe0c7f2ced47f338346300c2bf93d0eef2cb74 Mon Sep 17 00:00:00 2001 From: renshen <1005457301@qq.com> Date: Fri, 11 Sep 2026 18:03:11 +0800 Subject: [PATCH 3/4] feat: rename product navigation to price management --- config/business_navigation.php | 2 +- tests/Feature/Settings/NavigationTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/business_navigation.php b/config/business_navigation.php index 1855f019..8d3291c6 100644 --- a/config/business_navigation.php +++ b/config/business_navigation.php @@ -291,7 +291,7 @@ $navigation = [ ], [ 'slug' => 'product-inventory', - 'title' => '商品及库存管理', + 'title' => '商品价格管理', 'icon' => 'inventory_2', 'pages' => [ ['slug' => 'normal-products', 'title' => '普通商品资料'], diff --git a/tests/Feature/Settings/NavigationTest.php b/tests/Feature/Settings/NavigationTest.php index 853558cc..ee105404 100644 --- a/tests/Feature/Settings/NavigationTest.php +++ b/tests/Feature/Settings/NavigationTest.php @@ -87,7 +87,7 @@ class NavigationTest extends FeatureTestCase '退款数据', '账单流水数据', '账单余额数据', - '商品及库存管理', + '商品价格管理', ], array_column(array_slice($navigation, $invoiceIndex, 7), 'title') ); -- 2.47.2 From 1a508745bbfba7c407c8f78b0c0a5486298c66fe Mon Sep 17 00:00:00 2001 From: WuYongJie <549727955@qq.com> Date: Sat, 12 Sep 2026 09:52:14 +0800 Subject: [PATCH 4/4] =?UTF-8?q?test:=20=E9=AA=8C=E8=AF=81=E5=88=86?= =?UTF-8?q?=E7=BB=84=E5=AF=BC=E8=88=AA=E6=B8=B2=E6=9F=93=E4=B8=8E=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=9D=83=E9=99=90=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/Feature/Settings/NavigationTest.php | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/Feature/Settings/NavigationTest.php b/tests/Feature/Settings/NavigationTest.php index ee105404..8fb57a89 100644 --- a/tests/Feature/Settings/NavigationTest.php +++ b/tests/Feature/Settings/NavigationTest.php @@ -9,6 +9,40 @@ use Tests\Feature\FeatureTestCase; class NavigationTest extends FeatureTestCase { + public function testGroupedNavigationRendersExistingPageLinks(): void + { + $this->loginAs() + ->get(route('business.pages.show', ['section' => 'basic-data'])) + ->assertOk() + ->assertSeeText('基础数据') + ->assertSeeText('商品价格管理') + ->assertSee('/workspace/order-data/raw-data', false) + ->assertSee('/workspace/refunds/non-jingxi-refund-data', false) + ->assertSee('/workspace/product-inventory/normal-products', false); + } + + public function testGroupedNavigationKeepsRestrictedPagePermissions(): void + { + $this->user->roles()->sync([Role::where('name', 'manager')->firstOrFail()->id]); + $subject = 'user_' . $this->user->id; + setting()->set('system.sidebar_permissions', [ + 'configured' => [$subject], + 'subjects' => [$subject => ['basic-data', 'refunds/non-jingxi-refund-data']], + ]); + setting()->save(); + + $this->loginAs() + ->get(route('business.pages.show', ['section' => 'basic-data'])) + ->assertOk() + ->assertSee('/workspace/refunds/non-jingxi-refund-data', false) + ->assertDontSee('/workspace/order-data/raw-data', false) + ->assertDontSee('/workspace/product-inventory/normal-products', false); + + $this->withExceptionHandling() + ->get(route('business.pages.show', ['section' => 'order-data'])) + ->assertForbidden(); + } + public function testAdminCanUpdateSidebarLabels() { $this->user->roles()->sync([ -- 2.47.2