mirror of
https://github.com/documize/community.git
synced 2025-07-24 07:39:43 +02:00
commit
fb193ce9f9
47 changed files with 11956 additions and 778 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
2
build.sh
2
build.sh
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
54
domain/section/flowchart/flowchart.go
Normal file
54
domain/section/flowchart/flowchart.go
Normal 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
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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)))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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
|
@ -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
|
||||
);
|
||||
},
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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'));
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
BIN
gui/app/components/section/flowchart/embed.pdf
Normal file
BIN
gui/app/components/section/flowchart/embed.pdf
Normal file
Binary file not shown.
149
gui/app/components/section/flowchart/type-editor.js
Normal file
149
gui/app/components/section/flowchart/type-editor.js
Normal 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
|
15
gui/app/components/section/flowchart/type-renderer.js
Normal file
15
gui/app/components/section/flowchart/type-renderer.js
Normal 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({
|
||||
});
|
|
@ -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'),
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 }),
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
10
gui/app/styles/section/all.scss
Normal file
10
gui/app/styles/section/all.scss
Normal 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";
|
715
gui/app/styles/section/flowchart.scss
Normal file
715
gui/app/styles/section/flowchart.scss
Normal 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;
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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}}
|
|
@ -0,0 +1,3 @@
|
|||
<div class="text-center">
|
||||
<img src="{{page.body}}" />
|
||||
</div>
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "documize",
|
||||
"version": "1.63.1",
|
||||
"version": "1.64.0",
|
||||
"description": "The Document IDE",
|
||||
"private": true,
|
||||
"repository": "",
|
||||
|
|
BIN
gui/public/sections/flowchart.png
Normal file
BIN
gui/public/sections/flowchart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 359 B |
BIN
gui/public/sections/flowchart@2x.png
Normal file
BIN
gui/public/sections/flowchart@2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 630 B |
10140
gui/vendor/codemirror.js
vendored
Normal file
10140
gui/vendor/codemirror.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue