1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-24 07:39:43 +02:00

Merge pull request #148 from documize/draw

Draw.io integration
This commit is contained in:
Saul S 2018-05-04 12:37:01 +01:00 committed by GitHub
commit fb193ce9f9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
47 changed files with 11956 additions and 778 deletions

View file

@ -1,4 +1,3 @@
# Documize - author, track and deliver documentation
## The mission
@ -52,9 +51,9 @@ Space view.
## Latest version
[Community edition: v1.63.1](https://github.com/documize/community/releases)
[Community edition: v1.64.0](https://github.com/documize/community/releases)
[Enterprise edition: v1.65.1](https://documize.com/downloads)
[Enterprise edition: v1.66.0](https://documize.com/downloads)
## OS support

View file

@ -13,11 +13,11 @@ cd ..
rd /s /q embed\bindata\public
mkdir embed\bindata\public
echo "Copying Ember assets folder"
robocopy /e /NFL /NDL /NJH gui\dist-prod\assets embed\bindata\public\assets
robocopy /e /NFL /NDL /NJH gui\dist-prod\assets embed\bindata\public\assets
echo "Copying Ember codemirror folder"
robocopy /e /NFL /NDL /NJH gui\dist-prod\codemirror embed\bindata\public\codemirror
echo "Copying Ember tinymce folder"
robocopy /e /NFL /NDL /NJH gui\dist-prod\tinymce embed\bindata\public\tinymce
robocopy /e /NFL /NDL /NJH gui\dist-prod\tinymce embed\bindata\public\tinymce
echo "Copying Ember sections folder"
robocopy /e /NFL /NDL /NJH gui\dist-prod\sections embed\bindata\public\sections
@ -40,7 +40,7 @@ echo "Generating in-memory static assets..."
go get -u github.com/jteeuwen/go-bindata/...
go get -u github.com/elazarl/go-bindata-assetfs/...
cd embed
go generate
go generate
cd ..
echo "Compiling Windows"
@ -53,4 +53,4 @@ go build -gcflags=-trimpath=%GOPATH% -asmflags=-trimpath=%GOPATH% -o bin/documiz
echo "Compiling Darwin"
set GOOS=darwin
go build -gcflags=-trimpath=%GOPATH% -asmflags=-trimpath=%GOPATH% -o bin/documize-community-darwin-amd64 edition/community.go
go build -gcflags=-trimpath=%GOPATH% -asmflags=-trimpath=%GOPATH% -o bin/documize-community-darwin-amd64 edition/community.go

View file

@ -54,4 +54,4 @@ echo "Finished."
# CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" -installsuffix cgo
# go build -ldflags '-d -s -w' -a -tags netgo -installsuffix netgo test.go
# ldd test
# ldd test

View file

@ -23,11 +23,11 @@ func MakeInitials(firstname, lastname string) string {
b := ""
if len(firstname) > 0 {
a = firstname[:1]
a = string([]rune(firstname)[:1])
}
if len(lastname) > 0 {
b = lastname[:1]
b = string([]rune(lastname)[:1])
}
return strings.ToUpper(a + b)

View file

@ -13,11 +13,13 @@ package stringutil
import "testing"
// go test github.com/documize/community/core/stringutil -run TestInitials
func TestInitials(t *testing.T) {
in(t, "Harvey", "Kandola", "HK")
in(t, "Harvey", "", "H")
in(t, "", "Kandola", "K")
in(t, "", "", "")
in(t, "Иванов", "Иванов", "ИИ")
}
func in(t *testing.T, firstname, lastname, expecting string) {

View file

@ -20,19 +20,21 @@ import (
)
// DocumentApprover notifies user who has just been granted document approval rights.
func (m *Mailer) DocumentApprover(recipient, inviter, url, document string) {
func (m *Mailer) DocumentApprover(recipient, inviterName, inviterEmail, url, document string) {
method := "DocumentApprover"
m.Initialize()
// check inviter name
if inviter == "Hello You" || len(inviter) == 0 {
inviter = "Your colleague"
if inviterName == "Hello You" || len(inviterName) == 0 {
inviterName = "Your colleague"
}
em := smtp.EmailMessage{}
em.Subject = fmt.Sprintf("%s has granted you document approval", inviter)
em.Subject = fmt.Sprintf("%s has granted you document approval", inviterName)
em.ToEmail = recipient
em.ToName = recipient
em.ReplyTo = inviterEmail
em.ReplyName = inviterName
parameters := struct {
Subject string
@ -41,7 +43,7 @@ func (m *Mailer) DocumentApprover(recipient, inviter, url, document string) {
Document string
}{
em.Subject,
inviter,
inviterName,
url,
document,
}

View file

@ -18,19 +18,21 @@ import (
)
// ShareSpaceExistingUser provides an existing user with a link to a newly shared space.
func (m *Mailer) ShareSpaceExistingUser(recipient, inviter, url, folder, intro string) {
func (m *Mailer) ShareSpaceExistingUser(recipient, inviterName, inviterEmail, url, folder, intro string) {
method := "ShareSpaceExistingUser"
m.Initialize()
// check inviter name
if inviter == "Hello You" || len(inviter) == 0 {
inviter = "Your colleague"
if inviterName == "Hello You" || len(inviterName) == 0 {
inviterName = "Your colleague"
}
em := smtp.EmailMessage{}
em.Subject = fmt.Sprintf("%s has shared %s with you", inviter, folder)
em.Subject = fmt.Sprintf("%s has shared %s with you", inviterName, folder)
em.ToEmail = recipient
em.ToName = recipient
em.ReplyTo = inviterEmail
em.ReplyName = inviterName
parameters := struct {
Subject string
@ -40,7 +42,7 @@ func (m *Mailer) ShareSpaceExistingUser(recipient, inviter, url, folder, intro s
Intro string
}{
em.Subject,
inviter,
inviterName,
url,
folder,
intro,
@ -63,19 +65,21 @@ func (m *Mailer) ShareSpaceExistingUser(recipient, inviter, url, folder, intro s
}
// ShareSpaceNewUser invites new user providing Credentials, explaining the product and stating who is inviting them.
func (m *Mailer) ShareSpaceNewUser(recipient, inviter, url, space, invitationMessage string) {
func (m *Mailer) ShareSpaceNewUser(recipient, inviterName, inviterEmail, url, space, invitationMessage string) {
method := "ShareSpaceNewUser"
m.Initialize()
// check inviter name
if inviter == "Hello You" || len(inviter) == 0 {
inviter = "Your colleague"
if inviterName == "Hello You" || len(inviterName) == 0 {
inviterName = "Your colleague"
}
em := smtp.EmailMessage{}
em.Subject = fmt.Sprintf("%s has shared %s with you on Documize", inviter, space)
em.Subject = fmt.Sprintf("%s has shared %s with you on Documize", inviterName, space)
em.ToEmail = recipient
em.ToName = recipient
em.ReplyTo = inviterEmail
em.ReplyName = inviterName
parameters := struct {
Subject string
@ -85,7 +89,7 @@ func (m *Mailer) ShareSpaceNewUser(recipient, inviter, url, space, invitationMes
Folder string
}{
em.Subject,
inviter,
inviterName,
url,
invitationMessage,
space,

View file

@ -18,19 +18,21 @@ import (
)
// InviteNewUser invites someone new providing credentials, explaining the product and stating who is inviting them.
func (m *Mailer) InviteNewUser(recipient, inviter, url, username, password string) {
func (m *Mailer) InviteNewUser(recipient, inviterName, inviterEmail, url, username, password string) {
method := "InviteNewUser"
m.Initialize()
// check inviter name
if inviter == "Hello You" || len(inviter) == 0 {
inviter = "Your colleague"
if inviterName == "Hello You" || len(inviterName) == 0 {
inviterName = "Your colleague"
}
em := smtp.EmailMessage{}
em.Subject = fmt.Sprintf("%s has invited you to Documize", inviter)
em.Subject = fmt.Sprintf("%s has invited you to Documize", inviterName)
em.ToEmail = recipient
em.ToName = recipient
em.ReplyTo = inviterEmail
em.ReplyName = inviterName
parameters := struct {
Subject string
@ -40,7 +42,7 @@ func (m *Mailer) InviteNewUser(recipient, inviter, url, username, password strin
Password string
}{
em.Subject,
inviter,
inviterName,
url,
recipient,
password,
@ -63,19 +65,21 @@ func (m *Mailer) InviteNewUser(recipient, inviter, url, username, password strin
}
// InviteExistingUser invites a known user to an organization.
func (m *Mailer) InviteExistingUser(recipient, inviter, url string) {
func (m *Mailer) InviteExistingUser(recipient, inviterName, inviterEmail, url string) {
method := "InviteExistingUser"
m.Initialize()
// check inviter name
if inviter == "Hello You" || len(inviter) == 0 {
inviter = "Your colleague"
if inviterName == "Hello You" || len(inviterName) == 0 {
inviterName = "Your colleague"
}
em := smtp.EmailMessage{}
em.Subject = fmt.Sprintf("%s has invited you to their Documize account", inviter)
em.Subject = fmt.Sprintf("%s has invited you to their Documize account", inviterName)
em.ToEmail = recipient
em.ToName = recipient
em.ReplyTo = inviterEmail
em.ReplyName = inviterName
parameters := struct {
Subject string
@ -83,7 +87,7 @@ func (m *Mailer) InviteExistingUser(recipient, inviter, url string) {
URL string
}{
em.Subject,
inviter,
inviterName,
url,
}

View file

@ -200,7 +200,7 @@ func (h *Handler) SetSpacePermissions(w http.ResponseWriter, r *http.Request) {
}
mailer := mail.Mailer{Runtime: h.Runtime, Store: h.Store, Context: ctx}
go mailer.ShareSpaceExistingUser(existingUser.Email, inviter.Fullname(), url, sp.Name, model.Message)
go mailer.ShareSpaceExistingUser(existingUser.Email, inviter.Fullname(), inviter.Email, url, sp.Name, model.Message)
h.Runtime.Log.Info(fmt.Sprintf("%s is sharing space %s with existing user %s", inviter.Email, sp.Name, existingUser.Email))
}
}
@ -701,7 +701,7 @@ func (h *Handler) SetDocumentPermissions(w http.ResponseWriter, r *http.Request)
}
mailer := mail.Mailer{Runtime: h.Runtime, Store: h.Store, Context: ctx}
go mailer.DocumentApprover(existingUser.Email, inviter.Fullname(), url, doc.Title)
go mailer.DocumentApprover(existingUser.Email, inviter.Fullname(), inviter.Email, url, doc.Title)
h.Runtime.Log.Info(fmt.Sprintf("%s has made %s document approver for: %s", inviter.Email, existingUser.Email, doc.Title))
}
}

View file

@ -0,0 +1,54 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
package flowchart
import (
"net/http"
"github.com/documize/community/core/env"
"github.com/documize/community/domain"
"github.com/documize/community/domain/section/provider"
)
// Provider represents Draw.io
type Provider struct {
Runtime *env.Runtime
Store *domain.Store
}
// Meta describes us
func (*Provider) Meta() provider.TypeMeta {
section := provider.TypeMeta{}
section.ID = "d46a18f6-49fb-11e8-842f-0ed5f89f718b"
section.Title = "Draw.io Diagram"
section.Description = "Draw.io powered flowcharts and diagrams"
section.ContentType = "flowchart"
section.PageType = "tab"
section.Order = 9991
return section
}
// Command stub.
func (p *Provider) Command(ctx *provider.Context, w http.ResponseWriter, r *http.Request) {
}
// Render returns data as-is (HTML).
func (p *Provider) Render(ctx *provider.Context, config, data string) string {
return data
}
// Refresh just sends back data as-is.
func (*Provider) Refresh(ctx *provider.Context, config, data string) string {
return data
}

View file

@ -25,7 +25,7 @@ import (
"github.com/documize/community/domain/section/provider"
)
// Provider represents Mermaid Diagram
// Provider represents PlantUML Text Diagram
type Provider struct {
Runtime *env.Runtime
Store *domain.Store

View file

@ -18,6 +18,7 @@ import (
"github.com/documize/community/domain"
"github.com/documize/community/domain/section/airtable"
"github.com/documize/community/domain/section/code"
"github.com/documize/community/domain/section/flowchart"
"github.com/documize/community/domain/section/gemini"
"github.com/documize/community/domain/section/markdown"
"github.com/documize/community/domain/section/papertrail"
@ -41,6 +42,7 @@ func Register(rt *env.Runtime, s *domain.Store) {
provider.Register("wysiwyg", &wysiwyg.Provider{Runtime: rt, Store: s})
provider.Register("airtable", &airtable.Provider{Runtime: rt, Store: s})
provider.Register("plantuml", &plantuml.Provider{Runtime: rt, Store: s})
provider.Register("flowchart", &flowchart.Provider{Runtime: rt, Store: s})
p := provider.List()
rt.Log.Info(fmt.Sprintf("Registered %d sections", len(p)))

View file

@ -88,10 +88,12 @@ func Connect(c Config) (d *mail.Dialer, err error) {
// EmailMessage represents email to be sent.
type EmailMessage struct {
ToEmail string
ToName string
Subject string
BodyHTML string
ToEmail string
ToName string
Subject string
BodyHTML string
ReplyTo string
ReplyName string
}
// SendMessage sends email using specified SMTP connection
@ -102,6 +104,17 @@ func SendMessage(d *mail.Dialer, c Config, em EmailMessage) (b bool, err error)
m.SetHeader("From", m.FormatAddress(c.SenderEmail, c.SenderName))
m.SetHeader("To", m.FormatAddress(em.ToEmail, em.ToName))
// Where do replies go?
reply := c.SenderEmail
replyName := c.SenderName
if len(em.ReplyTo) > 0 {
reply = em.ReplyTo
}
if len(em.ReplyName) > 0 {
replyName = em.ReplyName
}
m.SetAddressHeader("Reply-To", reply, replyName)
// content
m.SetHeader("Subject", em.Subject)
m.SetBody("text/html", em.BodyHTML)

View file

@ -868,7 +868,7 @@ func (h *Handler) Invite(w http.ResponseWriter, r *http.Request) {
url := ctx.GetAppURL(fmt.Sprintf("s/%s/%s", sp.RefID, stringutil.MakeSlug(sp.Name)))
mailer := mail.Mailer{Runtime: h.Runtime, Store: h.Store, Context: ctx}
go mailer.ShareSpaceExistingUser(email, inviter.Fullname(), url, sp.Name, model.Message)
go mailer.ShareSpaceExistingUser(email, inviter.Fullname(), inviter.Email, url, sp.Name, model.Message)
h.Runtime.Log.Info(fmt.Sprintf("%s is sharing space %s with existing user %s", inviter.Email, sp.Name, email))
} else {

View file

@ -79,7 +79,7 @@ func inviteNewUserToSharedSpace(ctx domain.RequestContext, rt *env.Runtime, s *d
mailer := mail.Mailer{Runtime: rt, Store: s, Context: ctx}
url := fmt.Sprintf("%s/%s", baseURL, u.Salt)
go mailer.ShareSpaceNewUser(u.Email, invitedBy.Fullname(), url, sp.Name, invitationMessage)
go mailer.ShareSpaceNewUser(u.Email, invitedBy.Fullname(), invitedBy.Email, url, sp.Name, invitationMessage)
return
}

View file

@ -218,12 +218,12 @@ func (h *Handler) Add(w http.ResponseWriter, r *http.Request) {
url := fmt.Sprintf("%s/%s", ctx.GetAppURL("auth/sso"), url.QueryEscape(string(encrypted)))
mailer := mail.Mailer{Runtime: h.Runtime, Store: h.Store, Context: ctx}
go mailer.InviteNewUser(userModel.Email, inviter.Fullname(), url, userModel.Email, requestedPassword)
go mailer.InviteNewUser(userModel.Email, inviter.Fullname(), inviter.Email, url, userModel.Email, requestedPassword)
h.Runtime.Log.Info(fmt.Sprintf("%s invited by %s on %s", userModel.Email, inviter.Email, ctx.AppURL))
} else {
mailer := mail.Mailer{Runtime: h.Runtime, Store: h.Store, Context: ctx}
go mailer.InviteExistingUser(userModel.Email, inviter.Fullname(), ctx.GetAppURL(""))
go mailer.InviteExistingUser(userModel.Email, inviter.Fullname(), inviter.Email, ctx.GetAppURL(""))
h.Runtime.Log.Info(fmt.Sprintf("%s is giving access to an existing user %s", inviter.Email, userModel.Email))
}
@ -847,12 +847,12 @@ func (h *Handler) BulkImport(w http.ResponseWriter, r *http.Request) {
url := fmt.Sprintf("%s/%s", ctx.GetAppURL("auth/sso"), url.QueryEscape(string(encrypted)))
mailer := mail.Mailer{Runtime: h.Runtime, Store: h.Store, Context: ctx}
go mailer.InviteNewUser(userModel.Email, inviter.Fullname(), url, userModel.Email, requestedPassword)
go mailer.InviteNewUser(userModel.Email, inviter.Fullname(), inviter.Email, url, userModel.Email, requestedPassword)
h.Runtime.Log.Info(fmt.Sprintf("%s invited by %s on %s", userModel.Email, inviter.Email, ctx.AppURL))
} else {
mailer := mail.Mailer{Runtime: h.Runtime, Store: h.Store, Context: ctx}
go mailer.InviteExistingUser(userModel.Email, inviter.Fullname(), ctx.GetAppURL(""))
go mailer.InviteExistingUser(userModel.Email, inviter.Fullname(), inviter.Email, ctx.GetAppURL(""))
h.Runtime.Log.Info(fmt.Sprintf("%s is giving access to an existing user %s", inviter.Email, userModel.Email))
}

View file

@ -41,8 +41,8 @@ func main() {
// product details
rt.Product = env.ProdInfo{}
rt.Product.Major = "1"
rt.Product.Minor = "63"
rt.Product.Patch = "1"
rt.Product.Minor = "64"
rt.Product.Patch = "0"
rt.Product.Version = fmt.Sprintf("%s.%s.%s", rt.Product.Major, rt.Product.Minor, rt.Product.Patch)
rt.Product.Edition = "Community"
rt.Product.Title = fmt.Sprintf("%s Edition", rt.Product.Edition)

File diff suppressed because one or more lines are too long

View file

@ -12,6 +12,7 @@
import $ from 'jquery';
import { inject as service } from '@ember/service';
import { debounce } from '@ember/runloop';
import { A } from '@ember/array';
import Component from '@ember/component';
import AuthProvider from '../../mixins/auth';
import ModalMixin from '../../mixins/modal';
@ -56,9 +57,11 @@ export default Component.extend(AuthProvider, ModalMixin, {
this.get('userSvc')
.matchUsers(searchText)
.then(users => {
let filteredUsers = A([]);
users.forEach(user => {
let m = members.findBy('userId', user.get('id'));
user.set('isMember', is.not.undefined(m));
if (is.undefined(m)) filteredUsers.pushObject(user);
// user.set('isMember', is.not.undefined(m));
});
if (this.get('showMembers') && members.length === 0) {
@ -66,7 +69,7 @@ export default Component.extend(AuthProvider, ModalMixin, {
this.set('showUsers', true);
}
this.set('users', users);
this.set('users', filteredUsers);
});
});
},
@ -179,6 +182,7 @@ export default Component.extend(AuthProvider, ModalMixin, {
this.set('users', null);
this.set('showMembers', true);
this.set('showUsers', false);
this.set('searchText', '');
this.loadGroupInfo();
},
@ -197,7 +201,7 @@ export default Component.extend(AuthProvider, ModalMixin, {
this.set('showUsers', false);
}
},
250
450
);
},

View file

@ -13,7 +13,7 @@ import $ from 'jquery';
import { computed } from '@ember/object';
import { notEmpty } from '@ember/object/computed';
import { inject as service } from '@ember/service';
import { A } from "@ember/array"
import { A } from '@ember/array';
import { schedule } from '@ember/runloop';
import ModalMixin from '../../mixins/modal';
import Component from '@ember/component';
@ -51,7 +51,7 @@ export default Component.extend(ModalMixin, {
let p = this.get('document.protection');
let constants = this.get('constants');
let msg = '';
switch (p) {
case constants.ProtectionType.None:
msg = constants.ProtectionType.NoneLabel;
@ -87,7 +87,7 @@ export default Component.extend(ModalMixin, {
}
return msg;
}),
}),
didReceiveAttrs() {
this._super(...arguments);

View file

@ -142,11 +142,19 @@ export default Component.extend(TooltipMixin, {
sequence = beforePage.get('sequence') / 2;
}
model.page.set('sequence', sequence);
model.page.set('level', level);
}
} else {
let pages = this.get('pages');
if (pages.get('length') > 0 ) {
let p = pages.get('lastObject');
sequence = p.get('page.sequence') * 2;
level = p.get('page.level');
}
}
model.page.set('sequence', sequence);
model.page.set('level', level);
if (this.get('document.protection') === constants.ProtectionType.Review) {
model.page.set('status', model.page.get('relativeId') === '' ? constants.ChangeState.PendingNew : constants.ChangeState.Pending);
}
@ -226,7 +234,9 @@ export default Component.extend(TooltipMixin, {
},
onShowSectionWizard(page) {
if (is.undefined(page)) page = { id: '0' };
if (is.undefined(page)) {
page = { id: '0' };
}
let beforePage = this.get('beforePage');
if (is.not.null(beforePage) && $("#new-section-wizard").is(':visible') && beforePage.get('id') === page.id) {

View file

@ -10,7 +10,7 @@
// https://documize.com
import $ from 'jquery';
import { A } from "@ember/array"
import { A } from '@ember/array';
import { inject as service } from '@ember/service';
import TooltipMixin from '../../mixins/tooltip';
import ModalMixin from '../../mixins/modal';
@ -57,7 +57,7 @@ export default Component.extend(ModalMixin, TooltipMixin, {
let users = _.where(s, {categoryId: cat.get('id'), type: 'users'});
let userCount = 0;
users.forEach((u) => { userCount = userCount + u.count });
cat.set('documents', docCount);
cat.set('users', userCount);
});
@ -183,7 +183,7 @@ export default Component.extend(ModalMixin, TooltipMixin, {
c.set('selected', true);
}
});
this.set('categoryPermissions', categoryPermissions.sortBy('who', 'name'));
});
});

View file

@ -10,7 +10,7 @@
// https://documize.com
import { computed } from '@ember/object';
import { A } from "@ember/array"
import { A } from '@ember/array';
import TooltipMixin from '../../mixins/tooltip';
import Component from '@ember/component';

View file

@ -10,7 +10,7 @@
// https://documize.com
import { inject as service } from '@ember/service';
import { A } from "@ember/array"
import { A } from '@ember/array';
import { debounce } from '@ember/runloop';
import ModalMixin from '../../mixins/modal';
import stringUtil from '../../utils/string';

Binary file not shown.

View file

@ -0,0 +1,149 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
import { schedule } from '@ember/runloop';
import { inject as service } from '@ember/service';
import { computed, observer } from '@ember/object';
import Component from '@ember/component';
export default Component.extend({
appMeta: service(),
sectionSvc: service('section'),
isDirty: false,
waiting: false,
diagram: '',
diagramXML: '',
title: '',
readyToSave: false,
previewButtonCaption: 'Preview',
flowCallback: null,
editorId: computed('page', function () {
let page = this.get('page');
return `flowchart-editor-${page.id}`;
}),
goSave: observer('readyToSave', function() {
if (this.get('readyToSave')) {
let page = this.get('page');
let meta = this.get('meta');
meta.set('rawBody', this.get('diagram'));
page.set('title', this.get('title'));
this.set('waiting', false);
this.teardownEditor();
this.get('onAction')(page, meta);
}
}),
didReceiveAttrs() {
this._super(...arguments);
this.set('waiting', false);
this.set('diagram', this.get('meta.rawBody'));
this.set('title', this.get('page.title'));
},
didInsertElement() {
this._super(...arguments);
schedule('afterRender', () => {
this.setupEditor();
});
},
willDestroyElement() {
this._super(...arguments);
this.teardownEditor();
},
setupEditor() {
let self = this;
let flowCallback = function(evt) {
if (self.get('isDestroyed') || self.get('isDestroying')) {
console.log('draw.io component destroyed'); // eslint-disable-line no-console
return;
}
// if (evt.origin !== 'https://www.draw.io') {
// console.log('draw.io incorrect message source: ' + evt.source); // eslint-disable-line no-console
// return;
// }
if (evt.data.length === 0) {
console.log('draw.io no event data'); // eslint-disable-line no-console
return;
}
let editorFrame = document.getElementById(self.get('editorId'));
var msg = JSON.parse(evt.data);
switch (msg.event) {
case 'init':
editorFrame.contentWindow.postMessage(
JSON.stringify({action: 'load', autosave: 1, xmlpng: self.get('diagram')}), '*');
break;
case 'save':
self.set('diagramXML', msg.xml);
// Trigger onAction() callback using sneaky trick.
Mousetrap.trigger('ctrl+s');
break;
case 'autosave':
self.set('diagramXML', msg.xml);
break;
case 'load':
break;
case 'exit':
self.sendAction('onCancel');
break;
case 'export':
self.set('diagram', msg.data);
self.set('readyToSave', true);
break;
}
};
window.addEventListener('message', flowCallback);
this.set('flowCallback', flowCallback);
},
teardownEditor() {
window.removeEventListener('message', this.get('flowCallback'));
},
actions: {
isDirty() {
return this.get('isDirty') || (this.get('diagram') !== this.get('meta.rawBody'));
},
onCancel() {
this.teardownEditor();
this.get('onCancel')();
},
onAction(title) {
this.set('waiting', true);
this.set('title', title);
let editorFrame = document.getElementById(this.get('editorId'));
editorFrame.contentWindow.postMessage(
JSON.stringify({action: 'export', format: 'xmlpng',
xml: this.get('diagramXML'), spin: 'Updating'}), '*');
}
}
});
// https://github.com/jgraph/drawio-html5/blob/master/localstorage.html
// https://desk.draw.io/support/solutions/articles/16000042546-what-url-parameters-are-supported-
// https://desk.draw.io/support/solutions/articles/16000042544-how-does-embed-mode-work-
// https://jgraph.github.io/mxgraph/docs/js-api/files/editor/mxEditor-js.html

View file

@ -0,0 +1,15 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
import Component from '@ember/component';
export default Component.extend({
});

View file

@ -14,7 +14,6 @@ import { inject as service } from '@ember/service';
import Component from '@ember/component';
import NotifierMixin from '../../../mixins/notifier';
import SectionMixin from '../../../mixins/section';
import netUtil from '../../../utils/net';
export default Component.extend(SectionMixin, NotifierMixin, {
sectionService: service('section'),

View file

@ -54,6 +54,7 @@ export default Component.extend(ModalMixin, {
type: 'GET',
dataType: 'html',
success: function (response) {
if (self.get('isDestroyed') || self.get('isDestroying')) return;
self.set('newsContent', response);
}
});

View file

@ -21,12 +21,6 @@
{{content-for 'body'}}
<script src="/assets/vendor.js"></script>
<script src="/assets/documize.js"></script>
<script src="/codemirror/lib/codemirror.js" integrity=""></script>
<script src="/codemirror/mode/meta.js" integrity=""></script>
<script src="/codemirror/addon/mode/loadmode.js" integrity=""></script>
<script src="/codemirror/addon/mode/overlay.js" integrity=""></script>
<script src="/codemirror/addon/runmode/runmode.js" integrity=""></script>
<script src="/codemirror/addon/runmode/colorize.js" integrity=""></script>
{{content-for 'body-footer'}}
</body>
</html>

View file

@ -26,7 +26,6 @@ export function initialize(application) {
application.register('constants:main', cs);
Dropzone.autoDiscover = false;
CodeMirror.modeURL = "/codemirror/mode/%N/%N.js";
}
export default {

View file

@ -9,14 +9,14 @@
//
// https://documize.com
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
// import { belongsTo } from 'ember-data/relationships';
import Model from 'ember-data/model';
export default Model.extend({
pageId: attr('string'),
documentId: attr('string'),
orgId: attr('string'),
userId: attr('string'),
rawBody: attr(),
config: attr(),
externalSource: attr('boolean', { defaultValue: false }),

View file

@ -10,7 +10,6 @@
// https://documize.com
import { hash } from 'rsvp';
import { inject as service } from '@ember/service';
import Route from '@ember/routing/route';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';

View file

@ -10,7 +10,6 @@
// https://documize.com
import { A } from '@ember/array';
import ArrayProxy from '@ember/array/proxy';
import Service, { inject as service } from '@ember/service';

View file

@ -22,16 +22,8 @@
@import "vendor.scss";
@import "print.scss";
@import "section/trello.scss";
@import "section/gemini.scss";
@import "section/github.scss";
@import "section/markdown.scss";
@import "section/table.scss";
@import "section/code.scss";
@import "section/plantuml.scss";
@import "section/papertrail.scss";
@import "section/wysiwyg.scss";
@import "news.scss";
@import "section/all.scss";
@import "enterprise/all.scss";
// Bootstrap override that removes gutter space on smaller screens

View file

@ -0,0 +1,10 @@
@import "trello.scss";
@import "gemini.scss";
@import "github.scss";
@import "markdown.scss";
@import "table.scss";
@import "code.scss";
@import "plantuml.scss";
@import "papertrail.scss";
@import "wysiwyg.scss";
@import "flowchart.scss";

View file

@ -0,0 +1,715 @@
.geEditor {
font-family:Helvetica Neue,Helvetica,Arial Unicode MS,Arial !important;
font-size:10pt;
border:none;
margin:0px;
color:#000000 !important;
}
.geEditor input[type=text]::-ms-clear {
display: none;
}
.geMenubarContainer .geItem, .geToolbar .geButton, .geToolbar .geLabel, .geSidebarContainer .geTitle {
cursor:pointer !important;
}
.geBackgroundPage {
-webkit-box-shadow:0px 0px 3px 0px #d9d9d9;
-moz-box-shadow:0px 0px 3px 0px #d9d9d9;
box-shadow:0px 0px 3px 0px #d9d9d9;
}
.geSidebarContainer a, .geMenubarContainer a, .geToolbar a {
color:#000000 !important;
text-decoration:none;
}
.geMenubarContainer, .geToolbarContainer, .geDiagramContainer, .geSidebarContainer, .geFooterContainer, .geHsplit, .geVsplit {
overflow:hidden;
position:absolute;
cursor:default;
}
.geFormatContainer {
background-color:whiteSmoke;
overflow-x: hidden !important;
overflow-y: auto !important;
font-size:12px;
}
.geDiagramContainer {
background-color:#ffffff;
outline:none;
}
.geMenubar, .geToolbar {
white-space:nowrap;
display:block;
width:100%;
}
.geMenubarContainer .geItem, .geToolbar .geButton, .geToolbar .geLabel, .geSidebar, .geSidebarContainer .geTitle, .geSidebar .geItem, .mxPopupMenuItem {
-webkit-transition: all 0.1s ease-in-out;
-moz-transition: all 0.1s ease-in-out;
-o-transition: all 0.1s ease-in-out;
-ms-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out;
}
.geHint {
background-color: #ffffff;
border: 1px solid gray;
padding: 4px 16px 4px 16px;
border-radius:3px;
-webkit-box-shadow: 1px 1px 2px 0px #ddd;
-moz-box-shadow: 1px 1px 2px 0px #ddd;
box-shadow: 1px 1px 2px 0px #ddd;
opacity:0.8;
filter:alpha(opacity=80);
}
.geStatusAlert {
white-space:nowrap;
margin-top:-5px;
font-size:12px;
padding:4px 6px 4px 6px;
background-color:#f2dede;
border:1px solid #ebccd1;
color:#a94442 !important;
border-radius:3px;
}
.geStatusAlert:hover {
background-color:#f1d8d8;
border-color:#d6b2b8;
}
.geStatusMessage {
white-space:nowrap;
margin-top:-5px;
padding:4px 6px 4px 6px;
font-size:12px;
background-image: -webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);
background-image: -o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);
background-image: -webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));
background-image: linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
background-repeat: repeat-x;
border:1px solid #b2dba1;
border-radius:3px;
color:#3c763d !important;
}
.geStatusMessage:hover {
background:#c8e5bc;
border-color:#b2dba1;
}
.geAlert {
position:absolute;
white-space:nowrap;
padding:14px;
background-color:#f2dede;
border:1px solid #ebccd1;
color:#a94442;
border-radius:3px;
-webkit-box-shadow: 2px 2px 3px 0px #ddd;
-moz-box-shadow: 2px 2px 3px 0px #ddd;
box-shadow: 2px 2px 3px 0px #ddd;
}
.geBtn {
background-color: #f5f5f5;
border-radius: 2px;
border: 1px solid #d8d8d8;
color: #333;
cursor: default;
font-size: 11px;
font-weight: bold;
height: 29px;
line-height: 27px;
margin: 0 0 0 8px;
min-width: 72px;
outline: 0;
padding: 0 8px;
cursor: pointer;
}
.geBtn:hover, .geBtn:focus {
-webkit-box-shadow: 0px 1px 1px rgba(0,0,0,0.1);
-moz-box-shadow: 0px 1px 1px rgba(0,0,0,0.1);
box-shadow: 0px 1px 1px rgba(0,0,0,0.1);
border: 1px solid #c6c6c6;
background-color: #f8f8f8;
background-image: linear-gradient(#f8f8f8 0px,#f1f1f1 100%);
color: #111;
}
.geBtn:disabled {
opacity: .5;
}
.geBtnUp {
background-image: url(data:image/gif;base64,R0lGODlhCgAGAJECAGZmZtXV1f///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0QzM3ODJERjg4NUQxMUU0OTFEQ0E2MzRGQzcwNUY3NCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0QzM3ODJFMDg4NUQxMUU0OTFEQ0E2MzRGQzcwNUY3NCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjRDMzc4MkREODg1RDExRTQ5MURDQTYzNEZDNzA1Rjc0IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjRDMzc4MkRFODg1RDExRTQ5MURDQTYzNEZDNzA1Rjc0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAQAAAgAsAAAAAAoABgAAAg6UjwiQBhGYglCKhXFLBQA7);
_background-image: url(up.gif);
background-position: center center;
background-repeat: no-repeat;
}
.geBtnUp:active {
background-color: #4d90fe;
background-image: linear-gradient(#4d90fe 0px,#357ae8 100%);
}
.geBtnDown {
background-image: url(data:image/gif;base64,R0lGODlhCgAGAJECANXV1WZmZv///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0QzM3ODJEQjg4NUQxMUU0OTFEQ0E2MzRGQzcwNUY3NCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0QzM3ODJEQzg4NUQxMUU0OTFEQ0E2MzRGQzcwNUY3NCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjRDMzc4MkQ5ODg1RDExRTQ5MURDQTYzNEZDNzA1Rjc0IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjRDMzc4MkRBODg1RDExRTQ5MURDQTYzNEZDNzA1Rjc0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAQAAAgAsAAAAAAoABgAAAg6UjxLLewEiCAnOZBzeBQA7);
_background-image: url(down.gif);
background-position: center center;
background-repeat: no-repeat;
}
.geBtnDown:active {
background-color: #4d90fe;
background-image: linear-gradient(#4d90fe 0px,#357ae8 100%);
}
.geColorBtn {
background-color: #f5f5f5;
background-image: linear-gradient(#f5f5f5 0px,#e1e1e1 100%);
border-radius: 4px;
border: 1px solid rgba(0,0,0,0.5);
color: #333;
cursor: default;
margin: 0px;
outline: 0;
padding: 0px;
cursor: pointer;
}
.geColorBtn:hover {
-webkit-box-shadow: 0px 1px 1px rgba(0,0,0,0.1);
-moz-box-shadow: 0px 1px 1px rgba(0,0,0,0.1);
box-shadow: 0px 1px 1px rgba(0,0,0,0.1);
border: 1px solid rgba(0,0,0,0.7);
}
.geColorBtn:active {
background-color: #4d90fe;
background-image: linear-gradient(#4d90fe 0px,#357ae8 100%);
border: 1px solid #2f5bb7;
color: #fff;
}
.geColorBtn:disabled {
opacity: .5;
}
.gePrimaryBtn {
background-color: #4d90fe;
background-image: linear-gradient(#4d90fe 0px,#4787ed 100%);
border: 1px solid #3079ed;
color: #fff;
}
.gePrimaryBtn:hover, .gePrimaryBtn:focus {
background-color: #357ae8;
background-image: linear-gradient(#4d90fe 0px,#357ae8 100%);
border: 1px solid #2f5bb7;
color: #fff;
}
.gePrimaryBtn:disabled {
opacity: .5;
}
.geAlertLink {
color:#843534;
font-weight:700;
text-decoration:none;
}
.geMenubarContainer {
background-color:#ffffff;
}
.geMenubar {
padding:0px 2px 0px 2px;
vertical-align:middle;
}
.geMenubarContainer .geItem, .geToolbar .geItem {
padding:6px 8px 6px 8px;
cursor:default;
}
.geMenubarContainer .geItem:hover {
background:#eeeeee;
}
.mxDisabled:hover {
background:inherit !important;
}
.geMenubar a.geStatus {
color:#b3b3b3;
padding-left:6px;
display:inline-block;
cursor:default !important;
}
.geMenubar a.geStatus:hover {
background:transparent;
}
.geMenubarMenu {
border:1px solid #d5d5d5 !important;
}
.geToolbarContainer {
background:whiteSmoke;
border-bottom:1px solid #e0e0e0;
}
.geSidebarContainer .geToolbarContainer {
background:transparent;
border-bottom:none;
}
.geSidebarContainer button {
text-overflow:ellipsis;
overflow:hidden;
}
.geToolbar {
padding:1px 0px 0px 6px;
border-top:1px solid #e0e0e0;
-webkit-box-shadow: inset 0 1px 0 0 #fff;
-moz-box-shadow: inset 0 1px 0 0 #fff;
box-shadow: inset 0 1px 0 0 #fff;
}
.geToolbarContainer .geSeparator {
float:left;
width:1px;
height:34px;
background:#e5e5e5;
margin-left:6px;
margin-right:6px;
margin-top:-2px;
}
.geToolbarContainer .geButton {
float:left;
width:20px;
height:20px;
padding:0px 2px 4px 2px;
margin:2px;
border:1px solid transparent;
cursor:pointer;
opacity:0.6;
filter:alpha(opacity=60);
}
.geToolbarContainer .geButton:hover {
border:1px solid gray;
border-radius:2px;
opacity:1;
filter:none !important;
}
.geToolbarContainer .geButton:active {
border:1px solid black;
}
div.mxWindow .geButton {
margin: -1px 2px 2px 2px;
padding: 1px 2px 2px 1px;
}
.geToolbarContainer .geLabel {
float:left;
margin:2px;
cursor:pointer;
padding:3px 5px 3px 5px;
border:1px solid transparent;
opacity:0.6;
filter:alpha(opacity=60);
}
.geToolbarContainer .geLabel:hover {
border:1px solid gray;
border-radius:2px;
opacity:0.9;
filter:alpha(opacity=90) !important;
}
.geToolbarContainer .geLabel:active {
border:1px solid black;
opacity:1;
filter:none !important;
}
.geToolbarContainer .mxDisabled:hover {
border:1px solid transparent !important;
opacity:0.2 !important;
filter:alpha(opacity=20) !important;
}
.geToolbarMenu {
border:3px solid #e0e0e0 !important;
-webkit-box-shadow:none !important;
-moz-box-shadow:none !important;
box-shadow:none !important;
filter:none !important;
}
.geDiagramBackdrop {
background-color: #ebebeb;
border: 1px solid #e5e5e5;
}
.geSidebarContainer {
background:#ffffff;
overflow:hidden;
position:absolute;
border-top:1px solid #e5e5e5;
overflow:auto;
}
.geSidebar {
background:whiteSmoke;
border-bottom:1px solid #e5e5e5;
padding:5px;
_padding:1px;
padding-bottom:12px;
overflow:hidden;
}
.geSidebarContainer .geTitle {
display:block;
font-size:9pt;
border-bottom:1px solid #e5e5e5;
font-weight:normal;
padding:6px 0px 6px 14px;
margin:0px;
cursor:default;
background:#eeeeee;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
line-height:1.4em;
}
.geSidebarContainer .geTitle:hover {
background:#e5e5e5;
}
.geTitle img {
opacity:0.5;
_filter:alpha(opacity=50);
}
.geTitle img:hover {
opacity:1;
_filter:alpha(opacity=100);
}
.geTitle .geButton {
border:1px solid transparent;
padding:3px;
border-radius:2px;
}
.geTitle .geButton:hover {
border:1px solid gray;
}
.geSidebar .geItem {
display:inline-block;
background-repeat:no-repeat;
background-position:50% 50%;
border:1px solid transparent;
border-radius:2px;
cursor: move;
}
.geSidebar .geItem:hover {
border:1px solid gray !important;
}
.geItem {
vertical-align: top;
display: inline-block;
}
.geSidebarTooltip {
position:absolute;
background:white;
overflow:hidden;
border:1px solid gray;
border-radius:8px;
-webkit-box-shadow:0px 0px 2px 2px #d5d5d5;
-moz-box-shadow:0px 0px 2px 2px #d5d5d5;
box-shadow:0px 0px 2px 2px #d5d5d5;
_filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=2, OffY=2, Color='#d5d5d5', Positive='true');
}
.geFooterContainer {
background:#e5e5e5;
border-top:1px solid #c0c0c0;
}
.geFooterContainer a {
display:inline-block;
box-sizing:border-box;
width:100%;
white-space:nowrap;
font-size:14px;
color:#235695;
font-weight:bold;
text-decoration:none;
}
.geFooterContainer table {
border-collapse:collapse;
margin:0 auto;
}
.geFooterContainer td {
border-left:1px solid #c0c0c0;
border-right:1px solid #c0c0c0;
}
.geFooterContainer td:hover {
background-color: #b3b3b3;
}
.geHsplit {
cursor:col-resize;
background-color:#e5e5e5;
background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHBAMAAADdS/HjAAAAGFBMVEUzMzP///9tbW1QUFCKiopBQUF8fHxfX1/IXlmXAAAAHUlEQVQImWMQEGAQFWUQFmYQF2cQEmIQE2MQEQEACy4BF67hpEwAAAAASUVORK5CYII=);
_background-image:url('thumb_vertical.png');
background-repeat:no-repeat;
background-position:center center;
}
.geVsplit {
font-size:1pt;
cursor:row-resize;
background-color:#e5e5e5;
background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAEBAMAAACw6DhOAAAAGFBMVEUzMzP///9tbW1QUFCKiopBQUF8fHxfX1/IXlmXAAAAFElEQVQImWNgNVdzYBAUFBRggLMAEzYBy29kEPgAAAAASUVORK5CYII=);
_background-image:url('thumb_horz.png');
background-repeat:no-repeat;
background-position:center center;
}
.geHsplit:hover, .geVsplit:hover {
background-color:#d5d5d5;
}
.geDialog {
position:absolute;
background:white;
overflow:hidden;
padding:30px;
border:1px solid #acacac;
-webkit-box-shadow:0px 0px 2px 2px #d5d5d5;
-moz-box-shadow:0px 0px 2px 2px #d5d5d5;
box-shadow:0px 0px 2px 2px #d5d5d5;
_filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=2, OffY=2, Color='#d5d5d5', Positive='true');
z-index: 2;
}
.geDialogClose {
position:absolute;
width:9px;
height:9px;
opacity:0.5;
cursor:pointer;
_filter:alpha(opacity=50);
}
.geDialogClose:hover {
opacity:1;
}
.geDialogTitle {
box-sizing:border-box;
white-space:nowrap;
background:rgb(229, 229, 229);
border-bottom:1px solid rgb(192, 192, 192);
font-size:15px;
font-weight:bold;
text-align:center;
color:rgb(35, 86, 149);
}
.geDialogFooter {
background:whiteSmoke;
white-space:nowrap;
text-align:right;
box-sizing:border-box;
border-top:1px solid #e5e5e5;
color:darkGray;
}
.geSprite {
background:url('data:image/png;base64,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') no-repeat;
_background:url('sprites.png') no-repeat top left;
width:21px;
height:21px;
}
.geBaseButton {
padding:10px;
border-radius:6px;
border:1px solid #c0c0c0;
cursor:pointer;
background-color:#ececec;
background-image:linear-gradient(#ececec 0%, #fcfcfc 100%);
}
.geBaseButton:hover {
background:#ececec;
}
.geBigButton {
color:#ffffff;
border: none;
padding:10px;
font-size:14pt;
white-space: nowrap;
border-radius:6px;
text-shadow: rgb(41, 89, 137) 0px 1px 0px;
background-color:#428bca;
background-image:linear-gradient(rgb(70, 135, 206) 0px, rgb(48, 104, 162) 100%);
-webkit-box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.2) 0px 1px 1px 0px;
-moz-box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.2) 0px 1px 1px 0px;
box-shadow: rgba(255, 255, 255, 0.0980392) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.2) 0px 1px 1px 0px;
}
.geBigButton:hover {
background-color:#2d6ca2;
background-image: linear-gradient(rgb(90, 148, 211) 0px, rgb(54, 115, 181) 100%);
}
.geBigButton:active {
background-color: rgb(54, 115, 181);
background-image: none;
}
@media print {
div.geNoPrint { display: none !important; }
}
.geSprite-actualsize { background-position: 0 0; }
.geSprite-bold { background-position: 0 -46px; }
.geSprite-bottom { background-position: 0 -92px; }
.geSprite-center { background-position: 0 -138px; }
.geSprite-delete { background-position: 0 -184px; }
.geSprite-fillcolor { background-position: 0 -229px; }
.geSprite-fit { background-position: 0 -277px; }
.geSprite-fontcolor { background-position: 0 -322px; }
.geSprite-gradientcolor { background-position: 0 -368px; }
.geSprite-image { background-position: 0 -414px; }
.geSprite-italic { background-position: 0 -460px; }
.geSprite-left { background-position: 0 -505px; }
.geSprite-middle { background-position: 0 -552px; }
.geSprite-print { background-position: 0 -598px; }
.geSprite-redo { background-position: 0 -644px; }
.geSprite-right { background-position: 0 -689px; }
.geSprite-shadow { background-position: 0 -735px; }
.geSprite-strokecolor { background-position: 0 -782px; }
.geSprite-top { background-position: 0 -828px; }
.geSprite-underline { background-position: 0 -874px; }
.geSprite-undo { background-position: 0 -920px; }
.geSprite-zoomin { background-position: 0 -966px; }
.geSprite-zoomout { background-position: 0 -1012px; }
.geSprite-arrow { background-position: 0 -1059px; }
.geSprite-linkedge { background-position: 0 -1105px; }
.geSprite-straight { background-position: 0 -1150px; }
.geSprite-entity { background-position: 0 -1196px; }
.geSprite-orthogonal { background-position: 0 -1242px; }
.geSprite-curved { background-position: 0 -1288px; }
.geSprite-noarrow { background-position: 0 -1334px; }
.geSprite-endclassic { background-position: 0 -1380px; }
.geSprite-endopen { background-position: 0 -1426px; }
.geSprite-endblock { background-position: 0 -1472px; }
.geSprite-endoval { background-position: 0 -1518px; }
.geSprite-enddiamond { background-position: 0 -1564px; }
.geSprite-endthindiamond { background-position: 0 -1610px; }
.geSprite-endclassictrans { background-position: 0 -1656px; }
.geSprite-endblocktrans { background-position: 0 -1702px; }
.geSprite-endovaltrans { background-position: 0 -1748px; }
.geSprite-enddiamondtrans { background-position: 0 -1794px; }
.geSprite-endthindiamondtrans { background-position: 0 -1840px; }
.geSprite-startclassic { background-position: 0 -1886px; }
.geSprite-startopen { background-position: 0 -1932px; }
.geSprite-startblock { background-position: 0 -1978px; }
.geSprite-startoval { background-position: 0 -2024px; }
.geSprite-startdiamond { background-position: 0 -2070px; }
.geSprite-startthindiamond { background-position: 0 -2116px; }
.geSprite-startclassictrans { background-position: 0 -2162px; }
.geSprite-startblocktrans { background-position: 0 -2208px; }
.geSprite-startovaltrans { background-position: 0 -2254px; }
.geSprite-startdiamondtrans { background-position: 0 -2300px; }
.geSprite-startthindiamondtrans { background-position: 0 -2346px; }
.geSprite-globe { background-position: 0 -2392px; }
.geSprite-orderedlist { background-position: 0 -2438px; }
.geSprite-unorderedlist { background-position: 0 -2484px; }
.geSprite-horizontalrule { background-position: 0 -2530px; }
.geSprite-link { background-position: 0 -2576px; }
.geSprite-indent { background-position: 0 -2622px; }
.geSprite-outdent { background-position: 0 -2668px; }
.geSprite-code { background-position: 0 -2714px; }
.geSprite-fontbackground { background-position: 0 -2760px; }
.geSprite-removeformat { background-position: 0 -2806px; }
.geSprite-superscript { background-position: 0 -2852px; }
.geSprite-subscript { background-position: 0 -2898px; }
.geSprite-table { background-position: 0 -2944px; }
.geSprite-deletecolumn { background-position: 0 -2990px; }
.geSprite-deleterow { background-position: 0 -3036px; }
.geSprite-insertcolumnafter { background-position: 0 -3082px; }
.geSprite-insertcolumnbefore { background-position: 0 -3128px; }
.geSprite-insertrowafter { background-position: 0 -3174px; }
.geSprite-insertrowbefore { background-position: 0 -3220px; }
.geSprite-grid { background-position: 0 -3272px; }
.geSprite-guides { background-position: 0 -3324px; }
.geSprite-dots { background-position: 0 -3370px; }
.geSprite-alignleft { background-position: 0 -3416px; }
.geSprite-alignright { background-position: 0 -3462px; }
.geSprite-aligncenter { background-position: 0 -3508px; }
.geSprite-aligntop { background-position: 0 -3554px; }
.geSprite-alignbottom { background-position: 0 -3600px; }
.geSprite-alignmiddle { background-position: 0 -3646px; }
.geSprite-justifyfull { background-position: 0 -3692px; }
.geSprite-formatpanel { background-position: 0 -3738px; }
.geSprite-connection { background-position: 0 -3784px; }
.geSprite-vertical { background-position: 0 -3830px; }
.geSprite-simplearrow { background-position: 0 -3876px; }
.geSprite-plus { background-position: 0 -3922px; }
.geSprite-rounded { background-position: 0 -3968px; }
.geSprite-toback { background-position: 0 -4014px; }
.geSprite-tofront { background-position: 0 -4060px; }
.geSprite-duplicate { background-position: 0 -4106px; }
.geSprite-insert { background-position: 0 -4152px; }
.geSprite-endblockthin { background-position: 0 -4201px; }
.geSprite-endblockthintrans { background-position: 0 -4247px; }
.geSprite-enderone { background-position: 0 -4293px; }
.geSprite-enderonetoone { background-position: 0 -4339px; }
.geSprite-enderonetomany { background-position: 0 -4385px; }
.geSprite-endermany { background-position: 0 -4431px; }
.geSprite-enderoneopt { background-position: 0 -4477px; }
.geSprite-endermanyopt { background-position: 0 -4523px; }
.geSprite-endclassicthin { background-position: 0 -4938px; }
.geSprite-endclassicthintrans { background-position: 0 -4984px; }
.geSprite-enddash { background-position: 0 -5029px; }
.geSprite-endcircleplus { background-position: 0 -5075px; }
.geSprite-endcircle { background-position: 0 -5121px; }
.geSprite-endasync { background-position: 0 -5167px; }
.geSprite-endasynctrans { background-position: 0 -5213px; }
.geSprite-startblockthin { background-position: 0 -4569px; }
.geSprite-startblockthintrans { background-position: 0 -4615px; }
.geSprite-starterone { background-position: 0 -4661px; }
.geSprite-starteronetoone { background-position: 0 -4707px; }
.geSprite-starteronetomany { background-position: 0 -4753px; }
.geSprite-startermany { background-position: 0 -4799px; }
.geSprite-starteroneopt { background-position: 0 -4845px; }
.geSprite-startermanyopt { background-position: 0 -4891px; }
.geSprite-startclassicthin { background-position: 0 -5259px; }
.geSprite-startclassicthintrans { background-position: 0 -5305px; }
.geSprite-startdash { background-position: 0 -5351px; }
.geSprite-startcircleplus { background-position: 0 -5397px; }
.geSprite-startcircle { background-position: 0 -5443px; }
.geSprite-startasync { background-position: 0 -5489px; }
.geSprite-startasynctrans { background-position: 0 -5535px; }
.geSprite-startcross { background-position: 0 -5581px; }
.geSprite-startopenthin { background-position: 0 -5627px; }
.geSprite-startopenasync { background-position: 0 -5673px; }
.geSprite-endcross { background-position: 0 -5719px; }
.geSprite-endopenthin { background-position: 0 -5765px; }
.geSprite-endopenasync { background-position: 0 -5811px; }
.geSprite-verticalelbow { background-position: 0 -5857px; }
.geSprite-horizontalelbow { background-position: 0 -5903px; }
.geSprite-horizontalisometric { background-position: 0 -5949px; }
.geSprite-verticalisometric { background-position: 0 -5995px; }
html div.mxRubberband {
border-color:#0000DD;
background:#99ccff;
}
td.mxPopupMenuIcon div {
width:16px;
height:16px;
}
html div.mxPopupMenu {
-webkit-box-shadow:2px 2px 3px #d5d5d5;
-moz-box-shadow:2px 2px 3px #d5d5d5;
box-shadow:2px 2px 3px #d5d5d5;
_filter:progid:DXImageTransform.Microsoft.DropShadow(OffX=2, OffY=2, Color='#d0d0d0', Positive='true');
background:white;
position:absolute;
border:3px solid #e7e7e7;
padding:3px;
}
html table.mxPopupMenu {
border-collapse:collapse;
margin:0px;
}
html td.mxPopupMenuItem {
padding:7px 30px 7px 30px;
font-family:Helvetica Neue,Helvetica,Arial Unicode MS,Arial;
font-size:10pt;
}
html td.mxPopupMenuIcon {
background-color:white;
padding:0px;
}
td.mxPopupMenuIcon .geIcon {
padding:2px;
padding-bottom:4px;
margin:2px;
border:1px solid transparent;
opacity:0.5;
_width:26px;
_height:26px;
}
td.mxPopupMenuIcon .geIcon:hover {
border:1px solid gray;
border-radius:2px;
opacity:1;
}
html tr.mxPopupMenuItemHover {
background-color: #eeeeee;
color: black;
}
table.mxPopupMenu hr {
color:#cccccc;
background-color:#cccccc;
border:none;
height:1px;
}
table.mxPopupMenu tr {
font-size:4pt;
}
html td.mxWindowTitle {
font-family:Helvetica Neue,Helvetica,Arial Unicode MS,Arial;
text-align:left;
font-size:12px;
color:rgb(112, 112, 112);
padding:4px;
}

View file

@ -107,6 +107,15 @@
font-size: 1.2rem;
}
}
> hr {
height: 1px;
color: $color-border;
background: $color-border;
font-size: 0;
border: 0;
margin: 5px 10px;
}
}
// used for user admin

View file

@ -22,7 +22,7 @@
{{input id="newUserLastname" type="text" class="form-control" placeholder="Lastname" value=newUser.lastname}}
</div>
<div class="col">
<label for="newUserEmail">Lastname</label>
<label for="newUserEmail">Email</label>
{{input id="newUserEmail" type="email" class="form-control" placeholder="Email" value=newUser.email}}
</div>
</div>
@ -41,7 +41,7 @@
<div class="text-right">
<button type="submit" class="btn btn-success" {{action 'onAddUsers'}}>Add users</button>
</div>
</form>
</form>
</div>
<div class="modal-footer mt-4">
<button type="button" class="btn btn-outline-secondary" data-dismiss="modal">Close</button>

View file

@ -121,17 +121,16 @@
</div>
<div class="view-customize">
<div class="group-users-members my-5">
{{#if showMembers}}
{{#each members as |member|}}
<div class="row item">
<div class="col-10 fullname">{{member.fullname}}</div>
<div class="col-2 text-right">
<button class="btn btn-danger" {{action 'onLeaveGroup' member.userId}}>Remove</button>
</div>
{{#each members as |member|}}
<div class="row item">
<div class="col-10 fullname">{{member.fullname}}</div>
<div class="col-2 text-right">
<button class="btn btn-danger" {{action 'onLeaveGroup' member.userId}}>Remove</button>
</div>
{{/each}}
{{/if}}
</div>
{{/each}}
{{#if showUsers}}
<hr />
{{#each users as |user|}}
<div class="row item">
<div class="col-10 fullname">{{user.firstname}} {{user.lastname}}</div>

View file

@ -0,0 +1,14 @@
{{#section/base-editor document=document folder=folder page=page busy=waiting tip="Concise name that describes the diagram" isDirty=(action 'isDirty') onCancel=(action 'onCancel') onAction=(action 'onAction')}}
<div class="section-flowchart-diagram">
<div class="container">
<div class="row">
<div class="col-12">
<iframe id={{editorId}}
src="https://www.draw.io/?embed=1&ui=Kennedy&spin=0&proto=json&splash=0"
style="frameborder:0; border: 0; width: 100%; height: 1000px;">
</iframe>
</div>
</div>
</div>
</div>
{{/section/base-editor}}

View file

@ -0,0 +1,3 @@
<div class="text-center">
<img src="{{page.body}}" />
</div>

View file

@ -18,20 +18,20 @@ module.exports = function (defaults) {
fingerprint: {
enabled: true,
extensions: ['js', 'css'],
exclude: ['tinymce/**', 'codemirror/**']
exclude: ['tinymce/**', 'codemirror/**', 'flowchart/**']
},
minifyJS: {
enabled: !isDevelopment,
options: {
exclude: ['tinymce/**', 'codemirror/**']
exclude: ['tinymce/**', 'codemirror/**', 'flowchart/**']
}
},
minifyCSS: {
enabled: !isDevelopment,
options: {
exclude: ['tinymce/**', 'codemirror/**']
exclude: ['tinymce/**', 'codemirror/**', 'flowchart/**']
}
},
@ -60,6 +60,7 @@ module.exports = function (defaults) {
app.import('vendor/velocity.js');
app.import('vendor/velocity.ui.js');
app.import('vendor/waypoints.js');
app.import('vendor/codemirror.js'); // boot-up files
app.import('vendor/bootstrap.bundle.min.js');

View file

@ -1,6 +1,6 @@
{
"name": "documize",
"version": "1.63.1",
"version": "1.64.0",
"description": "The Document IDE",
"private": true,
"repository": "",

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

10140
gui/vendor/codemirror.js vendored Normal file

File diff suppressed because it is too large Load diff