Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve internal kernel API /api/av/setAttributeViewBlockAttr #10084

Closed
InEase opened this issue Jan 5, 2024 · 11 comments
Closed

Improve internal kernel API /api/av/setAttributeViewBlockAttr #10084

InEase opened this issue Jan 5, 2024 · 11 comments
Assignees

Comments

@InEase
Copy link
Contributor

InEase commented Jan 5, 2024

希望能开放关于数据库操作的内核API

In what scenarios do you need this feature?

再次感谢D大V姐在思源笔记上的辛勤耕耘!

目前思源数据库的功能已经趋于完备,也有越来越多用户使用数据库存储结构性信息。但是同时关于文档级属性面板的呼声也越来越大。虽然说目前可以通过Shift + 点击块标的方式查看属性面板,但是总归没有直接在文档下显示出来方便,直观。相关讨论可见:

但是官方也多次表示,文档级属性面板这方面需要靠社区支持,因为思源不仅仅是文档具有属性,所有块都可以设置属性,考虑到操作,界面的统一性,官方不会推出这方面的功能:

但是还是想D大V大再考虑一下!!事实上,因为文档块还是有其特殊性,它是其他所有块的载体,给它特殊待遇一下也不是不行叭QAQ,因为目前官方对各种数据库类型的支持已经相当完善了,只需要把属性面板下放到标题下方即可完成,减轻社区开发者的工作量和后期维护成本~

但是目前这个功能仍然是刚需,社区的相关插件目前只支持显示内置属性,尚不支持显示数据库属性,主要的困难就在于目前数据库数据获取修改的API实在是有点复杂,而且处于开发阶段还不稳定,不敢轻易对接。

InEase/SiYuan-Attributes-Panel#4 (comment)

虽然官方曾表示等后期数据库公测稳定之后再考虑开放API:

#9898 (comment)

但是考虑到:

  1. 目前这个功能非常刚需,社区呼声较大

  2. 目前数据库的底层结构已经趋于稳定,可以尝试开放API给开发者测试

所以希望D大V姐可以再考虑一下!可以暂时先开放一些测试接口给插件测试~暂时仅限于查询修改即可~正好也可以测试相关bug嘛,麻烦D大V姐了,祝思源越来越好~

Describe the optimal solution

增加数据库操作相关内核API

@88250
Copy link
Member

88250 commented Jan 5, 2024

请帮忙整理一下目前需要的 APIs,谢谢。

@InEase
Copy link
Contributor Author

InEase commented Jan 5, 2024

