This is an automated email from the ASF dual-hosted git repository.

linkinstar pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/answer.git

commit f238aa50510ccf054f296b92e31c9dd8f1ac7f4f
Author: Dinesht04 <[email protected]>
AuthorDate: Thu Oct 16 23:06:22 2025 +0530

    feat(ui,internal): add min_content property in site info
---
 i18n/en_US.yaml                    |  5 ++++-
 internal/migrations/init.go        |  1 +
 internal/migrations/v28.go         |  2 ++
 internal/schema/siteinfo_schema.go |  1 +
 ui/src/common/interface.ts         |  1 +
 ui/src/pages/Admin/Write/index.tsx | 33 ++++++++++++++++++++++++++++-----
 ui/src/stores/writeSetting.ts      |  1 +
 7 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml
index 146cd0af..5f694ea2 100644
--- a/i18n/en_US.yaml
+++ b/i18n/en_US.yaml
@@ -2122,13 +2122,16 @@ ui:
         ask_before_display: Ask before displaying external content
     write:
       page_title: Write
+      min_content:
+        label: Minimum question body length
+        text: Minimum allowed question body length in characters. 
       restrict_answer:
         title: Answer write
         label: Each user can only write one answer for the same question
         text: "Turn off to allow users to write multiple answers to the same 
question, which may cause answers to be unfocused."
       min_tags:
         label: "Minimum tags per question"
-        text: "Minimum number of tags required in a question"
+        text: "Minimum number of tags required in a question."
       recommend_tags:
         label: Recommend tags
         text: "Recommend tags will show in the dropdown list by default."
