Просмотр исходного кода

Merge pull request #6126 from weseek/feat/98658-show-searchable-viewable-actions

feat: Show searchable and viewable actions
Yuki Takei 3 лет назад
Родитель
Сommit
bcf9b5de17

+ 4 - 1
packages/app/public/static/locales/en_US/admin/admin.json

@@ -532,6 +532,9 @@
     "return": "Return",
     "activity_expiration_date": "Audit Log expiration date",
     "activity_expiration_date_explain": "Created Audit Log are automatically deleted after the number of seconds set in the environment variable from the creation time",
-    "fixed_by_env_var": "This is fixed by the env var <code>{{key}}={{value}}</code>."
+    "fixed_by_env_var": "This is fixed by the env var <code>{{key}}={{value}}</code>.",
+    "available_action_list": "Search / View All Available Actions",
+    "available_action_list_explain": "List of actions that can be search / view in the Audit Log",
+    "action_list": "Action List"
   }
 }

+ 4 - 1
packages/app/public/static/locales/ja_JP/admin/admin.json

@@ -531,6 +531,9 @@
     "return": "戻る",
     "activity_expiration_date": "監査ログの有効期限",
     "activity_expiration_date_explain": "作成された監査ログは、作成時間から環境変数に設定した秒数後に自動的に削除されます",
-    "fixed_by_env_var": "環境変数により固定されています <code>{{key}}={{value}}</code>."
+    "fixed_by_env_var": "環境変数により固定されています <code>{{key}}={{value}}</code>.",
+    "available_action_list": "検索 / 表示 可能なアクション一覧",
+    "available_action_list_explain": "監査ログで 検索 / 表示 可能なアクション一覧です",
+    "action_list": "アクション一覧"
   }
 }

+ 4 - 1
packages/app/public/static/locales/zh_CN/admin/admin.json

@@ -541,6 +541,9 @@
     "return": "返回",
     "activity_expiration_date": "审计日志的到期日",
     "activity_expiration_date_explain": "创建的审计日志会在环境变量中设置的从创建时间算起的秒数后自动删除",
-    "fixed_by_env_var": "这是由env var 修复的 <code>{{key}}={{value}}</code>."
+    "fixed_by_env_var": "这是由env var 修复的 <code>{{key}}={{value}}</code>.",
+    "available_action_list": "搜索/查看 所有可用的行动",
+    "available_action_list_explain": "可以在审计日志中 搜索/查看 的行动列表",
+    "action_list": "行动清单"
   }
 }

+ 2 - 0
packages/app/src/client/services/ContextExtractor.tsx

@@ -19,6 +19,7 @@ import {
   useNotFoundTargetPathOrId, useIsSearchPage, useIsForbidden, useIsIdenticalPath, useHasParent,
   useIsAclEnabled, useIsSearchServiceConfigured, useIsSearchServiceReachable, useIsEnabledAttachTitleHeader, useIsNotFoundPermalink,
   useDefaultIndentSize, useIsIndentSizeForced, useCsrfToken, useIsEmptyPage, useEmptyPageId, useGrowiVersion, useActivityExpirationSeconds,
+  useAuditLogAvailableActions,
 } from '../../stores/context';
 
 const { isTrashPage: _isTrashPage } = pagePathUtils;