我去,刚刚去整理的时候,突然发现,我之前一直以为修改属性必须要通过transaction,忽略了上面还有一个setAttributeViewBlockAttr,如果用transaction的话肯定不行,太复杂了,但是setAttributeViewBlockAttr这个就已经很简洁了。(捂脸

@InEase
Copy link
Contributor Author

InEase commented Jan 5, 2024

辛苦D大了!那看起来好像做属性面板所需的数据库查改已经没问题啦~但是还有几个小点:

  1. 在修改属性的时候连续发送了三个请求,如果由外部调用setAttributeViewBlockAttr API修改对应的属性之后,不调用transaction 会导致其他问题吗~
    image

  2. 在数据读取方面,目前已经有API /api/av/getAttributeViewKeys 可以通过块id查询关联的数据库内容,主要问题就是API返回的信息有点太多了,解析起来可能要花点功夫,如果可以以键值对的方式返回就更加方便了(参考飞书多维表格 https://open.feishu.cn/document/server-docs/docs/bitable-v1/app-table-record/list )。不过问题不大,返回的信息丰富一点也是一个好处,这方面暂时应该不需要另外设计API啦~

  3. 其实属性面板的API已经齐了(只是之前没看到,捂脸),但是如果要完善插件体系,可能还需要以下API:

    1. 在数据库中增加一列:对应用户在页面中增加属性
    2. 在数据库中增加 / 删除某一行:例如导入数据时,比如让数据库与子文档对应
    3. 添加Eventbus事件,(例如修改单元格数据,增删行列等):可以借助插件实现一些自动化操作

目前暂时想到的就这些,辛苦D大V大~

@InEase
Copy link
Contributor Author

InEase commented Jan 6, 2024

诶不过修改数据的时候发现,有几个类型(日期,单选,多选)目前好像还是通过transaction完成修改的嘛,这方面的修改API可不可以也使用setAttributeViewBlockAttr,这样会方便很多!谢谢~

element.querySelectorAll(".b3-text-field--text").forEach((item: HTMLInputElement) => {
item.addEventListener("change", () => {
let value;
if (["url", "text", "email", "phone"].includes(item.parentElement.dataset.type)) {
value = {
[item.parentElement.dataset.type]: {
content: item.value
}
};
} else if (item.parentElement.dataset.type === "number") {
value = {
number: {
content: parseFloat(item.value)
}
};
}

@zxhd863943427
Copy link
Contributor

据我观察,不使用transaction只会有一个问题:没有撤回功能了。

@88250
Copy link
Member

88250 commented Jan 6, 2024

辛苦D大了!那看起来好像做属性面板所需的数据库查改已经没问题啦~但是还有几个小点:

  1. 在修改属性的时候连续发送了三个请求,如果由外部调用setAttributeViewBlockAttr API修改对应的属性之后,不调用transaction 会导致其他问题吗~
    image

  2. 在数据读取方面,目前已经有API /api/av/getAttributeViewKeys 可以通过块id查询关联的数据库内容,主要问题就是API返回的信息有点太多了,解析起来可能要花点功夫,如果可以以键值对的方式返回就更加方便了(参考飞书多维表格 https://open.feishu.cn/document/server-docs/docs/bitable-v1/app-table-record/list )。不过问题不大,返回的信息丰富一点也是一个好处,这方面暂时应该不需要另外设计API啦~

  3. 其实属性面板的API已经齐了(只是之前没看到,捂脸),但是如果要完善插件体系,可能还需要以下API:

    1. 在数据库中增加一列:对应用户在页面中增加属性
    2. 在数据库中增加 / 删除某一行:例如导入数据时,比如让数据库与子文档对应
    3. 添加Eventbus事件,(例如修改单元格数据,增删行列等):可以借助插件实现一些自动化操作

目前暂时想到的就这些,辛苦D大V大~

  1. 我这里看在 属性面板 - 数据库 中修改只有一个请求

    image

    不调用 transaction 不会有影响。

  2. 目前 属性面板 - 数据库 暂时不支持新建列、删除列和调整排序列,后面再考虑支持;自动化相关触发机制也要等后面一点考虑


诶不过修改数据的时候发现,有几个类型(日期,单选,多选)目前好像还是通过transaction完成修改的嘛,这方面的修改API可不可以也使用setAttributeViewBlockAttr,这样会方便很多!谢谢~

element.querySelectorAll(".b3-text-field--text").forEach((item: HTMLInputElement) => {
item.addEventListener("change", () => {
let value;
if (["url", "text", "email", "phone"].includes(item.parentElement.dataset.type)) {
value = {
[item.parentElement.dataset.type]: {
content: item.value
}
};
} else if (item.parentElement.dataset.type === "number") {
value = {
number: {
content: parseFloat(item.value)
}
};
}

目前确实是这样的,下个版本应该可以通过 setAttributeViewBlockAttr 进行支持。

@88250 88250 self-assigned this Jan 6, 2024
@88250 88250 changed the title 希望能开放关于数据库操作的内核API Improve internal kernel API /api/av/setAttributeViewBlockAttr Jan 6, 2024
@88250 88250 added this to the 2.12.1 milestone Jan 6, 2024
@88250
Copy link
Member

88250 commented Jan 6, 2024

@InEase 刚刚看了下,setAttributeViewBlockAttr 接口实际上是支持传入任何类型的 value 的,只是目前前端较为复杂,为了复用界面组件的一些逻辑所以走的是 transaction,插件的话这些逻辑应该都是自己开发的,所以不存在这个复用,直接用这个接口并传入列类型对应的 value 就行了。

@88250 88250 removed the Development label Jan 6, 2024
@88250 88250 removed this from the 2.12.1 milestone Jan 6, 2024
@88250
Copy link
Member

88250 commented Jan 6, 2024

我先关闭了,如果还有问题请继续跟帖,谢谢 🙏

@88250 88250 closed this as completed Jan 6, 2024
@InEase
Copy link
Contributor Author

InEase commented Jan 8, 2024

好的,收到收到~!因为周末有些事情没有及时回复,感谢!

@88250

This comment was marked as outdated.

@88250
Copy link
Member

88250 commented Jan 12, 2024

考虑了下,后续会单独提供内核接口 #10160

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants