mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-20 16:40:13 +01:00
Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
112a0c0dac
14 changed files with 280 additions and 55 deletions
6
.github/CONTRIBUTING.md
vendored
6
.github/CONTRIBUTING.md
vendored
|
|
@ -14,10 +14,10 @@ Install pnpm: `npm install -g pnpm@10.20.0`
|
||||||
|
|
||||||
Set the Electron mirror environment variable and install Electron:
|
Set the Electron mirror environment variable and install Electron:
|
||||||
|
|
||||||
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@38.5.0 -D`
|
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@38.6.0 -D`
|
||||||
* Windows:
|
* Windows:
|
||||||
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
|
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
|
||||||
* `pnpm install electron@38.5.0 -D`
|
* `pnpm install electron@38.6.0 -D`
|
||||||
|
|
||||||
NPM mirror:
|
NPM mirror:
|
||||||
|
|
||||||
|
|
@ -27,7 +27,7 @@ NPM mirror:
|
||||||
|
|
||||||
Enter the app folder and execute:
|
Enter the app folder and execute:
|
||||||
|
|
||||||
* `pnpm install electron@38.5.0 -D`
|
* `pnpm install electron@38.6.0 -D`
|
||||||
* `pnpm run dev`
|
* `pnpm run dev`
|
||||||
* `pnpm run start`
|
* `pnpm run start`
|
||||||
|
|
||||||
|
|
|
||||||
6
.github/CONTRIBUTING_zh_CN.md
vendored
6
.github/CONTRIBUTING_zh_CN.md
vendored
|
|
@ -14,10 +14,10 @@
|
||||||
|
|
||||||
设置 Electron 镜像环境变量并安装 Electron:
|
设置 Electron 镜像环境变量并安装 Electron:
|
||||||
|
|
||||||
* macOS/Linux:`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@38.5.0 -D`
|
* macOS/Linux:`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@38.6.0 -D`
|
||||||
* Windows:
|
* Windows:
|
||||||
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
|
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
|
||||||
* `pnpm install electron@38.5.0 -D`
|
* `pnpm install electron@38.6.0 -D`
|
||||||
|
|
||||||
NPM 镜像:
|
NPM 镜像:
|
||||||
|
|
||||||
|
|
@ -27,7 +27,7 @@ NPM 镜像:
|
||||||
|
|
||||||
进入 app 文件夹执行:
|
进入 app 文件夹执行:
|
||||||
|
|
||||||
* `pnpm install electron@38.5.0 -D`
|
* `pnpm install electron@38.6.0 -D`
|
||||||
* `pnpm run dev`
|
* `pnpm run dev`
|
||||||
* `pnpm run start`
|
* `pnpm run start`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@
|
||||||
"clean-webpack-plugin": "^4.0.0",
|
"clean-webpack-plugin": "^4.0.0",
|
||||||
"css-loader": "^7.1.2",
|
"css-loader": "^7.1.2",
|
||||||
"dayjs": "^1.11.5",
|
"dayjs": "^1.11.5",
|
||||||
"electron": "38.5.0",
|
"electron": "38.6.0",
|
||||||
"electron-builder": "26.0.12",
|
"electron-builder": "26.0.12",
|
||||||
"encoding": "^0.1.13",
|
"encoding": "^0.1.13",
|
||||||
"esbuild-loader": "^3.0.1",
|
"esbuild-loader": "^3.0.1",
|
||||||
|
|
|
||||||
16
app/pnpm-lock.yaml
generated
16
app/pnpm-lock.yaml
generated
|
|
@ -10,7 +10,7 @@ importers:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@electron/remote':
|
'@electron/remote':
|
||||||
specifier: ^2.1.3
|
specifier: ^2.1.3
|
||||||
version: 2.1.3(electron@38.5.0)
|
version: 2.1.3(electron@38.6.0)
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@eslint/eslintrc':
|
'@eslint/eslintrc':
|
||||||
specifier: ^3.3.1
|
specifier: ^3.3.1
|
||||||
|
|
@ -40,8 +40,8 @@ importers:
|
||||||
specifier: ^1.11.5
|
specifier: ^1.11.5
|
||||||
version: 1.11.18
|
version: 1.11.18
|
||||||
electron:
|
electron:
|
||||||
specifier: 38.5.0
|
specifier: 38.6.0
|
||||||
version: 38.5.0
|
version: 38.6.0
|
||||||
electron-builder:
|
electron-builder:
|
||||||
specifier: 26.0.12
|
specifier: 26.0.12
|
||||||
version: 26.0.12(electron-builder-squirrel-windows@26.0.12)
|
version: 26.0.12(electron-builder-squirrel-windows@26.0.12)
|
||||||
|
|
@ -1198,8 +1198,8 @@ packages:
|
||||||
resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==}
|
resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==}
|
||||||
engines: {node: '>=8.0.0'}
|
engines: {node: '>=8.0.0'}
|
||||||
|
|
||||||
electron@38.5.0:
|
electron@38.6.0:
|
||||||
resolution: {integrity: sha512-dbC7V+eZweerYMJfxQldzHOg37a1VdNMCKxrJxlkp3cA30gOXtXSg4ZYs07L5+QwI19WOy1uyvtEUgbw1RRsCQ==}
|
resolution: {integrity: sha512-68OFNxJlrEStA+t8k5atzf4frJddvRR1N1oalr49Ll8YZ0+0nEsDhw4UNhTCoZKTjSYcxFF/4rt+sco+OlnB3g==}
|
||||||
engines: {node: '>= 12.20.55'}
|
engines: {node: '>= 12.20.55'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
|
@ -2868,9 +2868,9 @@ snapshots:
|
||||||
- bluebird
|
- bluebird
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@electron/remote@2.1.3(electron@38.5.0)':
|
'@electron/remote@2.1.3(electron@38.6.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
electron: 38.5.0
|
electron: 38.6.0
|
||||||
|
|
||||||
'@electron/universal@2.0.1':
|
'@electron/universal@2.0.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
@ -4013,7 +4013,7 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
electron@38.5.0:
|
electron@38.6.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@electron/get': 2.0.3
|
'@electron/get': 2.0.3
|
||||||
'@types/node': 22.18.1
|
'@types/node': 22.18.1
|
||||||
|
|
|
||||||
|
|
@ -146,6 +146,12 @@ type Key struct {
|
||||||
|
|
||||||
// 日期
|
// 日期
|
||||||
Date *Date `json:"date,omitempty"` // 日期设置
|
Date *Date `json:"date,omitempty"` // 日期设置
|
||||||
|
|
||||||
|
// 创建时间
|
||||||
|
Created *Created `json:"created,omitempty"` // 创建时间设置
|
||||||
|
|
||||||
|
// 更新时间
|
||||||
|
Updated *Updated `json:"updated,omitempty"` // 更新时间设置
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewKey(id, name, icon string, keyType KeyType) *Key {
|
func NewKey(id, name, icon string, keyType KeyType) *Key {
|
||||||
|
|
@ -167,6 +173,14 @@ func (k *Key) GetOption(name string) (ret *SelectOption) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Created struct {
|
||||||
|
IncludeTime bool `json:"includeTime"` // 是否填充具体时间 Add `Include time` switch to database creation time field and update time field https://github.com/siyuan-note/siyuan/issues/12091
|
||||||
|
}
|
||||||
|
|
||||||
|
type Updated struct {
|
||||||
|
IncludeTime bool `json:"includeTime"` // 是否填充具体时间 Add `Include time` switch to database creation time field and update time field https://github.com/siyuan-note/siyuan/issues/12091
|
||||||
|
}
|
||||||
|
|
||||||
type Date struct {
|
type Date struct {
|
||||||
AutoFillNow bool `json:"autoFillNow"` // 是否自动填充当前时间 The database date field supports filling the current time by default https://github.com/siyuan-note/siyuan/issues/10823
|
AutoFillNow bool `json:"autoFillNow"` // 是否自动填充当前时间 The database date field supports filling the current time by default https://github.com/siyuan-note/siyuan/issues/10823
|
||||||
FillSpecificTime bool `json:"fillSpecificTime"` // 是否填充具体时间 Add `Default fill specific time` switch to database date field https://github.com/siyuan-note/siyuan/issues/12089
|
FillSpecificTime bool `json:"fillSpecificTime"` // 是否填充具体时间 Add `Default fill specific time` switch to database date field https://github.com/siyuan-note/siyuan/issues/12089
|
||||||
|
|
@ -396,7 +410,7 @@ type Viewable interface {
|
||||||
func NewAttributeView(id string) (ret *AttributeView) {
|
func NewAttributeView(id string) (ret *AttributeView) {
|
||||||
view, blockKey, selectKey := NewTableViewWithBlockKey(ast.NewNodeID())
|
view, blockKey, selectKey := NewTableViewWithBlockKey(ast.NewNodeID())
|
||||||
ret = &AttributeView{
|
ret = &AttributeView{
|
||||||
Spec: 3,
|
Spec: CurrentSpec,
|
||||||
ID: id,
|
ID: id,
|
||||||
KeyValues: []*KeyValues{{Key: blockKey}, {Key: selectKey}},
|
KeyValues: []*KeyValues{{Key: blockKey}, {Key: selectKey}},
|
||||||
ViewID: view.ID,
|
ViewID: view.ID,
|
||||||
|
|
|
||||||
|
|
@ -24,10 +24,38 @@ import (
|
||||||
"github.com/siyuan-note/siyuan/kernel/util"
|
"github.com/siyuan-note/siyuan/kernel/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const CurrentSpec = 4
|
||||||
|
|
||||||
func UpgradeSpec(av *AttributeView) {
|
func UpgradeSpec(av *AttributeView) {
|
||||||
|
if CurrentSpec <= av.Spec {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
upgradeSpec1(av)
|
upgradeSpec1(av)
|
||||||
upgradeSpec2(av)
|
upgradeSpec2(av)
|
||||||
upgradeSpec3(av)
|
upgradeSpec3(av)
|
||||||
|
upgradeSpec4(av)
|
||||||
|
}
|
||||||
|
|
||||||
|
func upgradeSpec4(av *AttributeView) {
|
||||||
|
if 4 <= av.Spec {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, keyValues := range av.KeyValues {
|
||||||
|
switch keyValues.Key.Type {
|
||||||
|
case KeyTypeCreated:
|
||||||
|
if nil == keyValues.Key.Created {
|
||||||
|
keyValues.Key.Created = &Created{IncludeTime: true}
|
||||||
|
}
|
||||||
|
case KeyTypeUpdated:
|
||||||
|
if nil == keyValues.Key.Updated {
|
||||||
|
keyValues.Key.Updated = &Updated{IncludeTime: true}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
av.Spec = 4
|
||||||
}
|
}
|
||||||
|
|
||||||
func upgradeSpec3(av *AttributeView) {
|
func upgradeSpec3(av *AttributeView) {
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ func Calc(viewable Viewable, attrView *AttributeView) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
calcField(collection, field, i)
|
calcField(collection, field, i, attrView)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 分组计算
|
// 分组计算
|
||||||
|
|
@ -83,7 +83,7 @@ func Calc(viewable Viewable, attrView *AttributeView) {
|
||||||
if nil == calcResult {
|
if nil == calcResult {
|
||||||
// 在字段上设置计算规则,使用字段结算结果作为分组计算结果,最后再清除字段上的计算规则
|
// 在字段上设置计算规则,使用字段结算结果作为分组计算结果,最后再清除字段上的计算规则
|
||||||
field.SetCalc(groupCalc.FieldCalc)
|
field.SetCalc(groupCalc.FieldCalc)
|
||||||
calcField(collection, field, fieldIndex)
|
calcField(collection, field, fieldIndex, attrView)
|
||||||
calcResult = &GroupCalc{Field: groupCalcKey.ID, FieldCalc: field.GetCalc()}
|
calcResult = &GroupCalc{Field: groupCalcKey.ID, FieldCalc: field.GetCalc()}
|
||||||
field.SetCalc(nil)
|
field.SetCalc(nil)
|
||||||
}
|
}
|
||||||
|
|
@ -94,7 +94,7 @@ func Calc(viewable Viewable, attrView *AttributeView) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func calcField(collection Collection, field Field, fieldIndex int) {
|
func calcField(collection Collection, field Field, fieldIndex int, attrView *AttributeView) {
|
||||||
switch field.GetType() {
|
switch field.GetType() {
|
||||||
case KeyTypeBlock:
|
case KeyTypeBlock:
|
||||||
calcFieldBlock(collection, field, fieldIndex)
|
calcFieldBlock(collection, field, fieldIndex)
|
||||||
|
|
@ -119,9 +119,9 @@ func calcField(collection Collection, field Field, fieldIndex int) {
|
||||||
case KeyTypeTemplate:
|
case KeyTypeTemplate:
|
||||||
calcFieldTemplate(collection, field, fieldIndex)
|
calcFieldTemplate(collection, field, fieldIndex)
|
||||||
case KeyTypeCreated:
|
case KeyTypeCreated:
|
||||||
calcFieldCreated(collection, field, fieldIndex)
|
calcFieldCreated(collection, field, fieldIndex, attrView)
|
||||||
case KeyTypeUpdated:
|
case KeyTypeUpdated:
|
||||||
calcFieldUpdated(collection, field, fieldIndex)
|
calcFieldUpdated(collection, field, fieldIndex, attrView)
|
||||||
case KeyTypeCheckbox:
|
case KeyTypeCheckbox:
|
||||||
calcFieldCheckbox(collection, field, fieldIndex)
|
calcFieldCheckbox(collection, field, fieldIndex)
|
||||||
case KeyTypeRelation:
|
case KeyTypeRelation:
|
||||||
|
|
@ -1296,7 +1296,7 @@ func calcFieldBlock(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func calcFieldCreated(collection Collection, field Field, fieldIndex int) {
|
func calcFieldCreated(collection Collection, field Field, fieldIndex int, attrView *AttributeView) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -1389,7 +1389,13 @@ func calcFieldCreated(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if 0 != earliest {
|
if 0 != earliest {
|
||||||
calc.Result = &Value{Created: NewFormattedValueCreated(earliest, 0, CreatedFormatNone)}
|
key, _ := attrView.GetKey(field.GetID())
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Created {
|
||||||
|
isNotTime = !key.Created.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
calc.Result = &Value{Created: NewFormattedValueCreated(earliest, 0, CreatedFormatNone, isNotTime)}
|
||||||
}
|
}
|
||||||
case CalcOperatorLatest:
|
case CalcOperatorLatest:
|
||||||
latest := int64(0)
|
latest := int64(0)
|
||||||
|
|
@ -1402,7 +1408,13 @@ func calcFieldCreated(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if 0 != latest {
|
if 0 != latest {
|
||||||
calc.Result = &Value{Created: NewFormattedValueCreated(latest, 0, CreatedFormatNone)}
|
key, _ := attrView.GetKey(field.GetID())
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Created {
|
||||||
|
isNotTime = !key.Created.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
calc.Result = &Value{Created: NewFormattedValueCreated(latest, 0, CreatedFormatNone, isNotTime)}
|
||||||
}
|
}
|
||||||
case CalcOperatorRange:
|
case CalcOperatorRange:
|
||||||
earliest := int64(0)
|
earliest := int64(0)
|
||||||
|
|
@ -1419,12 +1431,18 @@ func calcFieldCreated(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if 0 != earliest && 0 != latest {
|
if 0 != earliest && 0 != latest {
|
||||||
calc.Result = &Value{Created: NewFormattedValueCreated(earliest, latest, CreatedFormatDuration)}
|
key, _ := attrView.GetKey(field.GetID())
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Created {
|
||||||
|
isNotTime = !key.Created.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
calc.Result = &Value{Created: NewFormattedValueCreated(earliest, latest, CreatedFormatDuration, isNotTime)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func calcFieldUpdated(collection Collection, field Field, fieldIndex int) {
|
func calcFieldUpdated(collection Collection, field Field, fieldIndex int, attrView *AttributeView) {
|
||||||
calc := field.GetCalc()
|
calc := field.GetCalc()
|
||||||
switch calc.Operator {
|
switch calc.Operator {
|
||||||
case CalcOperatorCountAll:
|
case CalcOperatorCountAll:
|
||||||
|
|
@ -1517,7 +1535,13 @@ func calcFieldUpdated(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if 0 != earliest {
|
if 0 != earliest {
|
||||||
calc.Result = &Value{Updated: NewFormattedValueUpdated(earliest, 0, UpdatedFormatNone)}
|
key, _ := attrView.GetKey(field.GetID())
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Updated {
|
||||||
|
isNotTime = !key.Updated.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
calc.Result = &Value{Updated: NewFormattedValueUpdated(earliest, 0, UpdatedFormatNone, isNotTime)}
|
||||||
}
|
}
|
||||||
case CalcOperatorLatest:
|
case CalcOperatorLatest:
|
||||||
latest := int64(0)
|
latest := int64(0)
|
||||||
|
|
@ -1530,7 +1554,13 @@ func calcFieldUpdated(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if 0 != latest {
|
if 0 != latest {
|
||||||
calc.Result = &Value{Updated: NewFormattedValueUpdated(latest, 0, UpdatedFormatNone)}
|
key, _ := attrView.GetKey(field.GetID())
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Updated {
|
||||||
|
isNotTime = !key.Updated.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
calc.Result = &Value{Updated: NewFormattedValueUpdated(latest, 0, UpdatedFormatNone, isNotTime)}
|
||||||
}
|
}
|
||||||
case CalcOperatorRange:
|
case CalcOperatorRange:
|
||||||
earliest := int64(0)
|
earliest := int64(0)
|
||||||
|
|
@ -1547,7 +1577,13 @@ func calcFieldUpdated(collection Collection, field Field, fieldIndex int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if 0 != earliest && 0 != latest {
|
if 0 != earliest && 0 != latest {
|
||||||
calc.Result = &Value{Updated: NewFormattedValueUpdated(earliest, latest, UpdatedFormatDuration)}
|
key, _ := attrView.GetKey(field.GetID())
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Updated {
|
||||||
|
isNotTime = !key.Updated.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
calc.Result = &Value{Updated: NewFormattedValueUpdated(earliest, latest, UpdatedFormatDuration, isNotTime)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -735,8 +735,14 @@ const (
|
||||||
CreatedFormatDuration CreatedFormat = "duration"
|
CreatedFormatDuration CreatedFormat = "duration"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewFormattedValueCreated(content, content2 int64, format CreatedFormat) (ret *ValueCreated) {
|
func NewFormattedValueCreated(content, content2 int64, format CreatedFormat, isNotTime bool) (ret *ValueCreated) {
|
||||||
formatted := time.UnixMilli(content).Format("2006-01-02 15:04")
|
var formatted string
|
||||||
|
if isNotTime {
|
||||||
|
formatted = time.UnixMilli(content).Format("2006-01-02")
|
||||||
|
} else {
|
||||||
|
formatted = time.UnixMilli(content).Format("2006-01-02 15:04")
|
||||||
|
}
|
||||||
|
|
||||||
if 0 < content2 {
|
if 0 < content2 {
|
||||||
formatted += " → " + time.UnixMilli(content2).Format("2006-01-02 15:04")
|
formatted += " → " + time.UnixMilli(content2).Format("2006-01-02 15:04")
|
||||||
}
|
}
|
||||||
|
|
@ -770,8 +776,14 @@ const (
|
||||||
UpdatedFormatDuration UpdatedFormat = "duration"
|
UpdatedFormatDuration UpdatedFormat = "duration"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewFormattedValueUpdated(content, content2 int64, format UpdatedFormat) (ret *ValueUpdated) {
|
func NewFormattedValueUpdated(content, content2 int64, format UpdatedFormat, isNotTime bool) (ret *ValueUpdated) {
|
||||||
formatted := time.UnixMilli(content).Format("2006-01-02 15:04")
|
var formatted string
|
||||||
|
if isNotTime {
|
||||||
|
formatted = time.UnixMilli(content).Format("2006-01-02")
|
||||||
|
} else {
|
||||||
|
formatted = time.UnixMilli(content).Format("2006-01-02 15:04")
|
||||||
|
}
|
||||||
|
|
||||||
if 0 < content2 {
|
if 0 < content2 {
|
||||||
formatted += " → " + time.UnixMilli(content2).Format("2006-01-02 15:04")
|
formatted += " → " + time.UnixMilli(content2).Format("2006-01-02 15:04")
|
||||||
}
|
}
|
||||||
|
|
@ -1098,11 +1110,21 @@ func (r *ValueRollup) calcContents(calc *RollupCalc, destKey *Key) {
|
||||||
}
|
}
|
||||||
case KeyTypeUpdated:
|
case KeyTypeUpdated:
|
||||||
if 0 != earliest && 0 != latest {
|
if 0 != earliest && 0 != latest {
|
||||||
r.Contents = []*Value{{Type: KeyTypeUpdated, Updated: NewFormattedValueUpdated(earliest, latest, UpdatedFormatDuration)}}
|
isNotTime = false
|
||||||
|
if nil != destKey.Updated {
|
||||||
|
isNotTime = !destKey.Updated.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Contents = []*Value{{Type: KeyTypeUpdated, Updated: NewFormattedValueUpdated(earliest, latest, UpdatedFormatDuration, isNotTime)}}
|
||||||
}
|
}
|
||||||
case KeyTypeCreated:
|
case KeyTypeCreated:
|
||||||
if 0 != earliest && 0 != latest {
|
if 0 != earliest && 0 != latest {
|
||||||
r.Contents = []*Value{{Type: KeyTypeCreated, Created: NewFormattedValueCreated(earliest, latest, CreatedFormatDuration)}}
|
isNotTime = false
|
||||||
|
if nil != destKey.Created {
|
||||||
|
isNotTime = !destKey.Created.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Contents = []*Value{{Type: KeyTypeCreated, Created: NewFormattedValueCreated(earliest, latest, CreatedFormatDuration, isNotTime)}}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
if math.MaxFloat64 != minVal && -math.MaxFloat64 != maxVal {
|
if math.MaxFloat64 != minVal && -math.MaxFloat64 != maxVal {
|
||||||
|
|
@ -1146,11 +1168,21 @@ func (r *ValueRollup) calcContents(calc *RollupCalc, destKey *Key) {
|
||||||
}
|
}
|
||||||
case KeyTypeUpdated:
|
case KeyTypeUpdated:
|
||||||
if 0 != earliest {
|
if 0 != earliest {
|
||||||
r.Contents = []*Value{{Type: KeyTypeUpdated, Updated: NewFormattedValueUpdated(earliest, 0, UpdatedFormatNone)}}
|
isNotTime = false
|
||||||
|
if nil != destKey.Updated {
|
||||||
|
isNotTime = !destKey.Updated.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Contents = []*Value{{Type: KeyTypeUpdated, Updated: NewFormattedValueUpdated(earliest, 0, UpdatedFormatNone, isNotTime)}}
|
||||||
}
|
}
|
||||||
case KeyTypeCreated:
|
case KeyTypeCreated:
|
||||||
if 0 != earliest {
|
if 0 != earliest {
|
||||||
r.Contents = []*Value{{Type: KeyTypeCreated, Created: NewFormattedValueCreated(earliest, 0, CreatedFormatNone)}}
|
isNotTime = false
|
||||||
|
if nil != destKey.Created {
|
||||||
|
isNotTime = !destKey.Created.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Contents = []*Value{{Type: KeyTypeCreated, Created: NewFormattedValueCreated(earliest, 0, CreatedFormatNone, isNotTime)}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case CalcOperatorLatest:
|
case CalcOperatorLatest:
|
||||||
|
|
@ -1190,11 +1222,20 @@ func (r *ValueRollup) calcContents(calc *RollupCalc, destKey *Key) {
|
||||||
}
|
}
|
||||||
case KeyTypeUpdated:
|
case KeyTypeUpdated:
|
||||||
if 0 != latest {
|
if 0 != latest {
|
||||||
r.Contents = []*Value{{Type: KeyTypeUpdated, Updated: NewFormattedValueUpdated(latest, 0, UpdatedFormatNone)}}
|
isNotTime = false
|
||||||
|
if nil != destKey.Updated {
|
||||||
|
isNotTime = !destKey.Updated.IncludeTime
|
||||||
|
}
|
||||||
|
r.Contents = []*Value{{Type: KeyTypeUpdated, Updated: NewFormattedValueUpdated(latest, 0, UpdatedFormatNone, isNotTime)}}
|
||||||
}
|
}
|
||||||
case KeyTypeCreated:
|
case KeyTypeCreated:
|
||||||
if 0 != latest {
|
if 0 != latest {
|
||||||
r.Contents = []*Value{{Type: KeyTypeCreated, Created: NewFormattedValueCreated(latest, 0, CreatedFormatNone)}}
|
isNotTime = false
|
||||||
|
if nil != destKey.Created {
|
||||||
|
isNotTime = !destKey.Created.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Contents = []*Value{{Type: KeyTypeCreated, Created: NewFormattedValueCreated(latest, 0, CreatedFormatNone, isNotTime)}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case CalcOperatorChecked:
|
case CalcOperatorChecked:
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ require (
|
||||||
github.com/sashabaranov/go-openai v1.41.2
|
github.com/sashabaranov/go-openai v1.41.2
|
||||||
github.com/shirou/gopsutil/v4 v4.25.10
|
github.com/shirou/gopsutil/v4 v4.25.10
|
||||||
github.com/siyuan-note/dataparser v0.0.0-20250804100744-b41253b236f3
|
github.com/siyuan-note/dataparser v0.0.0-20250804100744-b41253b236f3
|
||||||
github.com/siyuan-note/dejavu v0.0.0-20251107024246-160d3a33e254
|
github.com/siyuan-note/dejavu v0.0.0-20251107094421-5d0a1cc69ef0
|
||||||
github.com/siyuan-note/encryption v0.0.0-20250326023622-24a67e6956ec
|
github.com/siyuan-note/encryption v0.0.0-20250326023622-24a67e6956ec
|
||||||
github.com/siyuan-note/eventbus v0.0.0-20240627125516-396fdb0f0f97
|
github.com/siyuan-note/eventbus v0.0.0-20240627125516-396fdb0f0f97
|
||||||
github.com/siyuan-note/filelock v0.0.0-20251107023958-207cad31f0dd
|
github.com/siyuan-note/filelock v0.0.0-20251107023958-207cad31f0dd
|
||||||
|
|
|
||||||
|
|
@ -374,8 +374,8 @@ github.com/shurcooL/gofontwoff v0.0.0-20181114050219-180f79e6909d/go.mod h1:05Ut
|
||||||
github.com/simplereach/timeutils v1.2.0/go.mod h1:VVbQDfN/FHRZa1LSqcwo4kNZ62OOyqLLGQKYB3pB0Q8=
|
github.com/simplereach/timeutils v1.2.0/go.mod h1:VVbQDfN/FHRZa1LSqcwo4kNZ62OOyqLLGQKYB3pB0Q8=
|
||||||
github.com/siyuan-note/dataparser v0.0.0-20250804100744-b41253b236f3 h1:EH063L0HD1f82DvddurUmEXS0obXypv8pQrcaC/zNgI=
|
github.com/siyuan-note/dataparser v0.0.0-20250804100744-b41253b236f3 h1:EH063L0HD1f82DvddurUmEXS0obXypv8pQrcaC/zNgI=
|
||||||
github.com/siyuan-note/dataparser v0.0.0-20250804100744-b41253b236f3/go.mod h1:8lb+SsWAPQblGbjmwEBsBdJszMCcLeECtB95fv6mReg=
|
github.com/siyuan-note/dataparser v0.0.0-20250804100744-b41253b236f3/go.mod h1:8lb+SsWAPQblGbjmwEBsBdJszMCcLeECtB95fv6mReg=
|
||||||
github.com/siyuan-note/dejavu v0.0.0-20251107024246-160d3a33e254 h1:7I7T5SxFs4w6fsSLL+M/9Hk8/5yp4j16Ux/dcVgmKF0=
|
github.com/siyuan-note/dejavu v0.0.0-20251107094421-5d0a1cc69ef0 h1:fgmT2zauJ/bkgP5BUwpgJK3V6bwbuY3nSwACiVDgaBE=
|
||||||
github.com/siyuan-note/dejavu v0.0.0-20251107024246-160d3a33e254/go.mod h1:5tQBaP9Nu9D4LapyB6qOm7UBTl1gf5GX1qryk2ha9s8=
|
github.com/siyuan-note/dejavu v0.0.0-20251107094421-5d0a1cc69ef0/go.mod h1:5tQBaP9Nu9D4LapyB6qOm7UBTl1gf5GX1qryk2ha9s8=
|
||||||
github.com/siyuan-note/encryption v0.0.0-20250326023622-24a67e6956ec h1:D8Sjwa+7WxP3XrIBscT4PxBZZddZ83/O+5nX1sq6g6g=
|
github.com/siyuan-note/encryption v0.0.0-20250326023622-24a67e6956ec h1:D8Sjwa+7WxP3XrIBscT4PxBZZddZ83/O+5nX1sq6g6g=
|
||||||
github.com/siyuan-note/encryption v0.0.0-20250326023622-24a67e6956ec/go.mod h1:6iAxXPOOAG3+M4bCiKQZTQ+n4gSUx/OyHhsP57dJlS8=
|
github.com/siyuan-note/encryption v0.0.0-20250326023622-24a67e6956ec/go.mod h1:6iAxXPOOAG3+M4bCiKQZTQ+n4gSUx/OyHhsP57dJlS8=
|
||||||
github.com/siyuan-note/eventbus v0.0.0-20240627125516-396fdb0f0f97 h1:lM5v8BfNtbOL5jYwhCdMYBcYtr06IYBKjjSLAPMKTM8=
|
github.com/siyuan-note/eventbus v0.0.0-20240627125516-396fdb0f0f97 h1:lM5v8BfNtbOL5jYwhCdMYBcYtr06IYBKjjSLAPMKTM8=
|
||||||
|
|
|
||||||
|
|
@ -1688,25 +1688,35 @@ func GetBlockAttributeViewKeys(nodeID string) (ret []*BlockAttributeViewKeys) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case av.KeyTypeCreated:
|
case av.KeyTypeCreated:
|
||||||
|
isNotTime := false
|
||||||
|
if nil != kv.Key && nil != kv.Key.Created {
|
||||||
|
isNotTime = !kv.Key.Created.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
createdStr := nodeID[:len("20060102150405")]
|
createdStr := nodeID[:len("20060102150405")]
|
||||||
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
||||||
if nil == parseErr {
|
if nil == parseErr {
|
||||||
kv.Values[0].Created = av.NewFormattedValueCreated(created.UnixMilli(), 0, av.CreatedFormatNone)
|
kv.Values[0].Created = av.NewFormattedValueCreated(created.UnixMilli(), 0, av.CreatedFormatNone, isNotTime)
|
||||||
kv.Values[0].Created.IsNotEmpty = true
|
kv.Values[0].Created.IsNotEmpty = true
|
||||||
} else {
|
} else {
|
||||||
logging.LogWarnf("parse created [%s] failed: %s", createdStr, parseErr)
|
logging.LogWarnf("parse created [%s] failed: %s", createdStr, parseErr)
|
||||||
kv.Values[0].Created = av.NewFormattedValueCreated(time.Now().UnixMilli(), 0, av.CreatedFormatNone)
|
kv.Values[0].Created = av.NewFormattedValueCreated(time.Now().UnixMilli(), 0, av.CreatedFormatNone, isNotTime)
|
||||||
}
|
}
|
||||||
case av.KeyTypeUpdated:
|
case av.KeyTypeUpdated:
|
||||||
|
isNotTime := false
|
||||||
|
if nil != kv.Key && nil != kv.Key.Updated {
|
||||||
|
isNotTime = !kv.Key.Updated.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
ial := sql.GetBlockAttrs(nodeID)
|
ial := sql.GetBlockAttrs(nodeID)
|
||||||
updatedStr := ial["updated"]
|
updatedStr := ial["updated"]
|
||||||
updated, parseErr := time.ParseInLocation("20060102150405", updatedStr, time.Local)
|
updated, parseErr := time.ParseInLocation("20060102150405", updatedStr, time.Local)
|
||||||
if nil == parseErr {
|
if nil == parseErr {
|
||||||
kv.Values[0].Updated = av.NewFormattedValueUpdated(updated.UnixMilli(), 0, av.UpdatedFormatNone)
|
kv.Values[0].Updated = av.NewFormattedValueUpdated(updated.UnixMilli(), 0, av.UpdatedFormatNone, isNotTime)
|
||||||
kv.Values[0].Updated.IsNotEmpty = true
|
kv.Values[0].Updated.IsNotEmpty = true
|
||||||
} else {
|
} else {
|
||||||
logging.LogWarnf("parse updated [%s] failed: %s", updatedStr, parseErr)
|
logging.LogWarnf("parse updated [%s] failed: %s", updatedStr, parseErr)
|
||||||
kv.Values[0].Updated = av.NewFormattedValueUpdated(time.Now().UnixMilli(), 0, av.UpdatedFormatNone)
|
kv.Values[0].Updated = av.NewFormattedValueUpdated(time.Now().UnixMilli(), 0, av.UpdatedFormatNone, isNotTime)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2271,6 +2281,62 @@ func setAttrViewColDateFillSpecificTime(operation *Operation) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tx *Transaction) doSetAttrViewCreatedIncludeTime(operation *Operation) (ret *TxErr) {
|
||||||
|
err := setAttrViewCreatedIncludeTime(operation)
|
||||||
|
if err != nil {
|
||||||
|
return &TxErr{code: TxErrHandleAttributeView, id: operation.AvID, msg: err.Error()}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setAttrViewCreatedIncludeTime(operation *Operation) (err error) {
|
||||||
|
attrView, err := av.ParseAttributeView(operation.AvID)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
key, _ := attrView.GetKey(operation.ID)
|
||||||
|
if nil == key {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if nil == key.Created {
|
||||||
|
key.Created = &av.Created{}
|
||||||
|
}
|
||||||
|
|
||||||
|
key.Created.IncludeTime = operation.Data.(bool)
|
||||||
|
err = av.SaveAttributeView(attrView)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tx *Transaction) doSetAttrViewUpdatedIncludeTime(operation *Operation) (ret *TxErr) {
|
||||||
|
err := setAttrViewUpdatedIncludeTime(operation)
|
||||||
|
if err != nil {
|
||||||
|
return &TxErr{code: TxErrHandleAttributeView, id: operation.AvID, msg: err.Error()}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func setAttrViewUpdatedIncludeTime(operation *Operation) (err error) {
|
||||||
|
attrView, err := av.ParseAttributeView(operation.AvID)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
key, _ := attrView.GetKey(operation.ID)
|
||||||
|
if nil == key {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if nil == key.Updated {
|
||||||
|
key.Updated = &av.Updated{}
|
||||||
|
}
|
||||||
|
|
||||||
|
key.Updated.IncludeTime = operation.Data.(bool)
|
||||||
|
err = av.SaveAttributeView(attrView)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (tx *Transaction) doHideAttrViewName(operation *Operation) (ret *TxErr) {
|
func (tx *Transaction) doHideAttrViewName(operation *Operation) (ret *TxErr) {
|
||||||
err := hideAttrViewName(operation)
|
err := hideAttrViewName(operation)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -130,11 +130,23 @@ func ExportAv2CSV(avID, blockID string) (zipPath string, err error) {
|
||||||
}
|
}
|
||||||
} else if av.KeyTypeCreated == cell.Value.Type {
|
} else if av.KeyTypeCreated == cell.Value.Type {
|
||||||
if nil != cell.Value.Created {
|
if nil != cell.Value.Created {
|
||||||
cell.Value.Created = av.NewFormattedValueCreated(cell.Value.Created.Content, 0, av.CreatedFormatNone)
|
key, _ := attrView.GetKey(cell.Value.KeyID)
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Created {
|
||||||
|
isNotTime = !key.Created.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
cell.Value.Created = av.NewFormattedValueCreated(cell.Value.Created.Content, 0, av.CreatedFormatNone, isNotTime)
|
||||||
}
|
}
|
||||||
} else if av.KeyTypeUpdated == cell.Value.Type {
|
} else if av.KeyTypeUpdated == cell.Value.Type {
|
||||||
if nil != cell.Value.Updated {
|
if nil != cell.Value.Updated {
|
||||||
cell.Value.Updated = av.NewFormattedValueUpdated(cell.Value.Updated.Content, 0, av.UpdatedFormatNone)
|
key, _ := attrView.GetKey(cell.Value.KeyID)
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Updated {
|
||||||
|
isNotTime = !key.Updated.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
cell.Value.Updated = av.NewFormattedValueUpdated(cell.Value.Updated.Content, 0, av.UpdatedFormatNone, isNotTime)
|
||||||
}
|
}
|
||||||
} else if av.KeyTypeMAsset == cell.Value.Type {
|
} else if av.KeyTypeMAsset == cell.Value.Type {
|
||||||
if nil != cell.Value.MAsset {
|
if nil != cell.Value.MAsset {
|
||||||
|
|
@ -2711,11 +2723,23 @@ func exportTree(tree *parse.Tree, wysiwyg, keepFold, avHiddenCol bool,
|
||||||
}
|
}
|
||||||
} else if av.KeyTypeCreated == cell.Value.Type {
|
} else if av.KeyTypeCreated == cell.Value.Type {
|
||||||
if nil != cell.Value.Created {
|
if nil != cell.Value.Created {
|
||||||
cell.Value.Created = av.NewFormattedValueCreated(cell.Value.Created.Content, 0, av.CreatedFormatNone)
|
key, _ := attrView.GetKey(cell.Value.KeyID)
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Created {
|
||||||
|
isNotTime = !key.Created.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
cell.Value.Created = av.NewFormattedValueCreated(cell.Value.Created.Content, 0, av.CreatedFormatNone, isNotTime)
|
||||||
}
|
}
|
||||||
} else if av.KeyTypeUpdated == cell.Value.Type {
|
} else if av.KeyTypeUpdated == cell.Value.Type {
|
||||||
if nil != cell.Value.Updated {
|
if nil != cell.Value.Updated {
|
||||||
cell.Value.Updated = av.NewFormattedValueUpdated(cell.Value.Updated.Content, 0, av.UpdatedFormatNone)
|
key, _ := attrView.GetKey(cell.Value.KeyID)
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Updated {
|
||||||
|
isNotTime = !key.Updated.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
|
cell.Value.Updated = av.NewFormattedValueUpdated(cell.Value.Updated.Content, 0, av.UpdatedFormatNone, isNotTime)
|
||||||
}
|
}
|
||||||
} else if av.KeyTypeURL == cell.Value.Type {
|
} else if av.KeyTypeURL == cell.Value.Type {
|
||||||
if nil != cell.Value.URL {
|
if nil != cell.Value.URL {
|
||||||
|
|
|
||||||
|
|
@ -281,6 +281,10 @@ func performTx(tx *Transaction) (ret *TxErr) {
|
||||||
ret = tx.doSetAttrViewColDateFillCreated(op)
|
ret = tx.doSetAttrViewColDateFillCreated(op)
|
||||||
case "setAttrViewColDateFillSpecificTime":
|
case "setAttrViewColDateFillSpecificTime":
|
||||||
ret = tx.doSetAttrViewColDateFillSpecificTime(op)
|
ret = tx.doSetAttrViewColDateFillSpecificTime(op)
|
||||||
|
case "setAttrViewCreatedIncludeTime":
|
||||||
|
ret = tx.doSetAttrViewCreatedIncludeTime(op)
|
||||||
|
case "setAttrViewUpdatedIncludeTime":
|
||||||
|
ret = tx.doSetAttrViewUpdatedIncludeTime(op)
|
||||||
case "duplicateAttrViewKey":
|
case "duplicateAttrViewKey":
|
||||||
ret = tx.doDuplicateAttrViewKey(op)
|
ret = tx.doDuplicateAttrViewKey(op)
|
||||||
case "setAttrViewCoverFrom":
|
case "setAttrViewCoverFrom":
|
||||||
|
|
|
||||||
|
|
@ -370,6 +370,12 @@ func fillAttributeViewAutoGeneratedValues(attrView *av.AttributeView, collection
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case av.KeyTypeCreated: // 渲染创建时间
|
case av.KeyTypeCreated: // 渲染创建时间
|
||||||
|
key, _ := attrView.GetKey(value.KeyID)
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Created {
|
||||||
|
isNotTime = !key.Created.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
ial := map[string]string{}
|
ial := map[string]string{}
|
||||||
block := item.GetBlockValue()
|
block := item.GetBlockValue()
|
||||||
if nil != block {
|
if nil != block {
|
||||||
|
|
@ -385,12 +391,18 @@ func fillAttributeViewAutoGeneratedValues(attrView *av.AttributeView, collection
|
||||||
createdStr := id[:len("20060102150405")]
|
createdStr := id[:len("20060102150405")]
|
||||||
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
|
||||||
if nil == parseErr {
|
if nil == parseErr {
|
||||||
value.Created = av.NewFormattedValueCreated(created.UnixMilli(), 0, av.CreatedFormatNone)
|
value.Created = av.NewFormattedValueCreated(created.UnixMilli(), 0, av.CreatedFormatNone, isNotTime)
|
||||||
value.Created.IsNotEmpty = true
|
value.Created.IsNotEmpty = true
|
||||||
} else {
|
} else {
|
||||||
value.Created = av.NewFormattedValueCreated(time.Now().UnixMilli(), 0, av.CreatedFormatNone)
|
value.Created = av.NewFormattedValueCreated(time.Now().UnixMilli(), 0, av.CreatedFormatNone, isNotTime)
|
||||||
}
|
}
|
||||||
case av.KeyTypeUpdated: // 渲染更新时间
|
case av.KeyTypeUpdated: // 渲染更新时间
|
||||||
|
key, _ := attrView.GetKey(value.KeyID)
|
||||||
|
isNotTime := false
|
||||||
|
if nil != key && nil != key.Updated {
|
||||||
|
isNotTime = !key.Updated.IncludeTime
|
||||||
|
}
|
||||||
|
|
||||||
ial := map[string]string{}
|
ial := map[string]string{}
|
||||||
block := item.GetBlockValue()
|
block := item.GetBlockValue()
|
||||||
if nil != block {
|
if nil != block {
|
||||||
|
|
@ -401,15 +413,15 @@ func fillAttributeViewAutoGeneratedValues(attrView *av.AttributeView, collection
|
||||||
}
|
}
|
||||||
updatedStr := ial["updated"]
|
updatedStr := ial["updated"]
|
||||||
if "" == updatedStr && nil != block {
|
if "" == updatedStr && nil != block {
|
||||||
value.Updated = av.NewFormattedValueUpdated(block.Block.Updated, 0, av.UpdatedFormatNone)
|
value.Updated = av.NewFormattedValueUpdated(block.Block.Updated, 0, av.UpdatedFormatNone, isNotTime)
|
||||||
value.Updated.IsNotEmpty = true
|
value.Updated.IsNotEmpty = true
|
||||||
} else {
|
} else {
|
||||||
updated, parseErr := time.ParseInLocation("20060102150405", updatedStr, time.Local)
|
updated, parseErr := time.ParseInLocation("20060102150405", updatedStr, time.Local)
|
||||||
if nil == parseErr {
|
if nil == parseErr {
|
||||||
value.Updated = av.NewFormattedValueUpdated(updated.UnixMilli(), 0, av.UpdatedFormatNone)
|
value.Updated = av.NewFormattedValueUpdated(updated.UnixMilli(), 0, av.UpdatedFormatNone, isNotTime)
|
||||||
value.Updated.IsNotEmpty = true
|
value.Updated.IsNotEmpty = true
|
||||||
} else {
|
} else {
|
||||||
value.Updated = av.NewFormattedValueUpdated(time.Now().UnixMilli(), 0, av.UpdatedFormatNone)
|
value.Updated = av.NewFormattedValueUpdated(time.Now().UnixMilli(), 0, av.UpdatedFormatNone, isNotTime)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue