From 1cbca5a5c1bf3316ca5d56ad318754d740d935b7 Mon Sep 17 00:00:00 2001 From: Yukino_fox Date: Sun, 19 Apr 2026 20:55:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(kv-storage):=20=E5=AE=9E=E7=8E=B0=20KV=20?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E6=9C=8D=E5=8A=A1=E5=8F=8A=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构 KV 存储服务,遵循 SECTL-One-Stop SDK 规范 - 新增 KV 存储管理组件,支持增删改查操作 - 优化 setKV 接口,移除冗余参数 - 添加类型定义和列表查询选项 --- .eslintcache | 2 +- src/components/SectlKVStorageManager.tsx | 436 +++++++++++++++++++++++ src/components/SectlSettingsPanel.tsx | 8 + src/preload/types.ts | 2 +- src/services/scoreSyncService.ts | 16 +- src/services/sectlKVStorage.ts | 126 ++++--- 6 files changed, 520 insertions(+), 70 deletions(-) create mode 100644 src/components/SectlKVStorageManager.tsx diff --git a/.eslintcache b/.eslintcache index 645bc4a..35e5d15 100644 --- a/.eslintcache +++ b/.eslintcache @@ -1 +1 @@ -[{"E:\\Document\\Coding\\SecScore\\eslint.config.mjs":"1","E:\\Document\\Coding\\SecScore\\src\\App.tsx":"2","E:\\Document\\Coding\\SecScore\\src\\ClientContext.ts":"3","E:\\Document\\Coding\\SecScore\\src\\components\\BoardManager.tsx":"4","E:\\Document\\Coding\\SecScore\\src\\components\\ContentArea.tsx":"5","E:\\Document\\Coding\\SecScore\\src\\components\\EventHistory.tsx":"6","E:\\Document\\Coding\\SecScore\\src\\components\\Home.tsx":"7","E:\\Document\\Coding\\SecScore\\src\\components\\Leaderboard.tsx":"8","E:\\Document\\Coding\\SecScore\\src\\components\\OOBE\\OOBE.tsx":"9","E:\\Document\\Coding\\SecScore\\src\\components\\OOBE\\OOBEBackground.tsx":"10","E:\\Document\\Coding\\SecScore\\src\\components\\ReasonManager.tsx":"11","E:\\Document\\Coding\\SecScore\\src\\components\\RewardExchange.tsx":"12","E:\\Document\\Coding\\SecScore\\src\\components\\RewardSettings.tsx":"13","E:\\Document\\Coding\\SecScore\\src\\components\\ScoreManager.tsx":"14","E:\\Document\\Coding\\SecScore\\src\\components\\Settings.tsx":"15","E:\\Document\\Coding\\SecScore\\src\\components\\SettlementHistory.tsx":"16","E:\\Document\\Coding\\SecScore\\src\\components\\Sidebar.tsx":"17","E:\\Document\\Coding\\SecScore\\src\\components\\StudentManager.tsx":"18","E:\\Document\\Coding\\SecScore\\src\\components\\TagEditorDialog.tsx":"19","E:\\Document\\Coding\\SecScore\\src\\components\\ThemeEditor.tsx":"20","E:\\Document\\Coding\\SecScore\\src\\components\\ThemeQuickSettings.tsx":"21","E:\\Document\\Coding\\SecScore\\src\\components\\TitleBar.tsx":"22","E:\\Document\\Coding\\SecScore\\src\\components\\Versions.tsx":"23","E:\\Document\\Coding\\SecScore\\src\\components\\WindowControls.tsx":"24","E:\\Document\\Coding\\SecScore\\src\\components\\Wizard.tsx":"25","E:\\Document\\Coding\\SecScore\\src\\contexts\\ServiceContext.tsx":"26","E:\\Document\\Coding\\SecScore\\src\\contexts\\ThemeContext.tsx":"27","E:\\Document\\Coding\\SecScore\\src\\contexts\\ThemeEditorContext.tsx":"28","E:\\Document\\Coding\\SecScore\\src\\env.d.ts":"29","E:\\Document\\Coding\\SecScore\\src\\hooks\\useResponsive.ts":"30","E:\\Document\\Coding\\SecScore\\src\\i18n\\index.ts":"31","E:\\Document\\Coding\\SecScore\\src\\main.tsx":"32","E:\\Document\\Coding\\SecScore\\src\\preload\\types.ts":"33","E:\\Document\\Coding\\SecScore\\src\\react-19-patch.ts":"34","E:\\Document\\Coding\\SecScore\\src\\services\\StudentService.ts":"35","E:\\Document\\Coding\\SecScore\\src\\shared\\kernel.ts":"36","E:\\Document\\Coding\\SecScore\\src\\shared\\mobileNavigation.ts":"37","E:\\Document\\Coding\\SecScore\\src\\utils\\color.ts":"38","E:\\Document\\Coding\\SecScore\\src\\utils\\studentAvatar.ts":"39","E:\\Document\\Coding\\SecScore\\src\\workers\\xlsxWorker.ts":"40","E:\\Document\\Coding\\SecScore\\vite.config.ts":"41","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\ActionEditor.tsx":"42","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\AutoScoreUtils.ts":"43","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\IntervalValueCodec.ts":"44","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\IntervalValueWidget.tsx":"45","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\TriggerRuleBuilder.tsx":"46","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScoreManager.tsx":"47","E:\\Document\\Coding\\SecScore\\src\\components\\OAuth\\OAuthCallback.tsx":"48","E:\\Document\\Coding\\SecScore\\src\\components\\OAuth\\OAuthLogin.tsx":"49","E:\\Document\\Coding\\SecScore\\src\\components\\SectlCloudStorageManager.tsx":"50","E:\\Document\\Coding\\SecScore\\src\\components\\SectlLoginButton.tsx":"51","E:\\Document\\Coding\\SecScore\\src\\components\\SectlSettingsPanel.tsx":"52","E:\\Document\\Coding\\SecScore\\src\\contexts\\SectlContext.tsx":"53","E:\\Document\\Coding\\SecScore\\src\\services\\sectl.ts":"54","E:\\Document\\Coding\\SecScore\\src\\services\\sectlAuth.ts":"55","E:\\Document\\Coding\\SecScore\\src\\services\\sectlCloudStorage.ts":"56","E:\\Document\\Coding\\SecScore\\src\\services\\sectlKVStorage.ts":"57","E:\\Document\\Coding\\SecScore\\src\\services\\sectlNotification.ts":"58","E:\\Document\\Coding\\SecScore\\src\\views\\SectlCloudView.tsx":"59","E:\\Document\\Coding\\SecScore\\src\\components\\ScoreSyncPanel.tsx":"60","E:\\Document\\Coding\\SecScore\\src\\services\\scoreSyncService.ts":"61","E:\\Document\\Coding\\SecScore\\src\\shared\\fontFamily.ts":"62"},{"size":1413,"mtime":1774084765386,"results":"63","hashOfConfig":"64"},{"size":38733,"mtime":1775878592415,"results":"65","hashOfConfig":"66"},{"size":124,"mtime":1774084765537,"results":"67","hashOfConfig":"66"},{"size":47714,"mtime":1774704827018,"results":"68","hashOfConfig":"66"},{"size":12989,"mtime":1774784139058,"results":"69","hashOfConfig":"66"},{"size":2044,"mtime":1774084765557,"results":"70","hashOfConfig":"66"},{"size":90881,"mtime":1774704827750,"results":"71","hashOfConfig":"66"},{"size":8101,"mtime":1774084765561,"results":"72","hashOfConfig":"66"},{"size":36271,"mtime":1774176288912,"results":"73","hashOfConfig":"66"},{"size":4203,"mtime":1774084765566,"results":"74","hashOfConfig":"66"},{"size":5983,"mtime":1774084765569,"results":"75","hashOfConfig":"66"},{"size":9360,"mtime":1774084765571,"results":"76","hashOfConfig":"66"},{"size":6151,"mtime":1774084765572,"results":"77","hashOfConfig":"66"},{"size":13165,"mtime":1775882074040,"results":"78","hashOfConfig":"66"},{"size":61700,"mtime":1775878592604,"results":"79","hashOfConfig":"66"},{"size":5950,"mtime":1774084765578,"results":"80","hashOfConfig":"66"},{"size":10480,"mtime":1774784139062,"results":"81","hashOfConfig":"66"},{"size":79058,"mtime":1774704830361,"results":"82","hashOfConfig":"66"},{"size":6331,"mtime":1774084765584,"results":"83","hashOfConfig":"66"},{"size":8079,"mtime":1774084765586,"results":"84","hashOfConfig":"66"},{"size":10954,"mtime":1774084765587,"results":"85","hashOfConfig":"66"},{"size":3858,"mtime":1774084765589,"results":"86","hashOfConfig":"66"},{"size":431,"mtime":1774084765590,"results":"87","hashOfConfig":"66"},{"size":2367,"mtime":1774084765592,"results":"88","hashOfConfig":"66"},{"size":1560,"mtime":1774084765594,"results":"89","hashOfConfig":"66"},{"size":362,"mtime":1774084765604,"results":"90","hashOfConfig":"66"},{"size":5985,"mtime":1774084765606,"results":"91","hashOfConfig":"66"},{"size":2824,"mtime":1774084765608,"results":"92","hashOfConfig":"66"},{"size":38,"mtime":1774084765611,"results":"93","hashOfConfig":"66"},{"size":2097,"mtime":1774084765613,"results":"94","hashOfConfig":"66"},{"size":2771,"mtime":1775828716269,"results":"95","hashOfConfig":"66"},{"size":6919,"mtime":1774704831300,"results":"96","hashOfConfig":"66"},{"size":23522,"mtime":1775885815810,"results":"97","hashOfConfig":"66"},{"size":1150,"mtime":1774084765630,"results":"98","hashOfConfig":"66"},{"size":667,"mtime":1774084765638,"results":"99","hashOfConfig":"66"},{"size":3061,"mtime":1774176077013,"results":"100","hashOfConfig":"66"},{"size":1810,"mtime":1774784139078,"results":"101","hashOfConfig":"66"},{"size":3256,"mtime":1774084765655,"results":"102","hashOfConfig":"66"},{"size":1115,"mtime":1774084765658,"results":"103","hashOfConfig":"66"},{"size":947,"mtime":1774084765660,"results":"104","hashOfConfig":"66"},{"size":709,"mtime":1774665241507,"results":"105","hashOfConfig":"66"},{"size":4778,"mtime":1775878592427,"results":"106","hashOfConfig":"66"},{"size":17053,"mtime":1775885815750,"results":"107","hashOfConfig":"66"},{"size":3739,"mtime":1775878592450,"results":"108","hashOfConfig":"66"},{"size":3033,"mtime":1775882069874,"results":"109","hashOfConfig":"66"},{"size":1907,"mtime":1775878592519,"results":"110","hashOfConfig":"66"},{"size":29665,"mtime":1775905018094,"results":"111","hashOfConfig":"66"},{"size":1047,"mtime":1775224756086,"results":"112","hashOfConfig":"66"},{"size":7484,"mtime":1775904980121,"results":"113","hashOfConfig":"66"},{"size":8410,"mtime":1775383418692,"results":"114","hashOfConfig":"66"},{"size":1661,"mtime":1775382857634,"results":"115","hashOfConfig":"66"},{"size":4807,"mtime":1775383469000,"results":"116","hashOfConfig":"66"},{"size":3773,"mtime":1775383419736,"results":"117","hashOfConfig":"66"},{"size":683,"mtime":1775383317477,"results":"118","hashOfConfig":"66"},{"size":9500,"mtime":1775383420349,"results":"119","hashOfConfig":"66"},{"size":14984,"mtime":1775382860520,"results":"120","hashOfConfig":"66"},{"size":6315,"mtime":1775382860555,"results":"121","hashOfConfig":"66"},{"size":5437,"mtime":1775382860586,"results":"122","hashOfConfig":"66"},{"size":429,"mtime":1775383291875,"results":"123","hashOfConfig":"66"},{"size":8415,"mtime":1775828714587,"results":"124","hashOfConfig":"66"},{"size":7067,"mtime":1775383420279,"results":"125","hashOfConfig":"66"},{"size":1359,"mtime":1775878592716,"results":"126","hashOfConfig":"66"},{"filePath":"127","messages":"128","suppressedMessages":"129","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"oyxevq",{"filePath":"130","messages":"131","suppressedMessages":"132","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"f6a32r",{"filePath":"133","messages":"134","suppressedMessages":"135","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"136","messages":"137","suppressedMessages":"138","errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"139","messages":"140","suppressedMessages":"141","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"142","messages":"143","suppressedMessages":"144","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"145","messages":"146","suppressedMessages":"147","errorCount":3,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"148","messages":"149","suppressedMessages":"150","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"151","messages":"152","suppressedMessages":"153","errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"154","messages":"155","suppressedMessages":"156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"157","messages":"158","suppressedMessages":"159","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"160","messages":"161","suppressedMessages":"162","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"163","messages":"164","suppressedMessages":"165","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"166","messages":"167","suppressedMessages":"168","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"169","messages":"170","suppressedMessages":"171","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"172","messages":"173","suppressedMessages":"174","errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"175","messages":"176","suppressedMessages":"177","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"178","messages":"179","suppressedMessages":"180","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"181","messages":"182","suppressedMessages":"183","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"184","messages":"185","suppressedMessages":"186","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"187","messages":"188","suppressedMessages":"189","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"190","messages":"191","suppressedMessages":"192","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"193","messages":"194","suppressedMessages":"195","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"196","messages":"197","suppressedMessages":"198","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"199","messages":"200","suppressedMessages":"201","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"202","messages":"203","suppressedMessages":"204","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"205","messages":"206","suppressedMessages":"207","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"208","messages":"209","suppressedMessages":"210","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"211","messages":"212","suppressedMessages":"213","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"214","messages":"215","suppressedMessages":"216","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"217","messages":"218","suppressedMessages":"219","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"220","messages":"221","suppressedMessages":"222","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"223","messages":"224","suppressedMessages":"225","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"226","messages":"227","suppressedMessages":"228","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"229","messages":"230","suppressedMessages":"231","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"232","messages":"233","suppressedMessages":"234","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"235","messages":"236","suppressedMessages":"237","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"238","messages":"239","suppressedMessages":"240","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"241","messages":"242","suppressedMessages":"243","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"244","messages":"245","suppressedMessages":"246","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"247","messages":"248","suppressedMessages":"249","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"250","messages":"251","suppressedMessages":"252","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"253","messages":"254","suppressedMessages":"255","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"256","messages":"257","suppressedMessages":"258","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"259","messages":"260","suppressedMessages":"261","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"262","messages":"263","suppressedMessages":"264","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"265","messages":"266","suppressedMessages":"267","errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"268","messages":"269","suppressedMessages":"270","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"271","messages":"272","suppressedMessages":"273","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"274","messages":"275","suppressedMessages":"276","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"277","messages":"278","suppressedMessages":"279","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"280","messages":"281","suppressedMessages":"282","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"283","messages":"284","suppressedMessages":"285","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"286","messages":"287","suppressedMessages":"288","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"289","messages":"290","suppressedMessages":"291","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"292","messages":"293","suppressedMessages":"294","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"295","messages":"296","suppressedMessages":"297","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"298","messages":"299","suppressedMessages":"300","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"301","messages":"302","suppressedMessages":"303","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"304","messages":"305","suppressedMessages":"306","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"307","messages":"308","suppressedMessages":"309","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"310","messages":"311","suppressedMessages":"312","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"E:\\Document\\Coding\\SecScore\\eslint.config.mjs",[],[],"E:\\Document\\Coding\\SecScore\\src\\App.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\ClientContext.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\BoardManager.tsx",["313","314"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ContentArea.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\EventHistory.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Home.tsx",["315","316","317","318","319","320"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Leaderboard.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\OOBE\\OOBE.tsx",["321","322"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\OOBE\\OOBEBackground.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ReasonManager.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\RewardExchange.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\RewardSettings.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ScoreManager.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Settings.tsx",["323"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\SettlementHistory.tsx",["324","325"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Sidebar.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\StudentManager.tsx",["326"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\TagEditorDialog.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ThemeEditor.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ThemeQuickSettings.tsx",["327"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\TitleBar.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Versions.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\WindowControls.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Wizard.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\contexts\\ServiceContext.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\contexts\\ThemeContext.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\contexts\\ThemeEditorContext.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\env.d.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\hooks\\useResponsive.ts",["328"],[],"E:\\Document\\Coding\\SecScore\\src\\i18n\\index.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\main.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\preload\\types.ts",["329"],[],"E:\\Document\\Coding\\SecScore\\src\\react-19-patch.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\StudentService.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\shared\\kernel.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\shared\\mobileNavigation.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\utils\\color.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\utils\\studentAvatar.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\workers\\xlsxWorker.ts",[],[],"E:\\Document\\Coding\\SecScore\\vite.config.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\ActionEditor.tsx",["330"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\AutoScoreUtils.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\IntervalValueCodec.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\IntervalValueWidget.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\TriggerRuleBuilder.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScoreManager.tsx",["331","332","333"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\OAuth\\OAuthCallback.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\OAuth\\OAuthLogin.tsx",["334"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\SectlCloudStorageManager.tsx",["335"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\SectlLoginButton.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\SectlSettingsPanel.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\contexts\\SectlContext.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\sectl.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\sectlAuth.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\sectlCloudStorage.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\sectlKVStorage.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\sectlNotification.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\views\\SectlCloudView.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ScoreSyncPanel.tsx",["336"],[],"E:\\Document\\Coding\\SecScore\\src\\services\\scoreSyncService.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\shared\\fontFamily.ts",[],[],{"ruleId":"337","severity":1,"message":"338","line":626,"column":6,"nodeType":"339","endLine":626,"endColumn":44,"suggestions":"340"},{"ruleId":"337","severity":1,"message":"338","line":634,"column":6,"nodeType":"339","endLine":634,"endColumn":59,"suggestions":"341"},{"ruleId":"337","severity":1,"message":"342","line":532,"column":6,"nodeType":"339","endLine":532,"endColumn":76,"suggestions":"343"},{"ruleId":"344","severity":2,"message":"345","line":544,"column":34,"nodeType":null,"endLine":556,"endColumn":4},{"ruleId":"344","severity":2,"message":"345","line":544,"column":34,"nodeType":null,"endLine":556,"endColumn":4},{"ruleId":"337","severity":1,"message":"346","line":556,"column":6,"nodeType":"339","endLine":556,"endColumn":15,"suggestions":"347"},{"ruleId":"344","severity":2,"message":"348","line":1627,"column":5,"nodeType":null,"endLine":1650,"endColumn":6},{"ruleId":"337","severity":1,"message":"349","line":1710,"column":6,"nodeType":"339","endLine":1710,"endColumn":8,"suggestions":"350"},{"ruleId":"337","severity":1,"message":"351","line":160,"column":6,"nodeType":"339","endLine":160,"endColumn":20,"suggestions":"352"},{"ruleId":"337","severity":1,"message":"353","line":334,"column":5,"nodeType":"339","endLine":334,"endColumn":27,"suggestions":"354"},{"ruleId":"337","severity":1,"message":"355","line":377,"column":6,"nodeType":"339","endLine":377,"endColumn":8,"suggestions":"356"},{"ruleId":"337","severity":1,"message":"357","line":54,"column":6,"nodeType":"339","endLine":54,"endColumn":18,"suggestions":"358"},{"ruleId":"337","severity":1,"message":"346","line":106,"column":5,"nodeType":"339","endLine":106,"endColumn":7,"suggestions":"359"},{"ruleId":"337","severity":1,"message":"360","line":1351,"column":6,"nodeType":"339","endLine":1351,"endColumn":50,"suggestions":"361"},{"ruleId":"337","severity":1,"message":"351","line":100,"column":6,"nodeType":"339","endLine":100,"endColumn":20,"suggestions":"362"},{"ruleId":"337","severity":1,"message":"363","line":25,"column":9,"nodeType":"364","endLine":25,"endColumn":70},{"ruleId":"365","severity":2,"message":"366","line":705,"column":38,"nodeType":"367","messageId":"368","endLine":705,"endColumn":43},{"ruleId":"337","severity":1,"message":"369","line":23,"column":9,"nodeType":"364","endLine":23,"endColumn":63},{"ruleId":"337","severity":1,"message":"346","line":166,"column":5,"nodeType":"339","endLine":166,"endColumn":55,"suggestions":"370"},{"ruleId":"337","severity":1,"message":"371","line":328,"column":6,"nodeType":"339","endLine":328,"endColumn":15,"suggestions":"372"},{"ruleId":"337","severity":1,"message":"373","line":392,"column":6,"nodeType":"339","endLine":392,"endColumn":55,"suggestions":"374"},{"ruleId":"337","severity":1,"message":"375","line":163,"column":6,"nodeType":"339","endLine":163,"endColumn":8,"suggestions":"376"},{"ruleId":"337","severity":1,"message":"377","line":79,"column":6,"nodeType":"339","endLine":79,"endColumn":23,"suggestions":"378"},{"ruleId":"337","severity":1,"message":"379","line":69,"column":6,"nodeType":"339","endLine":69,"endColumn":23,"suggestions":"380"},"react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'activeBoard'. Either include it or remove the dependency array.","ArrayExpression",["381"],["382"],"React Hook useMemo has an unnecessary dependency: 'layoutType'. Either exclude it or remove the dependency array.",["383"],"react-hooks/preserve-manual-memoization","Compilation Skipped: Existing memoization could not be preserved\n\nReact Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. The inferred dependencies did not match the manually specified dependencies, which could cause the value to change more or less frequently than expected. The inferred dependency was `t`, but the source dependencies were [reasons]. Inferred different dependency than source.\n\nE:\\Document\\Coding\\SecScore\\src\\components\\Home.tsx:544:34\n 542 | }, [groupedStudents])\n 543 |\n> 544 | const groupedReasons = useMemo(() => {\n | ^^^^^^^\n> 545 | const groups: Record = {}\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n> 546 | reasons.forEach((r) => {\n …\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n> 555 | })\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n> 556 | }, [reasons])\n | ^^^^ Could not preserve existing manual memoization\n 557 |\n 558 | const selectedStudents = useMemo(() => {\n 559 | if (selectedStudentIds.length === 0) return []","React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.",["384"],"Compilation Skipped: Existing memoization could not be preserved\n\nReact Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. This value was memoized in source but not in compilation output.\n\nE:\\Document\\Coding\\SecScore\\src\\components\\Home.tsx:1627:5\n 1625 |\n 1626 | const handleNavAction = useCallback(\n> 1627 | (clientY: number) => {\n | ^^^^^^^^^^^^^^^^^^^^^^\n> 1628 | if (!navContainerRef.current) return\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n> 1629 | const rect = navContainerRef.current.getBoundingClientRect()\n …\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n> 1649 | }\n | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n> 1650 | },\n | ^^^^^^ Could not preserve existing memoization\n 1651 | [groupedStudents, quickNavLayout.itemSize, quickNavLayout.paddingY, triggerNavHaptic]\n 1652 | )\n 1653 |","React Hook useEffect has missing dependencies: 'onGlobalMouseMove' and 'onGlobalMouseUp'. Either include them or remove the dependency array.",["385"],"React Hook useEffect has a missing dependency: 't'. Either include it or remove the dependency array.",["386"],"React Hook useCallback has missing dependencies: 'showOobeMessage' and 't'. Either include them or remove the dependency array.",["387"],"React Hook useEffect has a missing dependency: 'loadAll'. Either include it or remove the dependency array.",["388"],"React Hook useCallback has a missing dependency: 't'. Either include it or remove the dependency array.",["389"],["390"],"React Hook useMemo has missing dependencies: 'handleDelete', 'handleOpenAvatarEditor', 'handleOpenGroupEditor', and 'handleOpenTagEditor'. Either include them or remove the dependency array.",["391"],["392"],"The 'breakpoints' object makes the dependencies of useEffect Hook (at line 49) change on every render. Move it inside the useEffect callback. Alternatively, wrap the initialization of 'breakpoints' in its own useMemo() Hook.","VariableDeclarator","@typescript-eslint/no-unused-vars","'_args' is defined but never used.","Identifier","unusedVar","The 'safeValue' conditional could make the dependencies of useMemo Hook (at line 59) change on every render. To fix this, wrap the initialization of 'safeValue' in its own useMemo() Hook.",["393"],"React Hook useEffect has missing dependencies: 'fetchBatches', 'fetchRules', 'fetchStudents', and 'fetchTags'. Either include them or remove the dependency array.",["394"],"React Hook useEffect has missing dependencies: 'fetchBatches' and 'fetchRules'. Either include them or remove the dependency array.",["395"],"React Hook useEffect has a missing dependency: 'handleOAuthCallback'. Either include it or remove the dependency array.",["396"],"React Hook useEffect has missing dependencies: 'loadFiles' and 'loadStorageUsage'. Either include them or remove the dependency array.",["397"],"React Hook useEffect has a missing dependency: 'checkCloudStatus'. Either include it or remove the dependency array.",["398"],{"desc":"399","fix":"400"},{"desc":"401","fix":"402"},{"desc":"403","fix":"404"},{"desc":"405","fix":"406"},{"desc":"407","fix":"408"},{"desc":"409","fix":"410"},{"desc":"411","fix":"412"},{"desc":"413","fix":"414"},{"desc":"415","fix":"416"},{"desc":"417","fix":"418"},{"desc":"419","fix":"420"},{"desc":"409","fix":"421"},{"desc":"422","fix":"423"},{"desc":"424","fix":"425"},{"desc":"426","fix":"427"},{"desc":"428","fix":"429"},{"desc":"430","fix":"431"},{"desc":"432","fix":"433"},"Update the dependencies array to be: [activeBoard, activeBoard.id, activeBoard.layout]",{"range":"434","text":"435"},"Update the dependencies array to be: [activeBoard, activeBoard.id, listConfigSignature, runAllInBoard]",{"range":"436","text":"437"},"Update the dependencies array to be: [sortedStudents, sortType, searchKeyword, getGroupName, t]",{"range":"438","text":"439"},"Update the dependencies array to be: [reasons, t]",{"range":"440","text":"441"},"Update the dependencies array to be: [onGlobalMouseMove, onGlobalMouseUp]",{"range":"442","text":"443"},"Update the dependencies array to be: [currentTheme, t]",{"range":"444","text":"445"},"Update the dependencies array to be: [students, showOobeMessage, t]",{"range":"446","text":"447"},"Update the dependencies array to be: [loadAll]",{"range":"448","text":"449"},"Update the dependencies array to be: [messageApi, t]",{"range":"450","text":"451"},"Update the dependencies array to be: [t]",{"range":"452","text":"453"},"Update the dependencies array to be: [t, isMobile, canEdit, handleOpenTagEditor, handleOpenGroupEditor, handleOpenAvatarEditor, handleDelete]",{"range":"454","text":"455"},{"range":"456","text":"445"},"Update the dependencies array to be: [t, tagOptions]",{"range":"457","text":"458"},"Update the dependencies array to be: [canEdit, fetchBatches, fetchRules, fetchStudents, fetchTags]",{"range":"459","text":"460"},"Update the dependencies array to be: [backfillPrompted, canEdit, fetchBatches, fetchRules, messageApi, rules, t]",{"range":"461","text":"462"},"Update the dependencies array to be: [handleOAuthCallback]",{"range":"463","text":"464"},"Update the dependencies array to be: [isAuthenticated, loadFiles, loadStorageUsage]",{"range":"465","text":"466"},"Update the dependencies array to be: [checkCloudStatus, isAuthenticated]",{"range":"467","text":"468"},[18048,18086],"[activeBoard, activeBoard.id, activeBoard.layout]",[18296,18349],"[activeBoard, activeBoard.id, listConfigSignature, runAllInBoard]",[16069,16139],"[sortedStudents, sortType, searchKeyword, getGroupName, t]",[16914,16923],"[reasons, t]",[53173,53175],"[onGlobalMouseMove, onGlobalMouseUp]",[4674,4688],"[currentTheme, t]",[10389,10411],"[students, showOobeMessage, t]",[12089,12091],"[loadAll]",[1697,1709],"[messageApi, t]",[3343,3345],"[t]",[45580,45624],"[t, isMobile, canEdit, handleOpenTagEditor, handleOpenGroupEditor, handleOpenAvatarEditor, handleDelete]",[3185,3199],[4185,4235],"[t, tagOptions]",[9126,9135],"[canEdit, fetchBatches, fetchRules, fetchStudents, fetchTags]",[11298,11347],"[backfillPrompted, canEdit, fetchBatches, fetchRules, messageApi, rules, t]",[4414,4416],"[handleOAuthCallback]",[1826,1843],"[isAuthenticated, loadFiles, loadStorageUsage]",[1783,1800],"[checkCloudStatus, isAuthenticated]"] \ No newline at end of file +[{"E:\\Document\\Coding\\SecScore\\eslint.config.mjs":"1","E:\\Document\\Coding\\SecScore\\src\\App.tsx":"2","E:\\Document\\Coding\\SecScore\\src\\ClientContext.ts":"3","E:\\Document\\Coding\\SecScore\\src\\components\\BoardManager.tsx":"4","E:\\Document\\Coding\\SecScore\\src\\components\\ContentArea.tsx":"5","E:\\Document\\Coding\\SecScore\\src\\components\\EventHistory.tsx":"6","E:\\Document\\Coding\\SecScore\\src\\components\\Home.tsx":"7","E:\\Document\\Coding\\SecScore\\src\\components\\Leaderboard.tsx":"8","E:\\Document\\Coding\\SecScore\\src\\components\\OOBE\\OOBE.tsx":"9","E:\\Document\\Coding\\SecScore\\src\\components\\OOBE\\OOBEBackground.tsx":"10","E:\\Document\\Coding\\SecScore\\src\\components\\ReasonManager.tsx":"11","E:\\Document\\Coding\\SecScore\\src\\components\\RewardExchange.tsx":"12","E:\\Document\\Coding\\SecScore\\src\\components\\RewardSettings.tsx":"13","E:\\Document\\Coding\\SecScore\\src\\components\\ScoreManager.tsx":"14","E:\\Document\\Coding\\SecScore\\src\\components\\Settings.tsx":"15","E:\\Document\\Coding\\SecScore\\src\\components\\SettlementHistory.tsx":"16","E:\\Document\\Coding\\SecScore\\src\\components\\Sidebar.tsx":"17","E:\\Document\\Coding\\SecScore\\src\\components\\StudentManager.tsx":"18","E:\\Document\\Coding\\SecScore\\src\\components\\TagEditorDialog.tsx":"19","E:\\Document\\Coding\\SecScore\\src\\components\\ThemeEditor.tsx":"20","E:\\Document\\Coding\\SecScore\\src\\components\\ThemeQuickSettings.tsx":"21","E:\\Document\\Coding\\SecScore\\src\\components\\TitleBar.tsx":"22","E:\\Document\\Coding\\SecScore\\src\\components\\Versions.tsx":"23","E:\\Document\\Coding\\SecScore\\src\\components\\WindowControls.tsx":"24","E:\\Document\\Coding\\SecScore\\src\\components\\Wizard.tsx":"25","E:\\Document\\Coding\\SecScore\\src\\contexts\\ServiceContext.tsx":"26","E:\\Document\\Coding\\SecScore\\src\\contexts\\ThemeContext.tsx":"27","E:\\Document\\Coding\\SecScore\\src\\contexts\\ThemeEditorContext.tsx":"28","E:\\Document\\Coding\\SecScore\\src\\env.d.ts":"29","E:\\Document\\Coding\\SecScore\\src\\hooks\\useResponsive.ts":"30","E:\\Document\\Coding\\SecScore\\src\\i18n\\index.ts":"31","E:\\Document\\Coding\\SecScore\\src\\main.tsx":"32","E:\\Document\\Coding\\SecScore\\src\\preload\\types.ts":"33","E:\\Document\\Coding\\SecScore\\src\\react-19-patch.ts":"34","E:\\Document\\Coding\\SecScore\\src\\services\\StudentService.ts":"35","E:\\Document\\Coding\\SecScore\\src\\shared\\kernel.ts":"36","E:\\Document\\Coding\\SecScore\\src\\shared\\mobileNavigation.ts":"37","E:\\Document\\Coding\\SecScore\\src\\utils\\color.ts":"38","E:\\Document\\Coding\\SecScore\\src\\utils\\studentAvatar.ts":"39","E:\\Document\\Coding\\SecScore\\src\\workers\\xlsxWorker.ts":"40","E:\\Document\\Coding\\SecScore\\vite.config.ts":"41","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\ActionEditor.tsx":"42","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\AutoScoreUtils.ts":"43","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\IntervalValueCodec.ts":"44","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\IntervalValueWidget.tsx":"45","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\TriggerRuleBuilder.tsx":"46","E:\\Document\\Coding\\SecScore\\src\\components\\AutoScoreManager.tsx":"47","E:\\Document\\Coding\\SecScore\\src\\components\\OAuth\\OAuthCallback.tsx":"48","E:\\Document\\Coding\\SecScore\\src\\components\\OAuth\\OAuthLogin.tsx":"49","E:\\Document\\Coding\\SecScore\\src\\components\\SectlCloudStorageManager.tsx":"50","E:\\Document\\Coding\\SecScore\\src\\components\\SectlLoginButton.tsx":"51","E:\\Document\\Coding\\SecScore\\src\\components\\SectlSettingsPanel.tsx":"52","E:\\Document\\Coding\\SecScore\\src\\contexts\\SectlContext.tsx":"53","E:\\Document\\Coding\\SecScore\\src\\services\\sectl.ts":"54","E:\\Document\\Coding\\SecScore\\src\\services\\sectlAuth.ts":"55","E:\\Document\\Coding\\SecScore\\src\\services\\sectlCloudStorage.ts":"56","E:\\Document\\Coding\\SecScore\\src\\services\\sectlKVStorage.ts":"57","E:\\Document\\Coding\\SecScore\\src\\services\\sectlNotification.ts":"58","E:\\Document\\Coding\\SecScore\\src\\views\\SectlCloudView.tsx":"59","E:\\Document\\Coding\\SecScore\\src\\components\\ScoreSyncPanel.tsx":"60","E:\\Document\\Coding\\SecScore\\src\\services\\scoreSyncService.ts":"61","E:\\Document\\Coding\\SecScore\\src\\shared\\fontFamily.ts":"62","E:\\Document\\Coding\\SecScore\\src\\components\\PluginManager.tsx":"63","E:\\Document\\Coding\\SecScore\\src\\components\\SectlKVStorageManager.tsx":"64","E:\\Document\\Coding\\SecScore\\src\\hooks\\useOAuthPersist.ts":"65","E:\\Document\\Coding\\SecScore\\src\\plugins\\runtime.ts":"66"},{"size":1413,"mtime":1774084765386,"results":"67","hashOfConfig":"68"},{"size":42741,"mtime":1776572521716,"results":"69","hashOfConfig":"70"},{"size":124,"mtime":1774084765537,"results":"71","hashOfConfig":"70"},{"size":52571,"mtime":1776572523863,"results":"72","hashOfConfig":"70"},{"size":23453,"mtime":1776572524142,"results":"73","hashOfConfig":"70"},{"size":2044,"mtime":1774084765557,"results":"74","hashOfConfig":"70"},{"size":119471,"mtime":1776572525236,"results":"75","hashOfConfig":"70"},{"size":7976,"mtime":1775906174095,"results":"76","hashOfConfig":"70"},{"size":36271,"mtime":1774176288912,"results":"77","hashOfConfig":"70"},{"size":4203,"mtime":1774084765566,"results":"78","hashOfConfig":"70"},{"size":5983,"mtime":1774084765569,"results":"79","hashOfConfig":"70"},{"size":11972,"mtime":1776572526627,"results":"80","hashOfConfig":"70"},{"size":6151,"mtime":1774084765572,"results":"81","hashOfConfig":"70"},{"size":13165,"mtime":1775882074040,"results":"82","hashOfConfig":"70"},{"size":63577,"mtime":1776572527590,"results":"83","hashOfConfig":"70"},{"size":5950,"mtime":1774084765578,"results":"84","hashOfConfig":"70"},{"size":10638,"mtime":1775984538679,"results":"85","hashOfConfig":"70"},{"size":80155,"mtime":1776572075970,"results":"86","hashOfConfig":"70"},{"size":6331,"mtime":1774084765584,"results":"87","hashOfConfig":"70"},{"size":8079,"mtime":1774084765586,"results":"88","hashOfConfig":"70"},{"size":10954,"mtime":1774084765587,"results":"89","hashOfConfig":"70"},{"size":3858,"mtime":1774084765589,"results":"90","hashOfConfig":"70"},{"size":431,"mtime":1774084765590,"results":"91","hashOfConfig":"70"},{"size":2367,"mtime":1774084765592,"results":"92","hashOfConfig":"70"},{"size":1560,"mtime":1774084765594,"results":"93","hashOfConfig":"70"},{"size":362,"mtime":1774084765604,"results":"94","hashOfConfig":"70"},{"size":5985,"mtime":1774084765606,"results":"95","hashOfConfig":"70"},{"size":2824,"mtime":1774084765608,"results":"96","hashOfConfig":"70"},{"size":38,"mtime":1774084765611,"results":"97","hashOfConfig":"70"},{"size":2097,"mtime":1774084765613,"results":"98","hashOfConfig":"70"},{"size":2771,"mtime":1775828716269,"results":"99","hashOfConfig":"70"},{"size":6919,"mtime":1774704831300,"results":"100","hashOfConfig":"70"},{"size":26732,"mtime":1776603103264,"results":"101","hashOfConfig":"70"},{"size":1150,"mtime":1774084765630,"results":"102","hashOfConfig":"70"},{"size":667,"mtime":1774084765638,"results":"103","hashOfConfig":"70"},{"size":3061,"mtime":1774176077013,"results":"104","hashOfConfig":"70"},{"size":1909,"mtime":1775984538700,"results":"105","hashOfConfig":"70"},{"size":3256,"mtime":1774084765655,"results":"106","hashOfConfig":"70"},{"size":1115,"mtime":1774084765658,"results":"107","hashOfConfig":"70"},{"size":947,"mtime":1774084765660,"results":"108","hashOfConfig":"70"},{"size":709,"mtime":1774665241507,"results":"109","hashOfConfig":"70"},{"size":4778,"mtime":1775878592427,"results":"110","hashOfConfig":"70"},{"size":17053,"mtime":1775885815750,"results":"111","hashOfConfig":"70"},{"size":3739,"mtime":1775878592450,"results":"112","hashOfConfig":"70"},{"size":3033,"mtime":1775882069874,"results":"113","hashOfConfig":"70"},{"size":1907,"mtime":1775878592519,"results":"114","hashOfConfig":"70"},{"size":30144,"mtime":1775984538667,"results":"115","hashOfConfig":"70"},{"size":1047,"mtime":1775224756086,"results":"116","hashOfConfig":"70"},{"size":10330,"mtime":1776572525687,"results":"117","hashOfConfig":"70"},{"size":8410,"mtime":1775383418692,"results":"118","hashOfConfig":"70"},{"size":1661,"mtime":1775382857634,"results":"119","hashOfConfig":"70"},{"size":5070,"mtime":1776602716634,"results":"120","hashOfConfig":"70"},{"size":3773,"mtime":1775383419736,"results":"121","hashOfConfig":"70"},{"size":683,"mtime":1775383317477,"results":"122","hashOfConfig":"70"},{"size":9500,"mtime":1775383420349,"results":"123","hashOfConfig":"70"},{"size":14984,"mtime":1775382860520,"results":"124","hashOfConfig":"70"},{"size":6643,"mtime":1776602610352,"results":"125","hashOfConfig":"70"},{"size":5437,"mtime":1775382860586,"results":"126","hashOfConfig":"70"},{"size":429,"mtime":1775383291875,"results":"127","hashOfConfig":"70"},{"size":8415,"mtime":1775828714587,"results":"128","hashOfConfig":"70"},{"size":6935,"mtime":1776602862121,"results":"129","hashOfConfig":"70"},{"size":1359,"mtime":1775878592716,"results":"130","hashOfConfig":"70"},{"size":9135,"mtime":1775985879564,"results":"131","hashOfConfig":"70"},{"size":12119,"mtime":1776602943160,"results":"132","hashOfConfig":"70"},{"size":3623,"mtime":1776492469178,"results":"133","hashOfConfig":"70"},{"size":6871,"mtime":1775985883560,"results":"134","hashOfConfig":"70"},{"filePath":"135","messages":"136","suppressedMessages":"137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"oyxevq",{"filePath":"138","messages":"139","suppressedMessages":"140","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"f6a32r",{"filePath":"141","messages":"142","suppressedMessages":"143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"144","messages":"145","suppressedMessages":"146","errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"147","messages":"148","suppressedMessages":"149","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"150","messages":"151","suppressedMessages":"152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"153","messages":"154","suppressedMessages":"155","errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"156","messages":"157","suppressedMessages":"158","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"159","messages":"160","suppressedMessages":"161","errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"162","messages":"163","suppressedMessages":"164","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"165","messages":"166","suppressedMessages":"167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"168","messages":"169","suppressedMessages":"170","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"171","messages":"172","suppressedMessages":"173","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"174","messages":"175","suppressedMessages":"176","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"177","messages":"178","suppressedMessages":"179","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"180","messages":"181","suppressedMessages":"182","errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"183","messages":"184","suppressedMessages":"185","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"186","messages":"187","suppressedMessages":"188","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"189","messages":"190","suppressedMessages":"191","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"192","messages":"193","suppressedMessages":"194","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"195","messages":"196","suppressedMessages":"197","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"198","messages":"199","suppressedMessages":"200","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"201","messages":"202","suppressedMessages":"203","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"204","messages":"205","suppressedMessages":"206","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"207","messages":"208","suppressedMessages":"209","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"210","messages":"211","suppressedMessages":"212","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"213","messages":"214","suppressedMessages":"215","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"216","messages":"217","suppressedMessages":"218","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"219","messages":"220","suppressedMessages":"221","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"222","messages":"223","suppressedMessages":"224","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"225","messages":"226","suppressedMessages":"227","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"228","messages":"229","suppressedMessages":"230","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"231","messages":"232","suppressedMessages":"233","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"234","messages":"235","suppressedMessages":"236","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"237","messages":"238","suppressedMessages":"239","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"240","messages":"241","suppressedMessages":"242","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"243","messages":"244","suppressedMessages":"245","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"246","messages":"247","suppressedMessages":"248","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"249","messages":"250","suppressedMessages":"251","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"252","messages":"253","suppressedMessages":"254","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"255","messages":"256","suppressedMessages":"257","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"258","messages":"259","suppressedMessages":"260","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"261","messages":"262","suppressedMessages":"263","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"264","messages":"265","suppressedMessages":"266","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"267","messages":"268","suppressedMessages":"269","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"270","messages":"271","suppressedMessages":"272","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"273","messages":"274","suppressedMessages":"275","errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"276","messages":"277","suppressedMessages":"278","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"279","messages":"280","suppressedMessages":"281","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"282","messages":"283","suppressedMessages":"284","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"285","messages":"286","suppressedMessages":"287","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"288","messages":"289","suppressedMessages":"290","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"291","messages":"292","suppressedMessages":"293","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"294","messages":"295","suppressedMessages":"296","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"297","messages":"298","suppressedMessages":"299","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"300","messages":"301","suppressedMessages":"302","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"303","messages":"304","suppressedMessages":"305","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"306","messages":"307","suppressedMessages":"308","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"309","messages":"310","suppressedMessages":"311","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"312","messages":"313","suppressedMessages":"314","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"315","messages":"316","suppressedMessages":"317","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"318","messages":"319","suppressedMessages":"320","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"321","messages":"322","suppressedMessages":"323","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"324","messages":"325","suppressedMessages":"326","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"327","messages":"328","suppressedMessages":"329","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"330","messages":"331","suppressedMessages":"332","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"E:\\Document\\Coding\\SecScore\\eslint.config.mjs",[],[],"E:\\Document\\Coding\\SecScore\\src\\App.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\ClientContext.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\BoardManager.tsx",["333","334"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ContentArea.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\EventHistory.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Home.tsx",["335","336","337"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Leaderboard.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\OOBE\\OOBE.tsx",["338","339"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\OOBE\\OOBEBackground.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ReasonManager.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\RewardExchange.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\RewardSettings.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ScoreManager.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Settings.tsx",["340"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\SettlementHistory.tsx",["341","342"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Sidebar.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\StudentManager.tsx",["343"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\TagEditorDialog.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ThemeEditor.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ThemeQuickSettings.tsx",["344"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\TitleBar.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Versions.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\WindowControls.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\Wizard.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\contexts\\ServiceContext.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\contexts\\ThemeContext.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\contexts\\ThemeEditorContext.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\env.d.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\hooks\\useResponsive.ts",["345"],[],"E:\\Document\\Coding\\SecScore\\src\\i18n\\index.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\main.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\preload\\types.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\react-19-patch.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\StudentService.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\shared\\kernel.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\shared\\mobileNavigation.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\utils\\color.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\utils\\studentAvatar.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\workers\\xlsxWorker.ts",[],[],"E:\\Document\\Coding\\SecScore\\vite.config.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\ActionEditor.tsx",["346"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\AutoScoreUtils.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\IntervalValueCodec.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\IntervalValueWidget.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScore\\TriggerRuleBuilder.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\AutoScoreManager.tsx",["347","348","349"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\OAuth\\OAuthCallback.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\OAuth\\OAuthLogin.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\SectlCloudStorageManager.tsx",["350"],[],"E:\\Document\\Coding\\SecScore\\src\\components\\SectlLoginButton.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\SectlSettingsPanel.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\contexts\\SectlContext.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\sectl.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\sectlAuth.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\sectlCloudStorage.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\sectlKVStorage.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\services\\sectlNotification.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\views\\SectlCloudView.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\ScoreSyncPanel.tsx",["351"],[],"E:\\Document\\Coding\\SecScore\\src\\services\\scoreSyncService.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\shared\\fontFamily.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\PluginManager.tsx",[],[],"E:\\Document\\Coding\\SecScore\\src\\components\\SectlKVStorageManager.tsx",["352"],[],"E:\\Document\\Coding\\SecScore\\src\\hooks\\useOAuthPersist.ts",[],[],"E:\\Document\\Coding\\SecScore\\src\\plugins\\runtime.ts",[],[],{"ruleId":"353","severity":1,"message":"354","line":635,"column":6,"nodeType":"355","endLine":635,"endColumn":44,"suggestions":"356"},{"ruleId":"353","severity":1,"message":"354","line":643,"column":6,"nodeType":"355","endLine":643,"endColumn":59,"suggestions":"357"},{"ruleId":"353","severity":1,"message":"358","line":556,"column":6,"nodeType":"355","endLine":556,"endColumn":76,"suggestions":"359"},{"ruleId":"353","severity":1,"message":"360","line":580,"column":6,"nodeType":"355","endLine":580,"endColumn":15,"suggestions":"361"},{"ruleId":"353","severity":1,"message":"362","line":2418,"column":6,"nodeType":"355","endLine":2418,"endColumn":8,"suggestions":"363"},{"ruleId":"353","severity":1,"message":"364","line":160,"column":6,"nodeType":"355","endLine":160,"endColumn":20,"suggestions":"365"},{"ruleId":"353","severity":1,"message":"366","line":334,"column":5,"nodeType":"355","endLine":334,"endColumn":27,"suggestions":"367"},{"ruleId":"353","severity":1,"message":"368","line":414,"column":6,"nodeType":"355","endLine":414,"endColumn":8,"suggestions":"369"},{"ruleId":"353","severity":1,"message":"370","line":54,"column":6,"nodeType":"355","endLine":54,"endColumn":18,"suggestions":"371"},{"ruleId":"353","severity":1,"message":"360","line":106,"column":5,"nodeType":"355","endLine":106,"endColumn":7,"suggestions":"372"},{"ruleId":"353","severity":1,"message":"373","line":1373,"column":6,"nodeType":"355","endLine":1373,"endColumn":50,"suggestions":"374"},{"ruleId":"353","severity":1,"message":"364","line":100,"column":6,"nodeType":"355","endLine":100,"endColumn":20,"suggestions":"375"},{"ruleId":"353","severity":1,"message":"376","line":25,"column":9,"nodeType":"377","endLine":25,"endColumn":70},{"ruleId":"353","severity":1,"message":"378","line":23,"column":9,"nodeType":"377","endLine":23,"endColumn":63},{"ruleId":"353","severity":1,"message":"360","line":167,"column":5,"nodeType":"355","endLine":167,"endColumn":55,"suggestions":"379"},{"ruleId":"353","severity":1,"message":"380","line":329,"column":6,"nodeType":"355","endLine":329,"endColumn":15,"suggestions":"381"},{"ruleId":"353","severity":1,"message":"382","line":393,"column":6,"nodeType":"355","endLine":393,"endColumn":55,"suggestions":"383"},{"ruleId":"353","severity":1,"message":"384","line":79,"column":6,"nodeType":"355","endLine":79,"endColumn":23,"suggestions":"385"},{"ruleId":"353","severity":1,"message":"386","line":69,"column":6,"nodeType":"355","endLine":69,"endColumn":23,"suggestions":"387"},{"ruleId":"353","severity":1,"message":"388","line":99,"column":6,"nodeType":"355","endLine":99,"endColumn":31,"suggestions":"389"},"react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'activeBoard'. Either include it or remove the dependency array.","ArrayExpression",["390"],["391"],"React Hook useMemo has an unnecessary dependency: 'layoutType'. Either exclude it or remove the dependency array.",["392"],"React Hook useMemo has a missing dependency: 't'. Either include it or remove the dependency array.",["393"],"React Hook useEffect has missing dependencies: 'onGlobalMouseMove' and 'onGlobalMouseUp'. Either include them or remove the dependency array.",["394"],"React Hook useEffect has a missing dependency: 't'. Either include it or remove the dependency array.",["395"],"React Hook useCallback has missing dependencies: 'showOobeMessage' and 't'. Either include them or remove the dependency array.",["396"],"React Hook useEffect has a missing dependency: 'loadAll'. Either include it or remove the dependency array.",["397"],"React Hook useCallback has a missing dependency: 't'. Either include it or remove the dependency array.",["398"],["399"],"React Hook useMemo has missing dependencies: 'handleDelete', 'handleOpenAvatarEditor', 'handleOpenGroupEditor', and 'handleOpenTagEditor'. Either include them or remove the dependency array.",["400"],["401"],"The 'breakpoints' object makes the dependencies of useEffect Hook (at line 49) change on every render. Move it inside the useEffect callback. Alternatively, wrap the initialization of 'breakpoints' in its own useMemo() Hook.","VariableDeclarator","The 'safeValue' conditional could make the dependencies of useMemo Hook (at line 59) change on every render. To fix this, wrap the initialization of 'safeValue' in its own useMemo() Hook.",["402"],"React Hook useEffect has missing dependencies: 'fetchBatches', 'fetchRules', 'fetchStudents', and 'fetchTags'. Either include them or remove the dependency array.",["403"],"React Hook useEffect has missing dependencies: 'fetchBatches' and 'fetchRules'. Either include them or remove the dependency array.",["404"],"React Hook useEffect has missing dependencies: 'loadFiles' and 'loadStorageUsage'. Either include them or remove the dependency array.",["405"],"React Hook useEffect has a missing dependency: 'checkCloudStatus'. Either include it or remove the dependency array.",["406"],"React Hook useEffect has a missing dependency: 'loadKVList'. Either include it or remove the dependency array.",["407"],{"desc":"408","fix":"409"},{"desc":"410","fix":"411"},{"desc":"412","fix":"413"},{"desc":"414","fix":"415"},{"desc":"416","fix":"417"},{"desc":"418","fix":"419"},{"desc":"420","fix":"421"},{"desc":"422","fix":"423"},{"desc":"424","fix":"425"},{"desc":"426","fix":"427"},{"desc":"428","fix":"429"},{"desc":"418","fix":"430"},{"desc":"431","fix":"432"},{"desc":"433","fix":"434"},{"desc":"435","fix":"436"},{"desc":"437","fix":"438"},{"desc":"439","fix":"440"},{"desc":"441","fix":"442"},"Update the dependencies array to be: [activeBoard, activeBoard.id, activeBoard.layout]",{"range":"443","text":"444"},"Update the dependencies array to be: [activeBoard, activeBoard.id, listConfigSignature, runAllInBoard]",{"range":"445","text":"446"},"Update the dependencies array to be: [sortedStudents, sortType, searchKeyword, getGroupName, t]",{"range":"447","text":"448"},"Update the dependencies array to be: [reasons, t]",{"range":"449","text":"450"},"Update the dependencies array to be: [onGlobalMouseMove, onGlobalMouseUp]",{"range":"451","text":"452"},"Update the dependencies array to be: [currentTheme, t]",{"range":"453","text":"454"},"Update the dependencies array to be: [students, showOobeMessage, t]",{"range":"455","text":"456"},"Update the dependencies array to be: [loadAll]",{"range":"457","text":"458"},"Update the dependencies array to be: [messageApi, t]",{"range":"459","text":"460"},"Update the dependencies array to be: [t]",{"range":"461","text":"462"},"Update the dependencies array to be: [t, isMobile, canEdit, handleOpenTagEditor, handleOpenGroupEditor, handleOpenAvatarEditor, handleDelete]",{"range":"463","text":"464"},{"range":"465","text":"454"},"Update the dependencies array to be: [t, tagOptions]",{"range":"466","text":"467"},"Update the dependencies array to be: [canEdit, fetchBatches, fetchRules, fetchStudents, fetchTags]",{"range":"468","text":"469"},"Update the dependencies array to be: [backfillPrompted, canEdit, fetchBatches, fetchRules, messageApi, rules, t]",{"range":"470","text":"471"},"Update the dependencies array to be: [isAuthenticated, loadFiles, loadStorageUsage]",{"range":"472","text":"473"},"Update the dependencies array to be: [checkCloudStatus, isAuthenticated]",{"range":"474","text":"475"},"Update the dependencies array to be: [isAuthenticated, loadKVList, prefix]",{"range":"476","text":"477"},[18439,18477],"[activeBoard, activeBoard.id, activeBoard.layout]",[18687,18740],"[activeBoard, activeBoard.id, listConfigSignature, runAllInBoard]",[17285,17355],"[sortedStudents, sortType, searchKeyword, getGroupName, t]",[18130,18139],"[reasons, t]",[77698,77700],"[onGlobalMouseMove, onGlobalMouseUp]",[4674,4688],"[currentTheme, t]",[10389,10411],"[students, showOobeMessage, t]",[13208,13210],"[loadAll]",[1697,1709],"[messageApi, t]",[3343,3345],"[t]",[46442,46486],"[t, isMobile, canEdit, handleOpenTagEditor, handleOpenGroupEditor, handleOpenAvatarEditor, handleDelete]",[3185,3199],[4240,4290],"[t, tagOptions]",[9181,9190],"[canEdit, fetchBatches, fetchRules, fetchStudents, fetchTags]",[11353,11402],"[backfillPrompted, canEdit, fetchBatches, fetchRules, messageApi, rules, t]",[1826,1843],"[isAuthenticated, loadFiles, loadStorageUsage]",[1783,1800],"[checkCloudStatus, isAuthenticated]",[2216,2241],"[isAuthenticated, loadKVList, prefix]"] \ No newline at end of file diff --git a/src/components/SectlKVStorageManager.tsx b/src/components/SectlKVStorageManager.tsx new file mode 100644 index 0000000..6a44b4c --- /dev/null +++ b/src/components/SectlKVStorageManager.tsx @@ -0,0 +1,436 @@ +/** + * SECTL KV 存储管理组件 + * 基于 SECTL-One-Stop SDK 规范实现 + */ + +import React, { useState, useEffect } from "react" +import { + Card, + Table, + Button, + Space, + Modal, + Input, + message, + Popconfirm, + Typography, + Tag, + Form, + Switch, + InputNumber, + Tooltip, +} from "antd" +import { + DatabaseOutlined, + PlusOutlined, + DeleteOutlined, + EditOutlined, + ReloadOutlined, + CodeOutlined, + FieldStringOutlined, +} from "@ant-design/icons" +import { sectlKVStorage, KVItem, ListKVOptions } from "../services/sectlKVStorage" +import { useSectl } from "../contexts/SectlContext" + +const { Title, Text } = Typography +const { TextArea } = Input + +export const SectlKVStorageManager: React.FC = () => { + const { isAuthenticated } = useSectl() + const [kvList, setKvList] = useState([]) + const [loading, setLoading] = useState(false) + const [total, setTotal] = useState(0) + const [hasMore, setHasMore] = useState(false) + const [offset, setOffset] = useState(0) + const [prefix, setPrefix] = useState("") + + // 编辑/创建对话框状态 + const [editModal, setEditModal] = useState<{ + visible: boolean + isEdit: boolean + key?: string + }>({ visible: false, isEdit: false }) + + // 查看详情对话框状态 + const [detailModal, setDetailModal] = useState<{ + visible: boolean + item?: KVItem + }>({ visible: false }) + + // 表单 + const [form] = Form.useForm() + + // 加载 KV 列表 + const loadKVList = async (resetOffset = false) => { + if (!isAuthenticated) return + + try { + setLoading(true) + const currentOffset = resetOffset ? 0 : offset + const options: ListKVOptions = { + limit: 20, + offset: currentOffset, + } + if (prefix) { + options.prefix = prefix + } + + const result = await sectlKVStorage.listKV(options) + setKvList(resetOffset ? result.kv_list : [...kvList, ...result.kv_list]) + setTotal(result.total) + setHasMore(result.has_more) + if (resetOffset) { + setOffset(20) + } else { + setOffset(currentOffset + 20) + } + } catch (error: any) { + message.error(`加载键值对列表失败:${error.message}`) + } finally { + setLoading(false) + } + } + + // 初始加载 + useEffect(() => { + if (isAuthenticated) { + loadKVList(true) + } + }, [isAuthenticated, prefix]) + + // 处理创建/更新 + const handleSave = async (values: { + key: string + value: string + isJson: boolean + ttl?: number + }) => { + try { + let parsedValue: unknown + + if (values.isJson) { + try { + parsedValue = JSON.parse(values.value) + } catch { + message.error("JSON 格式无效") + return + } + } else { + parsedValue = values.value + } + + await sectlKVStorage.setKV(values.key, parsedValue, values.ttl) + message.success(editModal.isEdit ? "键值对已更新" : "键值对已创建") + setEditModal({ visible: false, isEdit: false }) + form.resetFields() + loadKVList(true) + } catch (error: any) { + message.error(`保存失败:${error.message}`) + } + } + + // 处理删除 + const handleDelete = async (key: string) => { + try { + await sectlKVStorage.deleteKV(key) + message.success("键值对已删除") + loadKVList(true) + } catch (error: any) { + message.error(`删除失败:${error.message}`) + } + } + + // 打开编辑对话框 + const openEditModal = (item: KVItem) => { + form.setFieldsValue({ + key: item.key, + value: item.is_json ? JSON.stringify(item.value, null, 2) : String(item.value), + isJson: item.is_json, + }) + setEditModal({ visible: true, isEdit: true, key: item.key }) + } + + // 打开创建对话框 + const openCreateModal = () => { + form.resetFields() + form.setFieldsValue({ isJson: true }) + setEditModal({ visible: true, isEdit: false }) + } + + // 打开详情对话框 + const openDetailModal = (item: KVItem) => { + setDetailModal({ visible: true, item }) + } + + // 格式化值显示 + const formatValue = (value: unknown, isJson: boolean): string => { + if (isJson) { + return JSON.stringify(value).slice(0, 100) + (JSON.stringify(value).length > 100 ? "..." : "") + } + return String(value).slice(0, 100) + (String(value).length > 100 ? "..." : "") + } + + // 表格列定义 + const columns = [ + { + title: "键名", + dataIndex: "key", + key: "key", + render: (text: string, record: KVItem) => ( + + + openDetailModal(record)}>{text} + + ), + }, + { + title: "类型", + dataIndex: "is_json", + key: "is_json", + width: 100, + render: (isJson: boolean) => + isJson ? ( + }> + JSON + + ) : ( + }>文本 + ), + }, + { + title: "大小", + dataIndex: "size", + key: "size", + width: 100, + render: (size: number) => { + if (size < 1024) return `${size} B` + if (size < 1024 * 1024) return `${(size / 1024).toFixed(2)} KB` + return `${(size / (1024 * 1024)).toFixed(2)} MB` + }, + }, + { + title: "值预览", + dataIndex: "value", + key: "value", + ellipsis: true, + render: (_: unknown, record: KVItem) => ( + + {formatValue(record.value, record.is_json)} + + ), + }, + { + title: "更新时间", + dataIndex: "updated_at", + key: "updated_at", + width: 180, + render: (text: string) => new Date(text).toLocaleString("zh-CN"), + }, + { + title: "操作", + key: "action", + width: 150, + render: (_: unknown, record: KVItem) => ( + + + + + + } + > + {/* 统计信息 */} +
+ + 共 {total} 个键值对 + {hasMore && `(已加载 ${kvList.length} 个)`} + +
+ + {/* KV 列表 */} + + + {/* 加载更多 */} + {hasMore && ( +
+ +
+ )} + + + {/* 创建/编辑对话框 */} + form.submit()} + onCancel={() => { + setEditModal({ visible: false, isEdit: false }) + form.resetFields() + }} + okText="保存" + cancelText="取消" + width={600} + > +
+ + + + + + + + + +