Browse Source

Save for history, adding blog cats from right side

Vova Tkach 6 years ago
parent
commit
6f5b551cd7
4 changed files with 194 additions and 24 deletions
  1. 1 1
      assets/cp.styles.css
  2. 0 0
      assets/cp.styles.css.go
  3. 24 18
      modules/module_blog.go
  4. 169 5
      modules/module_blog_categories.go

+ 1 - 1
assets/cp.styles.css

@@ -427,7 +427,7 @@ ul.pagination {
 		margin-bottom: 0px;
 	}
 
-	.data-form.users .form-group.n7 {
+	.data-form.blog .form-group.n4 {
 		margin-bottom: 0px;
 	}
 }

File diff suppressed because it is too large
+ 0 - 0
assets/cp.styles.css.go


+ 24 - 18
modules/module_blog.go

@@ -57,7 +57,11 @@ func (this *Modules) RegisterModule_Blog() *Module {
 						DBField:     "name",
 						NameInTable: "Category",
 						CallBack: func(values *[]string) string {
-							sub := strings.Repeat("— ", utils.StrToInt((*values)[4]))
+							depth := utils.StrToInt((*values)[4]) - 1
+							if depth < 0 {
+								depth = 0
+							}
+							sub := strings.Repeat("&mdash; ", depth)
 							name := `<a href="/cp/` + wrap.CurrModule + `/categories-modify/` + (*values)[0] + `/">` + sub + html.EscapeString((*values)[2]) + `</a>`
 							return `<div>` + name + `</div>`
 						},
@@ -66,7 +70,8 @@ func (this *Modules) RegisterModule_Blog() *Module {
 						DBField: "alias",
 					},
 					{
-						DBField: "depth",
+						DBField:     "depth",
+						NameInTable: "depth",
 					},
 				},
 				func(values *[]string) string {
@@ -89,7 +94,7 @@ func (this *Modules) RegisterModule_Blog() *Module {
 				func() (int, error) {
 					var num int
 					var err error
-					err = wrap.DB.QueryRow("SELECT COUNT(*) FROM `blog_cats`;").Scan(&num)
+					err = wrap.DB.QueryRow("SELECT COUNT(*) FROM blog_cats WHERE id > 1;").Scan(&num)
 					return num, err
 				},
 				func(limit_offset int, pear_page int) (*sql.Rows, error) {
@@ -104,7 +109,8 @@ func (this *Modules) RegisterModule_Blog() *Module {
 							blog_cats AS node,
 							blog_cats AS parent
 						WHERE
-							node.lft BETWEEN parent.lft AND parent.rgt
+							node.lft BETWEEN parent.lft AND parent.rgt AND
+							node.id > 1
 						GROUP BY
 							node.id
 						ORDER BY
@@ -202,26 +208,13 @@ func (this *Modules) RegisterModule_Blog() *Module {
 					Name:  "id",
 					Value: utils.IntToStr(data.A_id),
 				},
-				{
-					Kind:    builder.DFKText,
-					Caption: "Name",
-					Name:    "name",
-					Value:   data.A_name,
-				},
-				{
-					Kind:    builder.DFKText,
-					Caption: "Alias",
-					Name:    "alias",
-					Value:   data.A_alias,
-					Hint:    "Example: popular-posts",
-				},
 				{
 					Kind:    builder.DFKText,
 					Caption: "Parent",
 					Name:    "parent",
 					Value:   "0",
 					CallBack: func(field *builder.DataFormField) string {
-						return `<div class="form-group last">
+						return `<div class="form-group n2">
 							<div class="row">
 								<div class="col-md-3">
 									<label for="lbl_parent">Parent</label>
@@ -238,6 +231,19 @@ func (this *Modules) RegisterModule_Blog() *Module {
 						</div>`
 					},
 				},
+				{
+					Kind:    builder.DFKText,
+					Caption: "Name",
+					Name:    "name",
+					Value:   data.A_name,
+				},
+				{
+					Kind:    builder.DFKText,
+					Caption: "Alias",
+					Name:    "alias",
+					Value:   data.A_alias,
+					Hint:    "Example: popular-posts",
+				},
 				{
 					Kind: builder.DFKMessage,
 				},

+ 169 - 5
modules/module_blog_categories.go

@@ -21,7 +21,8 @@ func (this *Modules) blog_GetCategorySelectOptions(wrap *wrapper.Wrapper, id int
 			blog_cats AS node,
 			blog_cats AS parent
 		WHERE
-			node.lft BETWEEN parent.lft AND parent.rgt
+			node.lft BETWEEN parent.lft AND parent.rgt AND
+			node.id > 1
 		GROUP BY
 			node.id
 		ORDER BY
@@ -47,7 +48,11 @@ func (this *Modules) blog_GetCategorySelectOptions(wrap *wrapper.Wrapper, id int
 				if string(values[0]) == parentIdStr {
 					selected = " selected"
 				}
-				sub := strings.Repeat("&mdash; ", utils.StrToInt(string(values[4])))
+				depth := utils.StrToInt(string(values[4])) - 1
+				if depth < 0 {
+					depth = 0
+				}
+				sub := strings.Repeat("&mdash; ", depth)
 				result += `<option value="` + html.EscapeString(string(values[0])) + `"` + disabled + selected + `>` + sub + html.EscapeString(string(values[2])) + `</option>`
 			}
 		}
@@ -79,13 +84,85 @@ func (this *Modules) blog_GetCategoryParentId(wrap *wrapper.Wrapper, id int) int
 }
 
 func (this *Modules) blog_ActionCategoryAdd(wrap *wrapper.Wrapper, pf_id, pf_name, pf_alias, pf_parent string) error {
-	//
+	// Start transaction with table lock
+	_, err := wrap.DB.Exec("LOCK TABLE blog_cats WRITE;")
+	if err != nil {
+		return err
+	}
+	tx, err := wrap.DB.Begin()
+	if err != nil {
+		return err
+	}
+
+	/*
+		// Update and insert new category
+		if _, err = tx.Exec("SELECT @ml := lft FROM blog_cats WHERE id = ?;", pf_parent); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2 WHERE rgt > @ml;"); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("UPDATE blog_cats SET lft = lft + 2 WHERE lft > @ml;"); err != nil {
+			tx.Rollback()
+			return err
+		}
+		if _, err = tx.Exec("INSERT INTO blog_cats (id, user, name, alias, lft, rgt) VALUES (NULL, ?, ?, ?, @ml + 1, @ml + 2);", wrap.User.A_id, pf_name, pf_alias); err != nil {
+			tx.Rollback()
+			return err
+		}
+	*/
+
+	// Update and insert new category
+	if _, err = tx.Exec("SELECT @mr := rgt FROM blog_cats WHERE id = ?;", pf_parent); err != nil {
+		tx.Rollback()
+		return err
+	}
+	if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2  WHERE rgt > @mr;"); err != nil {
+		tx.Rollback()
+		return err
+	}
+	if _, err = tx.Exec("UPDATE blog_cats SET lft = lft + 2  WHERE lft > @mr;"); err != nil {
+		tx.Rollback()
+		return err
+	}
+
+	if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt + 2  WHERE id = ?;", pf_parent); err != nil {
+		tx.Rollback()
+		return err
+	}
+	if _, err = tx.Exec("INSERT INTO blog_cats (id, user, name, alias, lft, rgt) VALUES (NULL, ?, ?, ?, @mr, @mr + 1);", wrap.User.A_id, pf_name, pf_alias); err != nil {
+		tx.Rollback()
+		return err
+	}
+
+	// Commit all changes and unlock table
+	err = tx.Commit()
+	if err != nil {
+		return err
+	}
+	_, err = wrap.DB.Exec("UNLOCK TABLES;")
+	if err != nil {
+		return err
+	}
+
 	return nil
 }
 
 func (this *Modules) blog_ActionCategoryUpdate(wrap *wrapper.Wrapper, pf_id, pf_name, pf_alias, pf_parent string) error {
-	//
-	return nil
+	_, err := wrap.DB.Query(
+		`UPDATE blog_cats SET
+			name = ?,
+			alias = ?
+		WHERE
+			id = ?
+		;`,
+		pf_name,
+		pf_alias,
+		pf_id,
+	)
+	return err
 }
 
 func (this *Modules) RegisterAction_BlogCategoriesModify() *Action {
@@ -118,6 +195,29 @@ func (this *Modules) RegisterAction_BlogCategoriesModify() *Action {
 			return
 		}
 
+		// Set root category as default
+		if pf_parent == "0" {
+			pf_parent = "1"
+		} else {
+			// Check if parent category exists
+			var parentId int
+			err := wrap.DB.QueryRow(`
+				SELECT
+					id
+				FROM
+					blog_cats
+				WHERE
+					id > 1 AND
+					id = ?
+				LIMIT 1;`,
+				pf_parent,
+			).Scan(&parentId)
+			if err != nil {
+				wrap.MsgError(err.Error())
+				return
+			}
+		}
+
 		if pf_id == "0" {
 			if err := this.blog_ActionCategoryAdd(wrap, pf_id, pf_name, pf_alias, pf_parent); err != nil {
 				wrap.MsgError(err.Error())
@@ -133,3 +233,67 @@ func (this *Modules) RegisterAction_BlogCategoriesModify() *Action {
 		}
 	})
 }
+
+func (this *Modules) RegisterAction_BlogCategoriesDelete() *Action {
+	return this.newAction(AInfo{
+		WantDB:    true,
+		Mount:     "blog-categories-delete",
+		WantAdmin: true,
+	}, func(wrap *wrapper.Wrapper) {
+		pf_id := wrap.R.FormValue("id")
+
+		if !utils.IsNumeric(pf_id) {
+			wrap.MsgError(`Inner system error`)
+			return
+		}
+
+		// Start transaction with table lock
+		_, err := wrap.DB.Exec("LOCK TABLE blog_cats WRITE;")
+		if err != nil {
+			wrap.MsgError(err.Error())
+			return
+		}
+		tx, err := wrap.DB.Begin()
+		if err != nil {
+			wrap.MsgError(err.Error())
+			return
+		}
+
+		// Update and insert new category
+		if _, err = tx.Exec("SELECT @ml := lft, @mr := rgt, @mw := rgt - lft + 1 FROM blog_cats WHERE id = ?;", pf_id); err != nil {
+			tx.Rollback()
+			wrap.MsgError(err.Error())
+			return
+		}
+		if _, err = tx.Exec("DELETE FROM blog_cats WHERE lft BETWEEN @ml AND @mr AND id > 1;"); err != nil {
+			tx.Rollback()
+			wrap.MsgError(err.Error())
+			return
+		}
+		if _, err = tx.Exec("UPDATE blog_cats SET rgt = rgt - @mw WHERE rgt > @mr;"); err != nil {
+			tx.Rollback()
+			wrap.MsgError(err.Error())
+			return
+		}
+		if _, err = tx.Exec("UPDATE blog_cats SET lft = lft - @mw WHERE lft > @mr;"); err != nil {
+			tx.Rollback()
+			wrap.MsgError(err.Error())
+			return
+		}
+
+		// Commit all changes and unlock table
+		err = tx.Commit()
+		if err != nil {
+			wrap.MsgError(err.Error())
+			return
+		}
+		_, err = wrap.DB.Exec("UNLOCK TABLES;")
+		if err != nil {
+			wrap.MsgError(err.Error())
+			return
+		}
+
+		// Reload current page
+		wrap.Write(`window.location.reload(false);`)
+	})
+}

Some files were not shown because too many files changed in this diff