فهرست منبع

personal-setting.js, EditorSettings.tsx

Steven Fukase 4 سال پیش
والد
کامیت
11ee742714
2فایلهای تغییر یافته به همراه22 افزوده شده و 10 حذف شده
  1. 6 6
      packages/app/src/components/Me/EditorSettings.tsx
  2. 16 4
      packages/app/src/server/routes/apiv3/personal-setting.js

+ 6 - 6
packages/app/src/components/Me/EditorSettings.tsx

@@ -213,13 +213,13 @@ const EditorSettingsBody: FC<EditorSettingsBodyProps> = (props) => {
 
   const initializeEditorSettings = useCallback(async() => {
     const { data } = await appContainer.apiv3Get('/personal-setting/editor-settings');
-
-    if (data?.textlintSettings?.textlintRules != null) {
-      setTextlintRules(data.textlintSettings.textlintRules);
+    const retrievedRules: LintRule[] = data?.textlintSettings?.textlintRules;
+    if (retrievedRules != null) {
+      setTextlintRules(retrievedRules);
     }
 
     // If database is empty, add default rules to state
-    if (data?.textlintSettings?.textlintRules == null) {
+    if (retrievedRules?.length === 0 || retrievedRules == null) {
 
       const createRulesFromDefaultList = (rule: { name: string }) => (
         {
@@ -236,11 +236,11 @@ const EditorSettingsBody: FC<EditorSettingsBodyProps> = (props) => {
 
   useEffect(() => {
     initializeEditorSettings();
-  }, []);
+  }, [initializeEditorSettings]);
 
   const updateRulesHandler = async() => {
     try {
-      const { data } = await appContainer.apiv3Put('/personal-setting/editor-settings', { textlintSettings: textlintRules });
+      const { data } = await appContainer.apiv3Put('/personal-setting/editor-settings', { textlintSettings: { textlintRules: [...textlintRules] } });
       setTextlintRules(data.textlintSettings.textlintRules);
       toastSuccess(t('toaster.update_successed', { target: 'Updated Textlint Settings' }));
     }

+ 16 - 4
packages/app/src/server/routes/apiv3/personal-setting.js

@@ -1,4 +1,4 @@
-import { body } from 'express-validator';
+import { body, checkSchema } from 'express-validator';
 
 import loggerFactory from '~/utils/logger';
 
@@ -101,7 +101,10 @@ module.exports = (crowi) => {
       body('accountId').isString().not().isEmpty(),
     ],
     editorSettings: [
-      body('isTextlintEnabled').isBoolean(),
+      body('editorSettings.isTextlintEnabled').isBoolean(),
+      body('editorSettings.textlintRules.name').isString(),
+      body('editorSettings.textlintRules.options').isJSON(),
+      body('editorSettings.textlintRules.isEnabled').isBoolean(),
     ],
   };
 
@@ -487,11 +490,20 @@ module.exports = (crowi) => {
   router.put('/editor-settings', accessTokenParser, loginRequiredStrictly, csrf, validator.editorSettings, apiV3FormValidator, async(req, res) => {
     try {
       const query = { userId: req.user.id };
-      const update = req.body;
+      const textlintSettings = req.body?.textlintSettings;
+      const update = {};
+
+      if (textlintSettings?.isTextlintEnabled != null) {
+        Object.assign(update, { 'textlintSettings.isTextlintEnabled': textlintSettings.isTextlintEnabled });
+      }
+      if (textlintSettings?.textlintRules != null) {
+        Object.assign(update, { 'textlintSettings.textlintRules': textlintSettings.textlintRules });
+      }
+
       // Insert if document does not exist, and return new values
       // See: https://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate
       const options = { upsert: true, new: true };
-      const response = await EditorSettings.findOneAndUpdate(query, update, options);
+      const response = await EditorSettings.findOneAndUpdate(query, { $set: update }, options);
       return res.apiv3(response);
     }
     catch (err) {