diff --git a/kernel/api/av.go b/kernel/api/av.go index 13c438b44..f86b08a00 100644 --- a/kernel/api/av.go +++ b/kernel/api/av.go @@ -26,6 +26,71 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func addAttributeViewCol(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, _ := util.JsonArg(c, ret) + if nil == arg { + return + } + + avID := arg["avID"].(string) + keyID := arg["keyID"].(string) + keyName := arg["keyName"].(string) + keyType := arg["keyType"].(string) + keyIcon := arg["keyIcon"].(string) + previousKeyID := arg["previousKeyID"].(string) + + err := model.AddAttributeViewKey(avID, keyID, keyName, keyType, keyIcon, previousKeyID) + if nil != err { + ret.Code = -1 + ret.Msg = err.Error() + return + } +} + +func removeAttributeViewCol(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, _ := util.JsonArg(c, ret) + if nil == arg { + return + } + + avID := arg["avID"].(string) + keyID := arg["keyID"].(string) + + err := model.RemoveAttributeViewKey(avID, keyID) + if nil != err { + ret.Code = -1 + ret.Msg = err.Error() + return + } +} + +func sortAttributeViewCol(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + avID := arg["avID"].(string) + keyID := arg["keyID"].(string) + previousKeyID := arg["previousKeyID"].(string) + + err := model.SortAttributeViewKey(avID, keyID, previousKeyID) + if nil != err { + ret.Code = -1 + ret.Msg = err.Error() + return + } +} + func getAttributeViewFilterSort(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index 8e2f410cc..4bf3d70ab 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -398,6 +398,9 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/av/searchAttributeViewRelationKey", model.CheckAuth, model.CheckReadonly, searchAttributeViewRelationKey) ginServer.Handle("POST", "/api/av/searchAttributeViewNonRelationKey", model.CheckAuth, model.CheckReadonly, searchAttributeViewNonRelationKey) ginServer.Handle("POST", "/api/av/getAttributeViewFilterSort", model.CheckAuth, model.CheckReadonly, getAttributeViewFilterSort) + ginServer.Handle("POST", "/api/av/addAttributeViewKey", model.CheckAuth, model.CheckReadonly, addAttributeViewCol) + ginServer.Handle("POST", "/api/av/removeAttributeViewKey", model.CheckAuth, model.CheckReadonly, removeAttributeViewCol) + ginServer.Handle("POST", "/api/av/sortAttributeViewKey", model.CheckAuth, model.CheckReadonly, sortAttributeViewCol) ginServer.Handle("POST", "/api/ai/chatGPT", model.CheckAuth, chatGPT) ginServer.Handle("POST", "/api/ai/chatGPTWithAction", model.CheckAuth, chatGPTWithAction) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 78b84ef80..3f23f976b 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1981,15 +1981,15 @@ func sortAttributeViewRow(operation *Operation) (err error) { } func (tx *Transaction) doSortAttrViewColumn(operation *Operation) (ret *TxErr) { - err := sortAttributeViewColumn(operation) + err := SortAttributeViewKey(operation.AvID, operation.ID, operation.PreviousID) if nil != err { return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID, msg: err.Error()} } return } -func sortAttributeViewColumn(operation *Operation) (err error) { - attrView, err := av.ParseAttributeView(operation.AvID) +func SortAttributeViewKey(avID, keyID, previousKeyID string) (err error) { + attrView, err := av.ParseAttributeView(avID) if nil != err { return } @@ -2004,7 +2004,7 @@ func sortAttributeViewColumn(operation *Operation) (err error) { var col *av.ViewTableColumn var index, previousIndex int for i, column := range view.Table.Columns { - if column.ID == operation.ID { + if column.ID == keyID { col = column index = i break @@ -2016,7 +2016,7 @@ func sortAttributeViewColumn(operation *Operation) (err error) { view.Table.Columns = append(view.Table.Columns[:index], view.Table.Columns[index+1:]...) for i, column := range view.Table.Columns { - if column.ID == operation.PreviousID { + if column.ID == previousKeyID { previousIndex = i + 1 break } @@ -2029,30 +2029,32 @@ func sortAttributeViewColumn(operation *Operation) (err error) { } func (tx *Transaction) doAddAttrViewColumn(operation *Operation) (ret *TxErr) { - err := addAttributeViewColumn(operation) + var icon string + if nil != operation.Data { + icon = operation.Data.(string) + } + err := AddAttributeViewKey(operation.AvID, operation.ID, operation.Name, operation.Typ, icon, operation.PreviousID) + if nil != err { return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID, msg: err.Error()} } return } -func addAttributeViewColumn(operation *Operation) (err error) { - attrView, err := av.ParseAttributeView(operation.AvID) +func AddAttributeViewKey(avID, keyID, keyName, keyType, keyIcon, previousKeyID string) (err error) { + attrView, err := av.ParseAttributeView(avID) if nil != err { return } - keyType := av.KeyType(operation.Typ) - switch keyType { + keyTyp := av.KeyType(keyType) + switch keyTyp { case av.KeyTypeText, av.KeyTypeNumber, av.KeyTypeDate, av.KeyTypeSelect, av.KeyTypeMSelect, av.KeyTypeURL, av.KeyTypeEmail, av.KeyTypePhone, av.KeyTypeMAsset, av.KeyTypeTemplate, av.KeyTypeCreated, av.KeyTypeUpdated, av.KeyTypeCheckbox, av.KeyTypeRelation, av.KeyTypeRollup: - var icon string - if nil != operation.Data { - icon = operation.Data.(string) - } - key := av.NewKey(operation.ID, operation.Name, icon, keyType) - if av.KeyTypeRollup == keyType { + + key := av.NewKey(keyID, keyName, keyIcon, keyTyp) + if av.KeyTypeRollup == keyTyp { key.Rollup = &av.Rollup{Calc: &av.RollupCalc{Operator: av.CalcOperatorNone}} } @@ -2061,14 +2063,14 @@ func addAttributeViewColumn(operation *Operation) (err error) { for _, view := range attrView.Views { switch view.LayoutType { case av.LayoutTypeTable: - if "" == operation.PreviousID { + if "" == previousKeyID { view.Table.Columns = append([]*av.ViewTableColumn{{ID: key.ID}}, view.Table.Columns...) break } added := false for i, column := range view.Table.Columns { - if column.ID == operation.PreviousID { + if column.ID == previousKeyID { view.Table.Columns = append(view.Table.Columns[:i+1], append([]*av.ViewTableColumn{{ID: key.ID}}, view.Table.Columns[i+1:]...)...) added = true break @@ -2176,22 +2178,22 @@ func updateAttributeViewColumn(operation *Operation) (err error) { } func (tx *Transaction) doRemoveAttrViewColumn(operation *Operation) (ret *TxErr) { - err := removeAttributeViewColumn(operation) + err := RemoveAttributeViewKey(operation.AvID, operation.ID) if nil != err { return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID, msg: err.Error()} } return } -func removeAttributeViewColumn(operation *Operation) (err error) { - attrView, err := av.ParseAttributeView(operation.AvID) +func RemoveAttributeViewKey(avID, keyID string) (err error) { + attrView, err := av.ParseAttributeView(avID) if nil != err { return } var removedKey *av.Key for i, keyValues := range attrView.KeyValues { - if keyValues.Key.ID == operation.ID { + if keyValues.Key.ID == keyID { attrView.KeyValues = append(attrView.KeyValues[:i], attrView.KeyValues[i+1:]...) removedKey = keyValues.Key break @@ -2252,7 +2254,7 @@ func removeAttributeViewColumn(operation *Operation) (err error) { switch view.LayoutType { case av.LayoutTypeTable: for i, column := range view.Table.Columns { - if column.ID == operation.ID { + if column.ID == keyID { view.Table.Columns = append(view.Table.Columns[:i], view.Table.Columns[i+1:]...) break }