diff --git a/app/appearance/langs/ar_SA.json b/app/appearance/langs/ar_SA.json index 69695e21b..4adf99b7b 100644 --- a/app/appearance/langs/ar_SA.json +++ b/app/appearance/langs/ar_SA.json @@ -1385,7 +1385,8 @@ "table": "جدول", "gallery": "بطاقة", "key": "المفتاح الرئيسي", - "select": "تحديد" + "select": "تحديد", + "tag": "وسم" }, "_kernel": { "0": "فشل استعلام دفتر الملاحظات", diff --git a/app/appearance/langs/de_DE.json b/app/appearance/langs/de_DE.json index 04c9b4cff..03fd19c07 100644 --- a/app/appearance/langs/de_DE.json +++ b/app/appearance/langs/de_DE.json @@ -1385,7 +1385,8 @@ "table": "Tabelle", "gallery": "Karte", "key": "Primärschlüssel", - "select": "Auswählen" + "select": "Auswählen", + "tag": "Tag" }, "_kernel": { "0": "Abfrage des Notizbuchs fehlgeschlagen", diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index e4480a0a6..7fdbd87eb 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -1385,7 +1385,8 @@ "table": "Table", "gallery": "Card", "key": "Primary Key", - "select": "Select" + "select": "Select", + "tag": "Tag" }, "_kernel": { "0": "Query notebook failed", diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json index 114c4f2bd..29f57fe99 100644 --- a/app/appearance/langs/es_ES.json +++ b/app/appearance/langs/es_ES.json @@ -1385,7 +1385,8 @@ "table": "Tabla", "gallery": "Tarjeta", "key": "Clave principal", - "select": "Selección" + "select": "Selección", + "tag": "Etiqueta" }, "_kernel": { "0": "Consulta al cuaderno de notas fallido", diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json index 89b718cc9..82ae970de 100644 --- a/app/appearance/langs/fr_FR.json +++ b/app/appearance/langs/fr_FR.json @@ -1385,7 +1385,8 @@ "table": "Tableau", "gallery": "Carte", "key": "Clé primaire", - "select": "Sélectionner" + "select": "Sélectionner", + "tag": "Étiquette" }, "_kernel": { "0": "Échec du cahier de requêtes", diff --git a/app/appearance/langs/he_IL.json b/app/appearance/langs/he_IL.json index 15f32b1a7..dca585953 100644 --- a/app/appearance/langs/he_IL.json +++ b/app/appearance/langs/he_IL.json @@ -1385,7 +1385,8 @@ "table": "טבלה", "gallery": "כרטיס", "key": "מפתח ראשי", - "select": "בחר" + "select": "בחר", + "tag": "תגית" }, "_kernel": { "0": "שאלת מחברת נכשלה", diff --git a/app/appearance/langs/it_IT.json b/app/appearance/langs/it_IT.json index 2f624ee65..80bd4b6d3 100644 --- a/app/appearance/langs/it_IT.json +++ b/app/appearance/langs/it_IT.json @@ -1385,7 +1385,8 @@ "table": "Tabella", "gallery": "Scheda", "key": "Chiave primaria", - "select": "Seleziona" + "select": "Seleziona", + "tag": "Etichetta" }, "_kernel": { "0": "Query del taccuino fallita", diff --git a/app/appearance/langs/ja_JP.json b/app/appearance/langs/ja_JP.json index 5f7c484e1..a2f374805 100644 --- a/app/appearance/langs/ja_JP.json +++ b/app/appearance/langs/ja_JP.json @@ -1385,7 +1385,8 @@ "table": "テーブル", "gallery": "カード", "key": "プライマリキー", - "select": "選択" + "select": "選択", + "tag": "タグ" }, "_kernel": { "0": "ノートブックのクエリに失敗しました", diff --git a/app/appearance/langs/pl_PL.json b/app/appearance/langs/pl_PL.json index a49296358..b5696e9ed 100644 --- a/app/appearance/langs/pl_PL.json +++ b/app/appearance/langs/pl_PL.json @@ -1385,7 +1385,8 @@ "table": "Tabela", "gallery": "Karta", "key": "Klucz główny", - "select": "Wybierz" + "select": "Wybierz", + "tag": "Tag" }, "_kernel": { "0": "Nie udało się zapytać o notes", diff --git a/app/appearance/langs/pt_BR.json b/app/appearance/langs/pt_BR.json index 700dc3999..f88a0db11 100644 --- a/app/appearance/langs/pt_BR.json +++ b/app/appearance/langs/pt_BR.json @@ -1385,7 +1385,8 @@ "table": "Tabela", "gallery": "Cartão", "key": "Chave Primária", - "select": "Selecionar" + "select": "Selecionar", + "tag": "Etiqueta" }, "_kernel": { "0": "Falha ao consultar o bloco de notas", diff --git a/app/appearance/langs/ru_RU.json b/app/appearance/langs/ru_RU.json index 483573c22..76dba65d1 100644 --- a/app/appearance/langs/ru_RU.json +++ b/app/appearance/langs/ru_RU.json @@ -1385,7 +1385,8 @@ "table": "Таблица", "gallery": "Карточка", "key": "Первичный ключ", - "select": "Выбрать" + "select": "Выбрать", + "tag": "Тег" }, "_kernel": { "0": "Не удалось запросить блокнот", diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json index 288ef65d7..f166f2782 100644 --- a/app/appearance/langs/zh_CHT.json +++ b/app/appearance/langs/zh_CHT.json @@ -1385,7 +1385,8 @@ "table": "表格", "gallery": "卡片", "key": "主鍵", - "select": "單選" + "select": "單選", + "tag": "標籤" }, "_kernel": { "0": "查詢筆記本失敗", diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 98a17a562..504a4bcf5 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -1385,7 +1385,8 @@ "table": "表格", "gallery": "卡片", "key": "主键", - "select": "单选" + "select": "单选", + "tag": "标签" }, "_kernel": { "0": "查询笔记本失败", diff --git a/kernel/av/av.go b/kernel/av/av.go index 21874e1ac..8923efe32 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -634,6 +634,15 @@ func (av *AttributeView) GetKey(keyID string) (ret *Key, err error) { return } +func (av *AttributeView) GetKeyByNameType(keyName string, typ KeyType) (ret []*Key) { + for _, kv := range av.KeyValues { + if kv.Key.Name == keyName && kv.Key.Type == typ { + ret = append(ret, kv.Key) + } + } + return +} + func (av *AttributeView) GetBlockKeyValues() (ret *KeyValues) { for _, kv := range av.KeyValues { if KeyTypeBlock == kv.Key.Type { diff --git a/kernel/av/value.go b/kernel/av/value.go index ec3cb09d3..033990d28 100644 --- a/kernel/av/value.go +++ b/kernel/av/value.go @@ -673,7 +673,7 @@ func Round(val float64, precision int) float64 { type ValueSelect struct { Content string `json:"content"` - Color string `json:"color"` + Color string `json:"color"` // 1-14 } func MSelectExistOption(mSelect []*ValueSelect, opt string) bool { diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 4fa1e4e25..e7c13e983 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -3152,6 +3152,7 @@ func addAttributeViewBlock(now int64, avID, dbBlockID, viewID, groupID, previous if !isDetached { bindBlockAv0(tx, avID, node, tree) + fillTags(attrView, view, addingItemID, node) } // 在所有视图上添加项目 @@ -3197,6 +3198,68 @@ func addAttributeViewBlock(now int64, avID, dbBlockID, viewID, groupID, previous return } +func fillTags(attrView *av.AttributeView, view *av.View, addingItemID string, node *ast.Node) { + // 如果节点上存在标签则将添加标签字段 + + var tags []string + if ast.NodeDocument == node.Type { + if docTagsVal := node.IALAttr("tags"); 0 < len(docTagsVal) { + docTags := strings.Split(docTagsVal, ",") + for _, t := range docTags { + tags = append(tags, t) + } + } + } else { + nodeTags := node.ChildrenByType(ast.NodeTextMark) + for _, t := range nodeTags { + tags = append(tags, t.TextMarkTextContent) + } + } + + keyName := av.GetAttributeViewI18n("tag") + tagKeys := attrView.GetKeyByNameType(keyName, av.KeyTypeMSelect) + tagKeyID := ast.NewNodeID() + if 1 > len(tagKeys) { + blockKey := attrView.GetBlockKey() + addAttributeViewKey(attrView, view, av.KeyTypeMSelect, tagKeyID, keyName, "", blockKey.ID) + } else { + tagKeyID = tagKeys[0].ID + } + + if tagKeyValues, _ := attrView.GetKeyValues(tagKeyID); nil != tagKeyValues { + val := tagKeyValues.GetValue(addingItemID) + if nil == val { + val = av.GetAttributeViewDefaultValue(ast.NewNodeID(), tagKeyID, addingItemID, av.KeyTypeMSelect) + for _, tag := range tags { + val.MSelect = append(val.MSelect, &av.ValueSelect{Content: tag, Color: fmt.Sprintf("%d", 1+rand.Intn(14))}) + } + tagKeyValues.Values = append(tagKeyValues.Values, val) + } else { + for _, t := range tags { + exist := false + for _, v := range val.MSelect { + if v.Content == t { + exist = true + break + } + } + if !exist { + val.MSelect = append(val.MSelect, &av.ValueSelect{Content: t, Color: fmt.Sprintf("%d", 1+rand.Intn(14))}) + } + } + } + + for _, valOpt := range val.MSelect { + if opt := tagKeyValues.Key.GetOption(valOpt.Content); nil == opt { + opt = &av.SelectOption{Name: valOpt.Content, Color: valOpt.Color} + tagKeyValues.Key.Options = append(tagKeyValues.Key.Options, opt) + } else { + valOpt.Color = opt.Color + } + } + } +} + func fillDefaultValue(attrView *av.AttributeView, view, groupView *av.View, previousItemID, addingItemID string) { defaultValues := getAttrViewAddingBlockDefaultValues(attrView, view, groupView, previousItemID, addingItemID) for keyID, newValue := range defaultValues { @@ -3966,70 +4029,73 @@ func AddAttributeViewKey(avID, keyID, keyName, keyType, keyIcon, previousKeyID s return } - keyTyp := av.KeyType(keyType) - switch keyTyp { + addAttributeViewKey(attrView, currentView, av.KeyType(keyType), keyID, keyName, keyIcon, previousKeyID) + + err = av.SaveAttributeView(attrView) + return +} + +func addAttributeViewKey(attrView *av.AttributeView, view *av.View, keyType av.KeyType, keyID, keyName, keyIcon, previousKeyID string) { + switch keyType { 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, av.KeyTypeLineNumber: - key := av.NewKey(keyID, keyName, keyIcon, keyTyp) - if av.KeyTypeRollup == keyTyp { + key := av.NewKey(keyID, keyName, keyIcon, keyType) + if av.KeyTypeRollup == keyType { key.Rollup = &av.Rollup{Calc: &av.RollupCalc{Operator: av.CalcOperatorNone}} } attrView.KeyValues = append(attrView.KeyValues, &av.KeyValues{Key: key}) - for _, view := range attrView.Views { + for _, v := range attrView.Views { newField := &av.BaseField{ID: key.ID} - if nil != view.Table { - newField.Wrap = view.Table.WrapField + if nil != v.Table { + newField.Wrap = v.Table.WrapField if "" == previousKeyID { - if av.LayoutTypeGallery == currentView.LayoutType { + if av.LayoutTypeGallery == view.LayoutType { // 如果当前视图是卡片视图则添加到最后 - view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{BaseField: newField}) + v.Table.Columns = append(v.Table.Columns, &av.ViewTableColumn{BaseField: newField}) } else { - view.Table.Columns = append([]*av.ViewTableColumn{{BaseField: newField}}, view.Table.Columns...) + v.Table.Columns = append([]*av.ViewTableColumn{{BaseField: newField}}, v.Table.Columns...) } } else { added := false - for i, column := range view.Table.Columns { + for i, column := range v.Table.Columns { if column.ID == previousKeyID { - view.Table.Columns = append(view.Table.Columns[:i+1], append([]*av.ViewTableColumn{{BaseField: newField}}, view.Table.Columns[i+1:]...)...) + v.Table.Columns = append(v.Table.Columns[:i+1], append([]*av.ViewTableColumn{{BaseField: newField}}, v.Table.Columns[i+1:]...)...) added = true break } } if !added { - view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{BaseField: newField}) + v.Table.Columns = append(v.Table.Columns, &av.ViewTableColumn{BaseField: newField}) } } } - if nil != view.Gallery { - newField.Wrap = view.Gallery.WrapField + if nil != v.Gallery { + newField.Wrap = v.Gallery.WrapField if "" == previousKeyID { - view.Gallery.CardFields = append(view.Gallery.CardFields, &av.ViewGalleryCardField{BaseField: newField}) + v.Gallery.CardFields = append(v.Gallery.CardFields, &av.ViewGalleryCardField{BaseField: newField}) } else { added := false - for i, field := range view.Gallery.CardFields { + for i, field := range v.Gallery.CardFields { if field.ID == previousKeyID { - view.Gallery.CardFields = append(view.Gallery.CardFields[:i+1], append([]*av.ViewGalleryCardField{{BaseField: newField}}, view.Gallery.CardFields[i+1:]...)...) + v.Gallery.CardFields = append(v.Gallery.CardFields[:i+1], append([]*av.ViewGalleryCardField{{BaseField: newField}}, v.Gallery.CardFields[i+1:]...)...) added = true break } } if !added { - view.Gallery.CardFields = append(view.Gallery.CardFields, &av.ViewGalleryCardField{BaseField: newField}) + v.Gallery.CardFields = append(v.Gallery.CardFields, &av.ViewGalleryCardField{BaseField: newField}) } } } } } - - err = av.SaveAttributeView(attrView) - return } func (tx *Transaction) doUpdateAttrViewColTemplate(operation *Operation) (ret *TxErr) {