diff --git a/core/database/scripts/autobuild/db_00019.sql b/core/database/scripts/autobuild/db_00019.sql index 9089c684..48e6fa31 100644 --- a/core/database/scripts/autobuild/db_00019.sql +++ b/core/database/scripts/autobuild/db_00019.sql @@ -1,6 +1,6 @@ /* enterprise edition */ --- document lifecycle and versions +-- document lifecycle and versioning ALTER TABLE document ADD COLUMN `lifecycle` INT NOT NULL DEFAULT 1 AFTER `approval`; ALTER TABLE document ADD COLUMN `versioned` INT NOT NULL DEFAULT 0 AFTER `lifecycle`; ALTER TABLE document ADD COLUMN `versionid` VARCHAR(100) DEFAULT '' NOT NULL AFTER `versioned`; @@ -19,4 +19,9 @@ INSERT INTO permission(orgid, who, whoid, action, scope, location, refid, create FROM permission WHERE action = 'doc-edit' OR action = 'doc-approve'; +-- implement document section name search indexing +INSERT INTO search (orgid, documentid, itemid, itemtype, content) + SELECT orgid, documentid, refid as itemid, "page" as itemtype, title as content + FROM page WHERE status=0 + -- deprecations diff --git a/domain/document/endpoint.go b/domain/document/endpoint.go index 041628e5..f7cf3f5a 100644 --- a/domain/document/endpoint.go +++ b/domain/document/endpoint.go @@ -269,6 +269,11 @@ func (h *Handler) Update(w http.ResponseWriter, r *http.Request) { if d.Lifecycle == workflow.LifecycleLive { a, _ := h.Store.Attachment.GetAttachments(ctx, documentID) go h.Indexer.IndexDocument(ctx, d, a) + + pages, _ := h.Store.Page.GetPages(ctx, d.RefID) + for i := range pages { + go h.Indexer.IndexContent(ctx, pages[i]) + } } else { go h.Indexer.DeleteDocument(ctx, d.RefID) } diff --git a/domain/search/mysql/store.go b/domain/search/mysql/store.go index ac175ba5..00303156 100644 --- a/domain/search/mysql/store.go +++ b/domain/search/mysql/store.go @@ -121,6 +121,12 @@ func (s Scope) IndexContent(ctx domain.RequestContext, p page.Page) (err error) err = errors.Wrap(err, "execute insert document content entry") } + _, err = ctx.Transaction.Exec("INSERT INTO search (orgid, documentid, itemid, itemtype, content) VALUES (?, ?, ?, ?, ?)", + ctx.OrgID, p.DocumentID, p.RefID, "page", p.Title) + if err != nil { + err = errors.Wrap(err, "execute insert document page title entry") + } + return nil } @@ -148,7 +154,6 @@ func (s Scope) DeleteContent(ctx domain.RequestContext, pageID string) (err erro // Visible documents include both those in the client's own organisation and those that are public, or whose visibility includes the client. func (s Scope) Documents(ctx domain.RequestContext, q search.QueryOptions) (results []search.QueryResult, err error) { q.Keywords = strings.TrimSpace(q.Keywords) - if len(q.Keywords) == 0 { return } @@ -204,29 +209,29 @@ func (s Scope) Documents(ctx domain.RequestContext, q search.QueryOptions) (resu func (s Scope) matchFullText(ctx domain.RequestContext, keywords, itemType string) (r []search.QueryResult, err error) { sql1 := ` - SELECT - s.id, s.orgid, s.documentid, s.itemid, s.itemtype, - d.labelid as spaceid, COALESCE(d.title,'Unknown') AS document, d.tags, d.excerpt, + SELECT + s.id, s.orgid, s.documentid, s.itemid, s.itemtype, + d.labelid as spaceid, COALESCE(d.title,'Unknown') AS document, d.tags, + d.excerpt, d.template, d.versionid, COALESCE(l.label,'Unknown') AS space FROM search s, document d - LEFT JOIN + LEFT JOIN label l ON l.orgid=d.orgid AND l.refid = d.labelid WHERE s.orgid = ? AND s.itemtype = ? - AND s.documentid = d.refid - -- AND d.template = 0 - AND d.labelid IN + AND s.documentid = d.refid + AND d.labelid IN ( - SELECT refid FROM label WHERE orgid=? - AND refid IN (SELECT refid FROM permission WHERE orgid=? AND location='space' AND refid IN ( - SELECT refid from permission WHERE orgid=? AND who='user' AND (whoid=? OR whoid='0') AND location='space' AND action='view' + SELECT refid FROM label WHERE orgid=? AND refid IN + ( + SELECT refid from permission WHERE orgid=? AND who='user' AND (whoid=? OR whoid='0') AND location='space' AND action='view' UNION ALL - SELECT p.refid from permission p LEFT JOIN rolemember r ON p.whoid=r.roleid WHERE p.orgid=? AND p.who='role' AND p.location='space' AND p.action='view' AND r.userid=? - )) - ) + SELECT p.refid from permission p LEFT JOIN rolemember r ON p.whoid=r.roleid WHERE p.orgid=? AND p.who='role' AND p.location='space' AND r.userid=? + ) + ) AND MATCH(s.content) AGAINST(? IN BOOLEAN MODE)` err = s.Runtime.Db.Select(&r, @@ -235,7 +240,6 @@ func (s Scope) matchFullText(ctx domain.RequestContext, keywords, itemType strin itemType, ctx.OrgID, ctx.OrgID, - ctx.OrgID, ctx.UserID, ctx.OrgID, ctx.UserID, @@ -245,7 +249,6 @@ func (s Scope) matchFullText(ctx domain.RequestContext, keywords, itemType strin err = nil r = []search.QueryResult{} } - if err != nil { err = errors.Wrap(err, "search document "+itemType) } @@ -261,25 +264,25 @@ func (s Scope) matchLike(ctx domain.RequestContext, keywords, itemType string) ( keywords = fmt.Sprintf("%%%s%%", keywords) sql1 := ` - SELECT - s.id, s.orgid, s.documentid, s.itemid, s.itemtype, - d.labelid as spaceid, COALESCE(d.title,'Unknown') AS document, d.tags, d.excerpt, + SELECT + s.id, s.orgid, s.documentid, s.itemid, s.itemtype, + d.labelid as spaceid, COALESCE(d.title,'Unknown') AS document, d.tags, d.excerpt, COALESCE(l.label,'Unknown') AS space FROM search s, document d - LEFT JOIN + LEFT JOIN label l ON l.orgid=d.orgid AND l.refid = d.labelid WHERE s.orgid = ? AND s.itemtype = ? - AND s.documentid = d.refid + AND s.documentid = d.refid -- AND d.template = 0 - AND d.labelid IN + AND d.labelid IN ( SELECT refid FROM label WHERE orgid=? AND refid IN (SELECT refid FROM permission WHERE orgid=? AND location='space' AND refid IN ( - SELECT refid from permission WHERE orgid=? AND who='user' AND (whoid=? OR whoid='0') AND location='space' AND action='view' + SELECT refid from permission WHERE orgid=? AND who='user' AND (whoid=? OR whoid='0') AND location='space' AND action='view' UNION ALL SELECT p.refid from permission p LEFT JOIN rolemember r ON p.whoid=r.roleid WHERE p.orgid=? AND p.who='role' AND p.location='space' AND p.action='view' AND (r.userid=? OR r.userid='0') diff --git a/gui/app/components/search/search-results.js b/gui/app/components/search/search-results.js index 3bce1ced..53a9103c 100644 --- a/gui/app/components/search/search-results.js +++ b/gui/app/components/search/search-results.js @@ -12,21 +12,18 @@ import Component from '@ember/component'; export default Component.extend({ - resultPhrase: "", - - init() { - this._super(...arguments); - this.results = []; - }, + resultPhrase: '', didReceiveAttrs() { + this._super(...arguments); + let docs = this.get('results'); let duped = []; let phrase = 'Nothing found'; if (docs.length > 0) { duped = _.uniq(docs, function (item) { - return item.documentId; + return item.get('documentId'); }); let references = docs.length === 1 ? "reference" : "references"; diff --git a/gui/app/models/doc-search-result.js b/gui/app/models/doc-search-result.js index 32a81e21..f65ffd99 100644 --- a/gui/app/models/doc-search-result.js +++ b/gui/app/models/doc-search-result.js @@ -24,5 +24,7 @@ export default Model.extend({ space: attr(), spaceId: attr(), spaceSlug: attr(), + template: attr(), + versionId: attr(), selected: attr() }); diff --git a/gui/app/services/search.js b/gui/app/services/search.js index a66dbd01..df7aab1d 100644 --- a/gui/app/services/search.js +++ b/gui/app/services/search.js @@ -39,4 +39,4 @@ export default Service.extend({ return error; }); }, -}); \ No newline at end of file +}); diff --git a/gui/app/styles/view/search.scss b/gui/app/styles/view/search.scss index 53d4132b..c8800c4b 100644 --- a/gui/app/styles/view/search.scss +++ b/gui/app/styles/view/search.scss @@ -17,7 +17,6 @@ position: relative; margin: 0 0 30px 0; width: 100%; - // height: 150px; &:hover { > .checkbox { @@ -33,26 +32,33 @@ > .title { color: $color-black; - font-size: 1.3rem; + font-weight: bold; + font-size: 1.4rem; + margin-bottom: 5px; + + > .version { + font-size: 1.1rem; + font-weight: bold; + color: $color-gray; + } + } + + > .space { + color: $color-off-black; + font-size: 1.2rem; margin-bottom: 5px; } > .snippet { color: $color-gray; - font-size: 1rem; - line-height: 24px; + font-size: 1.1rem; + margin-bottom: 10px; } &:hover { - color: $color-gray; - > .title { color: $color-link; } - - > .snippet { - color: $color-link; - } } } @@ -61,7 +67,7 @@ display: inline-block; margin: 5px 10px 0 5px; color: $color-gray; - font-size: 0.875rem; + font-size: 1rem; font-style: italic; &:hover { diff --git a/gui/app/templates/components/search/search-results.hbs b/gui/app/templates/components/search/search-results.hbs index 53470aad..a52e4ed0 100644 --- a/gui/app/templates/components/search/search-results.hbs +++ b/gui/app/templates/components/search/search-results.hbs @@ -1,15 +1,23 @@