feat:实现自定义文档树的展开状态

pull/358/head
lifei6671 2018-08-14 18:17:46 +08:00
parent aa2842cdf8
commit 57a745cc63
7 changed files with 63 additions and 15 deletions

View File

@ -301,6 +301,7 @@ func (c *DocumentController) Create() {
docName := c.GetString("doc_name") docName := c.GetString("doc_name")
parentId, _ := c.GetInt("parent_id", 0) parentId, _ := c.GetInt("parent_id", 0)
docId, _ := c.GetInt("doc_id", 0) docId, _ := c.GetInt("doc_id", 0)
isOpen,_ := c.GetInt("is_open",0)
if identify == "" { if identify == "" {
c.JsonResult(6001, "参数错误") c.JsonResult(6001, "参数错误")
@ -360,8 +361,14 @@ func (c *DocumentController) Create() {
document.DocumentName = docName document.DocumentName = docName
document.ParentId = parentId document.ParentId = parentId
if isOpen == 1 {
document.IsOpen = 1
}else{
document.IsOpen = 0
}
if err := document.InsertOrUpdate(); err != nil { if err := document.InsertOrUpdate(); err != nil {
beego.Error("InsertOrUpdate => ", err) beego.Error("添加或更新文档时出错 -> ", err)
c.JsonResult(6005, "保存失败") c.JsonResult(6005, "保存失败")
} else { } else {
c.JsonResult(0, "ok", document) c.JsonResult(0, "ok", document)

View File

@ -21,6 +21,7 @@ type DocumentHistory struct {
ModifyTime time.Time `orm:"column(modify_time);type(datetime);auto_now" json:"modify_time"` ModifyTime time.Time `orm:"column(modify_time);type(datetime);auto_now" json:"modify_time"`
ModifyAt int `orm:"column(modify_at);type(int)" json:"-"` ModifyAt int `orm:"column(modify_at);type(int)" json:"-"`
Version int64 `orm:"type(bigint);column(version)" json:"version"` Version int64 `orm:"type(bigint);column(version)" json:"version"`
IsOpen int `orm:"column(is_open);type(int);default(0)" json:"is_open"`
} }
type DocumentHistorySimpleResult struct { type DocumentHistorySimpleResult struct {
@ -101,6 +102,7 @@ func (m *DocumentHistory) Restore(historyId, docId, uid int) error {
history.Version = time.Now().Unix() history.Version = time.Now().Unix()
history.Action = "restore" history.Action = "restore"
history.ActionName = "恢复文档" history.ActionName = "恢复文档"
history.IsOpen = doc.IsOpen
history.InsertOrUpdate() history.InsertOrUpdate()
@ -109,6 +111,7 @@ func (m *DocumentHistory) Restore(historyId, docId, uid int) error {
doc.Markdown = m.Markdown doc.Markdown = m.Markdown
doc.Release = m.Content doc.Release = m.Content
doc.Version = time.Now().Unix() doc.Version = time.Now().Unix()
doc.IsOpen = m.IsOpen
_, err = o.Update(doc) _, err = o.Update(doc)

View File

@ -36,7 +36,9 @@ type Document struct {
MemberId int `orm:"column(member_id);type(int)" json:"member_id"` MemberId int `orm:"column(member_id);type(int)" json:"member_id"`
ModifyTime time.Time `orm:"column(modify_time);type(datetime);auto_now" json:"modify_time"` ModifyTime time.Time `orm:"column(modify_time);type(datetime);auto_now" json:"modify_time"`
ModifyAt int `orm:"column(modify_at);type(int)" json:"-"` ModifyAt int `orm:"column(modify_at);type(int)" json:"-"`
Version int64 `orm:"type(bigint);column(version)" json:"version"` Version int64 `orm:"column(version);type(bigint);" json:"version"`
//是否展开子目录0 否/1 是
IsOpen int `orm:"column(is_open);type(int);default(0)" json:"is_open"`
AttachList []*Attachment `orm:"-" json:"attach"` AttachList []*Attachment `orm:"-" json:"attach"`
} }

View File

@ -18,6 +18,7 @@ type DocumentTree struct {
BookIdentify string `json:"-"` BookIdentify string `json:"-"`
Version int64 `json:"version"` Version int64 `json:"version"`
State *DocumentSelected `json:"state,omitempty"` State *DocumentSelected `json:"state,omitempty"`
AAttrs map[string]interface{} `json:"a_attr"`
} }
type DocumentSelected struct { type DocumentSelected struct {
Selected bool `json:"selected"` Selected bool `json:"selected"`
@ -32,7 +33,7 @@ func (m *Document) FindDocumentTree(bookId int) ([]*DocumentTree, error) {
var docs []*Document var docs []*Document
count, err := o.QueryTable(m).Filter("book_id", bookId).OrderBy("order_sort", "document_id").Limit(math.MaxInt32).All(&docs, "document_id", "version", "document_name", "parent_id", "identify") count, err := o.QueryTable(m).Filter("book_id", bookId).OrderBy("order_sort", "document_id").Limit(math.MaxInt32).All(&docs, "document_id", "version", "document_name", "parent_id", "identify","is_open")
if err != nil { if err != nil {
return trees, err return trees, err
@ -45,6 +46,10 @@ func (m *Document) FindDocumentTree(bookId int) ([]*DocumentTree, error) {
tree := &DocumentTree{} tree := &DocumentTree{}
if index == 0 { if index == 0 {
tree.State = &DocumentSelected{Selected: true, Opened: true} tree.State = &DocumentSelected{Selected: true, Opened: true}
tree.AAttrs = map[string]interface{}{ "is_open": true}
}else if item.IsOpen == 1 {
tree.State = &DocumentSelected{Selected: false, Opened: true}
tree.AAttrs = map[string]interface{}{ "is_open": true}
} }
tree.DocumentId = item.DocumentId tree.DocumentId = item.DocumentId
tree.Identify = item.Identify tree.Identify = item.Identify
@ -107,14 +112,14 @@ func getDocumentTree(array []*DocumentTree, parentId int, selectedId int, select
if item.DocumentId == selectedId { if item.DocumentId == selectedId {
selected = ` class="jstree-clicked"` selected = ` class="jstree-clicked"`
} }
selected_li := "" selectedLi := ""
if item.DocumentId == selectedParentId { if item.DocumentId == selectedParentId || (item.State != nil && item.State.Opened) {
selected_li = ` class="jstree-open"` selectedLi = ` class="jstree-open"`
} }
buf.WriteString("<li id=\"") buf.WriteString("<li id=\"")
buf.WriteString(strconv.Itoa(item.DocumentId)) buf.WriteString(strconv.Itoa(item.DocumentId))
buf.WriteString("\"") buf.WriteString("\"")
buf.WriteString(selected_li) buf.WriteString(selectedLi)
buf.WriteString("><a href=\"") buf.WriteString("><a href=\"")
if item.Identify != "" { if item.Identify != "" {
uri := conf.URLFor("DocumentController.Read", ":key", item.BookIdentify, ":id", item.Identify) uri := conf.URLFor("DocumentController.Read", ":key", item.BookIdentify, ":id", item.Identify)

View File

@ -109,10 +109,17 @@ function openEditCatalogDialog($node) {
var text = $node ? $node.text : ''; var text = $node ? $node.text : '';
var parentId = $node && $node.parent !== '#' ? $node.parent : 0; var parentId = $node && $node.parent !== '#' ? $node.parent : 0;
$then.find("input[name='doc_id']").val(doc_id); $then.find("input[name='doc_id']").val(doc_id);
$then.find("input[name='parent_id']").val(parentId); $then.find("input[name='parent_id']").val(parentId);
$then.find("input[name='doc_name']").val(text); $then.find("input[name='doc_name']").val(text);
if($node.a_attr && $node.a_attr.is_open){
$then.find("input[name='is_open'][value='1']").prop("checked","checked");
}else{
$then.find("input[name='is_open'][value='0']").prop("checked","checked");
}
for (var index in window.documentCategory){ for (var index in window.documentCategory){
var item = window.documentCategory[index]; var item = window.documentCategory[index];
if(item.id === doc_id){ if(item.id === doc_id){
@ -196,9 +203,11 @@ $("#btnAddDocument").on("click",function () {
}); });
//用于还原创建文档的遮罩层 //用于还原创建文档的遮罩层
$("#addDocumentModal").on("hidden.bs.modal",function () { $("#addDocumentModal").on("hidden.bs.modal",function () {
$(this).find("form").html(window.addDocumentModalFormHtml); // $(this).find("form").html(window.sessionStorage.getItem("addDocumentModal"));
}).on("shown.bs.modal",function () { }).on("shown.bs.modal",function () {
$(this).find("input[name='doc_name']").focus(); $(this).find("input[name='doc_name']").focus();
}).on("show.bs.modal",function () {
// window.sessionStorage.setItem("addDocumentModal",$(this).find("form").html())
}); });
function showError($msg,$id) { function showError($msg,$id) {
@ -344,7 +353,6 @@ $(function () {
type : "post", type : "post",
data : { "attach_id" : $attach_id}, data : { "attach_id" : $attach_id},
success : function (res) { success : function (res) {
console.log(res);
if(res.errcode === 0){ if(res.errcode === 0){
$this.lists = $this.lists.filter(function ($item) { $this.lists = $this.lists.filter(function ($item) {
return $item.attachment_id != $attach_id; return $item.attachment_id != $attach_id;

View File

@ -3,7 +3,7 @@ $(function () {
js : window.katex.js, js : window.katex.js,
css : window.katex.css css : window.katex.css
}; };
window.addDocumentModalFormHtml = $(this).find("form").html();
window.editor = editormd("docEditor", { window.editor = editormd("docEditor", {
width: "100%", width: "100%",
height: "100%", height: "100%",
@ -256,7 +256,7 @@ $(function () {
} }
/** /**
* *
*/ */
$("#addDocumentForm").ajaxForm({ $("#addDocumentForm").ajaxForm({
beforeSubmit: function () { beforeSubmit: function () {
@ -269,11 +269,20 @@ $(function () {
}, },
success: function (res) { success: function (res) {
if (res.errcode === 0) { if (res.errcode === 0) {
var data = { "id": res.data.doc_id, 'parent': res.data.parent_id === 0 ? '#' : res.data.parent_id , "text": res.data.doc_name, "identify": res.data.identify, "version": res.data.version }; var data = {
"id": res.data.doc_id,
'parent': res.data.parent_id === 0 ? '#' : res.data.parent_id ,
"text": res.data.doc_name,
"identify": res.data.identify,
"version": res.data.version ,
state: { opened: res.data.is_open == 1},
a_attr: { is_open: res.data.is_open == 1}
};
var node = window.treeCatalog.get_node(data.id); var node = window.treeCatalog.get_node(data.id);
if (node) { if (node) {
window.treeCatalog.rename_node({ "id": data.id }, data.text); window.treeCatalog.rename_node({ "id": data.id }, data.text);
$("#sidebar").jstree(true).get_node(data.id).a_attr.is_open = data.state.opened;
} else { } else {
window.treeCatalog.create_node(data.parent, data); window.treeCatalog.create_node(data.parent, data);
window.treeCatalog.deselect_all(); window.treeCatalog.deselect_all();

View File

@ -154,13 +154,27 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label">文档标识</label> <label class="col-sm-2 control-label">文档标识 <span class="error-message">&nbsp;</span></label>
<div class="col-sm-10"> <div class="col-sm-10">
<input type="text" name="doc_identify" id="documentIdentify" placeholder="文档唯一标识" class="form-control" maxlength="50"> <input type="text" name="doc_identify" id="documentIdentify" placeholder="文档唯一标识" class="form-control" maxlength="50">
<p style="color: #999;font-size: 12px;">文档标识只能包含小写字母、数字,以及“-”和“_”符号,并且只能小写字母开头</p> <p style="color: #999;font-size: 12px;">文档标识只能包含小写字母、数字,以及“-”和“_”符号,并且只能小写字母开头</p>
</div> </div>
</div> </div>
<div class="form-group">
<div class="col-lg-6">
<label>
<input type="radio" name="is_open" value="1"> 展开<span class="text">(在阅读时会自动展开节点)</span>
</label>
</div>
<div class="col-lg-6">
<label>
<input type="radio" name="is_open" value="0" checked> 关闭<span class="text">(在阅读时会关闭节点)</span>
</label>
</div>
<div class="clearfix"></div>
</div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<span id="add-error-message" class="error-message"></span> <span id="add-error-message" class="error-message"></span>
@ -223,7 +237,7 @@
</form> </form>
</div> </div>
</div> </div>
<!-- 显示温度历史 --> <!-- 显示文档历史 -->
<div class="modal fade" id="documentHistoryModal" tabindex="-1" role="dialog" aria-labelledby="documentHistoryModalModalLabel"> <div class="modal fade" id="documentHistoryModal" tabindex="-1" role="dialog" aria-labelledby="documentHistoryModalModalLabel">
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
<div class="modal-content"> <div class="modal-content">
@ -317,7 +331,7 @@
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td colspan="6" class="text-center">暂无数据</td> <td colspan="7" class="text-center">暂无数据</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>