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

Merge pull request #4269 from weseek/imprv/7347-on-off-schema

personal-setting.js, EditorSettings.tsx
Yuki Takei 4 лет назад
Родитель
Сommit
c0c08d2295

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

@@ -213,14 +213,10 @@ 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 database is empty, add default rules to state
-    if (data?.textlintSettings?.textlintRules == null) {
-
+    if (retrievedRules != null && retrievedRules.length > 0) {
       const createRulesFromDefaultList = (rule: { name: string }) => (
         {
           name: rule.name,
@@ -232,15 +228,19 @@ const EditorSettingsBody: FC<EditorSettingsBodyProps> = (props) => {
       const defaultJapaneseRules = japaneseRulesMenuItems.map(rule => createRulesFromDefaultList(rule));
       setTextlintRules([...defaultCommonRules, ...defaultJapaneseRules]);
     }
+    else {
+      setTextlintRules(retrievedRules);
+    }
+
   }, [appContainer]);
 
   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' }));
     }

+ 19 - 6
packages/app/src/server/routes/apiv3/personal-setting.js

@@ -485,13 +485,26 @@ module.exports = (crowi) => {
    *                      description: editor settings
    */
   router.put('/editor-settings', accessTokenParser, loginRequiredStrictly, csrf, validator.editorSettings, apiV3FormValidator, async(req, res) => {
+    const query = { userId: req.user.id };
+    const textlintSettings = req.body.textlintSettings;
+    const document = {};
+
+    if (textlintSettings == null) {
+      return res.apiv3Err('no-settings-found');
+    }
+
+    if (textlintSettings.isTextlintEnabled != null) {
+      Object.assign(document, { 'textlintSettings.isTextlintEnabled': textlintSettings.isTextlintEnabled });
+    }
+    if (textlintSettings.textlintRules != null) {
+      Object.assign(document, { '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 };
     try {
-      const query = { userId: req.user.id };
-      const update = req.body;
-      // 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: document }, options);
       return res.apiv3(response);
     }
     catch (err) {