diff --git a/internal/migrations/init.go b/internal/migrations/init.go
index a14a371d..392ecb2c 100644
--- a/internal/migrations/init.go
+++ b/internal/migrations/init.go
@@ -289,6 +289,7 @@ func (m *Mentor) initSiteInfoPrivilegeRank() {
 
 func (m *Mentor) initSiteInfoWrite() {
        writeData := map[string]interface{}{
+               "min_content":                      6,
                "restrict_answer":                  true,
                "min_tags":                         1,
                "required_tag":                     false,
diff --git a/internal/migrations/v28.go b/internal/migrations/v28.go
index 8b834afa..0fa8ef88 100644
--- a/internal/migrations/v28.go
+++ b/internal/migrations/v28.go
@@ -41,6 +41,7 @@ func addOptionalTags(ctx context.Context, x *xorm.Engine) 
error {
        }
        if exist {
                type OldSiteWriteReq struct {
+                       MinimumContent                 int                    
`json:"min_content"`
                        RestrictAnswer                 bool                   
`json:"restrict_answer"`
                        MinimumTags                    int                    
`json:"min_tags"`
                        RequiredTag                    bool                   
`json:"required_tag"`
@@ -55,6 +56,7 @@ func addOptionalTags(ctx context.Context, x *xorm.Engine) 
error {
                content := &OldSiteWriteReq{}
                _ = json.Unmarshal([]byte(writeSiteInfo.Content), content)
                content.MinimumTags = 1
+               content.MinimumContent = 6
                data, _ := json.Marshal(content)
                writeSiteInfo.Content = string(data)
                _, err = 
x.Context(ctx).ID(writeSiteInfo.ID).Cols("content").Update(writeSiteInfo)
diff --git a/internal/schema/siteinfo_schema.go 
b/internal/schema/siteinfo_schema.go
index 1ecd9760..d946589d 100644
--- a/internal/schema/siteinfo_schema.go
+++ b/internal/schema/siteinfo_schema.go
@@ -75,6 +75,7 @@ type SiteBrandingReq struct {
 
 // SiteWriteReq site write request
 type SiteWriteReq struct {
+       MinimumContent                 int             `validate:"omitempty" 
json:"min_content"`
        RestrictAnswer                 bool            `validate:"omitempty" 
json:"restrict_answer"`
        MinimumTags                    int             `validate:"omitempty" 
json:"min_tags"`
        RequiredTag                    bool            `validate:"omitempty" 
json:"required_tag"`
diff --git a/ui/src/common/interface.ts b/ui/src/common/interface.ts
index bade01ea..b5a242e4 100644
--- a/ui/src/common/interface.ts
+++ b/ui/src/common/interface.ts
@@ -440,6 +440,7 @@ export interface AdminSettingsLegal {
 export interface AdminSettingsWrite {
   restrict_answer?: boolean;
   min_tags?: number,
+  min_content?:number,
   recommend_tags?: Tag[];
   required_tag?: boolean;
   reserved_tags?: Tag[];
diff --git a/ui/src/pages/Admin/Write/index.tsx 
b/ui/src/pages/Admin/Write/index.tsx
index 15c0c2a6..86d44d6d 100644
--- a/ui/src/pages/Admin/Write/index.tsx
+++ b/ui/src/pages/Admin/Write/index.tsx
@@ -37,6 +37,11 @@ const initFormData = {
     errorMsg: '',
     isInvalid: false,
   },
+  min_content: {
+    value: 0,
+    errorMsg: '',
+    isInvalid: false,
+  },
   min_tags: {
     value: 0,
     errorMsg: '',
@@ -142,6 +147,7 @@ const Index: FC = () => {
       reserved_tags: formData.reserved_tags.value,
       required_tag: formData.required_tag.value,
       restrict_answer: formData.restrict_answer.value,
+      min_content: Number(formData.min_content.value),
       max_image_size: Number(formData.max_image_size.value),
       max_attachment_size: Number(formData.max_attachment_size.value),
       max_image_megapixel: Number(formData.max_image_megapixel.value),
@@ -183,6 +189,7 @@ const Index: FC = () => {
       if (Array.isArray(res.recommend_tags)) {
         formData.recommend_tags.value = res.recommend_tags;
       }
+      formData.min_content.value = res.min_content;
       formData.min_tags.value = res.min_tags;
       formData.required_tag.value = res.required_tag;
       formData.restrict_answer.value = res.restrict_answer;
@@ -204,10 +211,6 @@ const Index: FC = () => {
     initData();
   }, []);
 
-  // const handleOnChange = (data) => {
-  //   setFormData(data);
-  // };
-
   return (
     <>
       <h3 className="mb-4">{t('page_title')}</h3>
@@ -295,7 +298,27 @@ const Index: FC = () => {
             {formData.required_tag.errorMsg}
           </Form.Control.Feedback>
         </Form.Group>
-
+        <Form.Group className="mb-3" controlId="min_content">
+          <Form.Label>{t('min_content.label')}</Form.Label>
+          <Form.Control
+            type="number"
+            value={formData.min_content.value}
+            isInvalid={formData.min_content.isInvalid}
+            onChange={(evt) => {
+              handleValueChange({
+                min_content: {
+                  value: evt.target.value,
+                  errorMsg: '',
+                  isInvalid: false,
+                },
+              });
+            }}
+          />
+          <Form.Text>{t('min_content.text')}</Form.Text>
+          <Form.Control.Feedback type="invalid">
+            {formData.min_content.errorMsg}
+          </Form.Control.Feedback>
+        </Form.Group>
         <Form.Group className="mb-3" controlId="restrict_answer">
           <Form.Label>{t('restrict_answer.title')}</Form.Label>
           <Form.Switch
diff --git a/ui/src/stores/writeSetting.ts b/ui/src/stores/writeSetting.ts
index 9c44c964..9f6542d2 100644
--- a/ui/src/stores/writeSetting.ts
+++ b/ui/src/stores/writeSetting.ts
@@ -30,6 +30,7 @@ const Index = create<IProps>((set) => ({
   write: {
     restrict_answer: true,
     min_tags: 1,
+    min_content: 6,
     recommend_tags: [],
     required_tag: false,
     reserved_tags: [],

Reply via email to