diff --git a/domain/conversion/conversion.go b/domain/conversion/conversion.go index 2d71a0a1..828178c6 100644 --- a/domain/conversion/conversion.go +++ b/domain/conversion/conversion.go @@ -229,12 +229,12 @@ func processDocument(ctx domain.RequestContext, store *domain.Store, filename, j return } - err = store.Document.Update(ctx, newDocument) // TODO review - this seems to write-back an unaltered record from that read above, but within that it calls searches.UpdateDocument() to reindex the doc. - if err != nil { - ctx.Transaction.Rollback() - err = errors.Wrap(err, "cannot updater new document") - return - } + // err = store.Document.Update(ctx, newDocument) // TODO review - this seems to write-back an unaltered record from that read above, but within that it calls searches.UpdateDocument() to reindex the doc. + // if err != nil { + // ctx.Transaction.Rollback() + // err = errors.Wrap(err, "cannot updater new document") + // return + // } store.Activity.RecordUserActivity(ctx, activity.UserActivity{ LabelID: newDocument.LabelID, diff --git a/domain/document/mysql/store.go b/domain/document/mysql/store.go index 23b0753b..b49c2cf7 100644 --- a/domain/document/mysql/store.go +++ b/domain/document/mysql/store.go @@ -157,7 +157,7 @@ func (s Scope) GetByTag(ctx domain.RequestContext, tag string) (documents []doc. } // Templates returns a slice containing the documents available as templates to the client's organisation, in title order. -func (s Scope) Templates(ctx domain.RequestContext) ( documents []doc.Document, err error) { +func (s Scope) Templates(ctx domain.RequestContext) (documents []doc.Document, err error) { err = s.Runtime.Db.Select(&documents, `SELECT id, refid, orgid, labelid, userid, job, location, title, excerpt, slug, tags, template, layout, created, revised FROM document WHERE orgid=? AND template=1 AND labelid IN (SELECT refid from label WHERE orgid=? AND type=2 AND userid=? @@ -174,7 +174,33 @@ func (s Scope) Templates(ctx domain.RequestContext) ( documents []doc.Document, ctx.UserID) if err != nil { - err = errors.Wrap(err, "select documents templates") + err = errors.Wrap(err, "select document templates") + return + } + + return +} + +// TemplatesBySpace returns a slice containing the documents available as templates for given space. +func (s Scope) TemplatesBySpace(ctx domain.RequestContext, spaceID string) (documents []doc.Document, err error) { + err = s.Runtime.Db.Select(&documents, + `SELECT id, refid, orgid, labelid, userid, job, location, title, excerpt, slug, tags, template, layout, created, revised FROM document WHERE orgid=? AND labelid=? AND template=1 AND labelid IN + (SELECT refid from label WHERE orgid=? AND type=2 AND userid=? + UNION ALL SELECT refid FROM label a where orgid=? AND type=1 AND refid IN (SELECT labelid from labelrole WHERE orgid=? AND userid='' AND (canedit=1 OR canview=1)) + UNION ALL SELECT refid FROM label a where orgid=? AND type=3 AND refid IN (SELECT labelid from labelrole WHERE orgid=? AND userid=? AND (canedit=1 OR canview=1))) + ORDER BY title`, + ctx.OrgID, + spaceID, + ctx.OrgID, + ctx.UserID, + ctx.OrgID, + ctx.OrgID, + ctx.OrgID, + ctx.OrgID, + ctx.UserID) + + if err != nil { + err = errors.Wrap(err, "select space document templates") return } diff --git a/domain/storer.go b/domain/storer.go index fca30dc1..d244acfa 100644 --- a/domain/storer.go +++ b/domain/storer.go @@ -133,6 +133,7 @@ type DocumentStorer interface { GetByTag(ctx RequestContext, tag string) (documents []doc.Document, err error) DocumentList(ctx RequestContext) (documents []doc.Document, err error) Templates(ctx RequestContext) (documents []doc.Document, err error) + TemplatesBySpace(ctx RequestContext, spaceID string) (documents []doc.Document, err error) DocumentMeta(ctx RequestContext, id string) (meta doc.DocumentMeta, err error) PublicDocuments(ctx RequestContext, orgID string) (documents []doc.SitemapDocument, err error) Update(ctx RequestContext, document doc.Document) (err error) diff --git a/domain/template/endpoint.go b/domain/template/endpoint.go index 8ee2209a..4f3e1fc4 100644 --- a/domain/template/endpoint.go +++ b/domain/template/endpoint.go @@ -49,7 +49,13 @@ func (h *Handler) SavedList(w http.ResponseWriter, r *http.Request) { method := "template.saved" ctx := domain.GetRequestContext(r) - documents, err := h.Store.Document.Templates(ctx) + folderID := request.Param(r, "folderID") + if len(folderID) == 0 { + response.WriteMissingDataError(w, method, "folderID") + return + } + + documents, err := h.Store.Document.TemplatesBySpace(ctx, folderID) if err != nil { response.WriteServerError(w, method, err) h.Runtime.Log.Error(method, err) @@ -67,7 +73,9 @@ func (h *Handler) SavedList(w http.ResponseWriter, r *http.Request) { t.Dated = d.Created t.Type = template.TypePrivate - templates = append(templates, t) + if d.LabelID == folderID { + templates = append(templates, t) + } } response.WriteJSON(w, templates) diff --git a/gui/app/components/folder/start-document.js b/gui/app/components/folder/start-document.js index 7d4b4446..e521c36a 100644 --- a/gui/app/components/folder/start-document.js +++ b/gui/app/components/folder/start-document.js @@ -12,14 +12,13 @@ import Ember from 'ember'; import NotifierMixin from '../../mixins/notifier'; - const { computed, } = Ember; + export default Ember.Component.extend(NotifierMixin, { localStorage: Ember.inject.service(), appMeta: Ember.inject.service(), - templateService: Ember.inject.service('template'), canEditTemplate: "", importedDocuments: [], savedTemplates: [], @@ -27,27 +26,14 @@ export default Ember.Component.extend(NotifierMixin, { newDocumentName: 'New Document', newDocumentNameMissing: computed.empty('newDocumentName'), - init() { - this._super(...arguments); - - this.get('templateService').getSavedTemplates().then((saved) => { - let emptyTemplate = { - id: "0", - title: "Empty", - description: "An empty canvas for your words", - layout: "doc", - locked: true - }; - - saved.unshiftObject(emptyTemplate); - this.set('savedTemplates', saved); - }); - }, - didInsertElement() { this.setupImport(); }, + didReceiveAttrs() { + this.setupTemplates(); + }, + willDestroyElement() { if (is.not.null(this.get('drop'))) { this.get('drop').destroy(); @@ -55,6 +41,21 @@ export default Ember.Component.extend(NotifierMixin, { } }, + setupTemplates() { + let templates = this.get('templates'); + + let emptyTemplate = { + id: "0", + title: "Empty", + description: "An empty canvas for your words", + layout: "doc", + locked: true + }; + + templates.unshiftObject(emptyTemplate); + this.set('savedTemplates', templates); + }, + setupImport() { // already done init? if (is.not.null(this.get('drop'))) { @@ -151,4 +152,3 @@ export default Ember.Component.extend(NotifierMixin, { }, } }); - diff --git a/gui/app/pods/folder/route.js b/gui/app/pods/folder/route.js index e064bcac..6d93dd62 100644 --- a/gui/app/pods/folder/route.js +++ b/gui/app/pods/folder/route.js @@ -15,6 +15,7 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout export default Ember.Route.extend(AuthenticatedRouteMixin, { documentService: Ember.inject.service('document'), folderService: Ember.inject.service('folder'), + templateService: Ember.inject.service('template'), session: Ember.inject.service(''), folder: {}, @@ -41,7 +42,8 @@ export default Ember.Route.extend(AuthenticatedRouteMixin, { isEditor: this.get('isEditor'), isFolderOwner: this.get('isFolderOwner'), folders: this.get('folderService').getAll(), - documents: this.get('documentService').getAllByFolder(params.folder_id) + documents: this.get('documentService').getAllByFolder(params.folder_id), + templates: this.get('templateService').getSavedTemplates(params.folder_id) }); }, diff --git a/gui/app/pods/folder/template.hbs b/gui/app/pods/folder/template.hbs index 0aa88c09..b062d4f4 100644 --- a/gui/app/pods/folder/template.hbs +++ b/gui/app/pods/folder/template.hbs @@ -8,7 +8,7 @@ {{folder/folder-heading folder=model.folder isFolderOwner=model.isFolderOwner isEditor=model.isEditor}} {{folder/folder-toolbar folders=model.folders folder=model.folder hasSelectedDocuments=hasSelectedDocuments onDeleteDocument=(action 'onDeleteDocument') onMoveDocument=(action 'onMoveDocument')}} - {{folder/documents-list documents=model.documents folders=model.folders folder=model.folder isFolderOwner=model.isFolderOwner isEditor=model.isEditor + {{folder/documents-list documents=model.documents folders=model.folders folder=model.folder templates=model.templates isFolderOwner=model.isFolderOwner isEditor=model.isEditor onDocumentsChecked=(action 'onDocumentsChecked') onDeleteSpace=(action 'onDeleteSpace') onImport=(action 'onImport')}} {{/layout/zone-content}} {{/layout/zone-container}} \ No newline at end of file diff --git a/gui/app/services/template.js b/gui/app/services/template.js index c2b4fada..b3acf7a4 100644 --- a/gui/app/services/template.js +++ b/gui/app/services/template.js @@ -32,8 +32,8 @@ export default Ember.Service.extend({ }); }, - getSavedTemplates() { - return this.get('ajax').request(`templates`, { + getSavedTemplates(folderId) { + return this.get('ajax').request(`templates/${folderId}`, { method: 'GET' }).then((response) => { if (is.not.array(response)) { diff --git a/gui/app/templates/components/folder/documents-list.hbs b/gui/app/templates/components/folder/documents-list.hbs index 3d32a594..16e82ff5 100644 --- a/gui/app/templates/components/folder/documents-list.hbs +++ b/gui/app/templates/components/folder/documents-list.hbs @@ -33,7 +33,7 @@ {{/each}} -{{folder/start-document folder=folder isEditor=isEditor onImport=(action 'onImport') onHideDocumentWizard=(action 'onHideDocumentWizard')}} +{{folder/start-document folder=folder templates=templates isEditor=isEditor onImport=(action 'onImport') onHideDocumentWizard=(action 'onHideDocumentWizard')}} {{#if emptyState}} {{#if canCreate}} diff --git a/server/routing/routes.go b/server/routing/routes.go index e182c8f1..1341f354 100644 --- a/server/routing/routes.go +++ b/server/routing/routes.go @@ -135,8 +135,8 @@ func RegisterEndpoints(rt *env.Runtime, s *domain.Store) { Add(rt, RoutePrefixPrivate, "search", []string{"POST", "OPTIONS"}, nil, document.SearchDocuments) Add(rt, RoutePrefixPrivate, "templates", []string{"POST", "OPTIONS"}, nil, template.SaveAs) - Add(rt, RoutePrefixPrivate, "templates", []string{"GET", "OPTIONS"}, nil, template.SavedList) Add(rt, RoutePrefixPrivate, "templates/{templateID}/folder/{folderID}", []string{"POST", "OPTIONS"}, []string{"type", "saved"}, template.Use) + Add(rt, RoutePrefixPrivate, "templates/{folderID}", []string{"GET", "OPTIONS"}, nil, template.SavedList) Add(rt, RoutePrefixPrivate, "sections", []string{"GET", "OPTIONS"}, nil, section.GetSections) Add(rt, RoutePrefixPrivate, "sections", []string{"POST", "OPTIONS"}, nil, section.RunSectionCommand)