@@ -124,6 +125,7 @@ const ContextExtractorOnce: FC = () => {
   useIsIndentSizeForced(configByContextHydrate.isIndentSizeForced);
   useDefaultIndentSize(configByContextHydrate.adminPreferredIndentSize);
   useActivityExpirationSeconds(configByContextHydrate.activityExpirationSeconds);
+  useAuditLogAvailableActions(configByContextHydrate.auditLogAvailableActions);
   useGrowiVersion(configByContextHydrate.crowi.version);
 
   // Page

+ 25 - 3
packages/app/src/components/Admin/AuditLog/AuditLogSettings.tsx

@@ -1,18 +1,24 @@
-import React, { FC } from 'react';
+import React, { FC, useState } from 'react';
 
 import { useTranslation } from 'react-i18next';
+import { Collapse } from 'reactstrap';
 
-import { useActivityExpirationSeconds } from '~/stores/context';
+import { useActivityExpirationSeconds, useAuditLogAvailableActions } from '~/stores/context';
 
 export const AuditLogSettings: FC = () => {
   const { t } = useTranslation();
 
+  const [isExpandActionList, setIsExpandActionList] = useState(false);
+
   const { data: activityExpirationSecondsData } = useActivityExpirationSeconds();
   const activityExpirationSeconds = activityExpirationSecondsData != null ? activityExpirationSecondsData : 2592000;
 
+  const { data: availableActionsData } = useAuditLogAvailableActions();
+  const availableActions = availableActionsData != null ? availableActionsData : [];
+
   return (
     <>
-      <h4>{t('admin:audit_log_management.activity_expiration_date')}</h4>
+      <h4 className="mt-4">{t('admin:audit_log_management.activity_expiration_date')}</h4>
       <p className="form-text text-muted">
         {t('admin:audit_log_management.activity_expiration_date_explain')}
       </p>
@@ -27,6 +33,22 @@ export const AuditLogSettings: FC = () => {
           }}
         />
       </p>
+
+      <h4 className="mt-4">{t('admin:audit_log_management.available_action_list')}</h4>
+      <p className="form-text text-muted">{t('admin:audit_log_management.available_action_list_explain')}</p>
+      <p className="mt-1">
+        <button type="button" className="btn btn-link p-0" aria-expanded="false" onClick={() => setIsExpandActionList(!isExpandActionList)}>
+          <i className={`fa fa-fw fa-arrow-right ${isExpandActionList ? 'fa-rotate-90' : ''}`}></i>
+          { t('admin:audit_log_management.action_list') }
+        </button>
+      </p>
+      <Collapse isOpen={isExpandActionList}>
+        <ul className="list-group">
+          { availableActions.map(action => (
+            <li key={action} className="list-group-item">{ action }</li>
+          )) }
+        </ul>
+      </Collapse>
     </>
   );
 };

+ 1 - 0
packages/app/src/server/models/config.ts

@@ -246,6 +246,7 @@ schema.statics.getLocalconfig = function(crowi) {
     pageLimitationL: crowi.configManager.getConfig('crowi', 'customize:showPageLimitationL'),
     pageLimitationXL: crowi.configManager.getConfig('crowi', 'customize:showPageLimitationXL'),
     activityExpirationSeconds: crowi.configManager.getConfig('crowi', 'app:activityExpirationSeconds'),
+    auditLogAvailableActions: crowi.activityService.getAvailableActions(false),
     isSidebarDrawerMode: crowi.configManager.getConfig('crowi', 'customize:isSidebarDrawerMode'),
     isSidebarClosedAtDockMode: crowi.configManager.getConfig('crowi', 'customize:isSidebarClosedAtDockMode'),
   };

+ 6 - 0
packages/app/src/stores/context.tsx

@@ -3,6 +3,8 @@ import { Key, SWRResponse } from 'swr';
 import useSWRImmutable from 'swr/immutable';
 
 
+import { SupportedActionType } from '~/interfaces/activity';
+
 import { TargetAndAncestors, IsNotFoundPermalink } from '../interfaces/page-listing-results';
 import { IUser } from '../interfaces/user';
 
@@ -179,6 +181,10 @@ export const useActivityExpirationSeconds = (initialData?: number) : SWRResponse
   return useStaticSWR<number, Error>('activityExpirationSeconds', initialData);
 };
 
+export const useAuditLogAvailableActions = (initialData?: Array<SupportedActionType>) : SWRResponse<Array<SupportedActionType>, Error> => {
+  return useStaticSWR<Array<SupportedActionType>, Error>('auditLogAvailableActions', initialData);
+};
+
 export const useGrowiVersion = (initialData?: string): SWRResponse<string, any> => {
   return useStaticSWR('growiVersion', initialData);
 };