|
|
- define([
- "sugar-web/activity/activity",
- "activity/palettes/format-text-palette",
- "activity/palettes/list-palette",
- "activity/palettes/paragraph-palette",
- "activity/palettes/font-palette",
- "sugar-web/graphics/colorpalette",
- "sugar-web/datastore",
- "sugar-web/graphics/journalchooser",
- "sugar-web/env",
- "sugar-web/graphics/presencepalette",
- "activity/palettes/export-palette",
- "webL10n",
- ], function (activity,formatpalette,listpalette,parapalette,fontPalette,colorpalette , datastore , journalchooser,env,presencepalette,exportpalette,webL10n) {
-
- // Manipulate the DOM only when it is ready.
- requirejs(['domReady!','humane'], function (doc,humane) {
-
- // Initialize the activity.
- activity.setup();
-
- var options = {
- modules: {
- toolbar: '#main-toolbar',
- history: {
- maxStack: 500,
- },
- imageResize: {},
- cursors: {
- transformOnTextChange: true,
- },
- clipboard: true
- },
- };
- Quill.register('modules/cursors', QuillCursors);
- var container = document.getElementById('editor');
- var editor = new Quill(container,options);
- editor.focus();
- editor.format('size','24px');
- const cursors = editor.getModule('cursors');
- const Delta = Quill.import('delta');
- // Journal Handling (Load)
- env.getEnvironment(function(err, environment) {
-
- currentenv = environment;
- // Language Settings
- var defaultLanguage = (typeof chrome != 'undefined' && chrome.app && chrome.app.runtime) ? chrome.i18n.getUILanguage() : navigator.language;
- var language = environment.user ? environment.user.language : defaultLanguage;
- webL10n.language.code = language;
- window.addEventListener("localized", function() {
- document.getElementById("network-button").title = webL10n.get("Network");
- document.getElementById("color-button-1").title = webL10n.get("ForegroundColor");
- document.getElementById("color-button-2").title = webL10n.get("BackgroundColor");
- document.getElementById("format-text").title = webL10n.get("Formattext");
- document.getElementById("paragraph").title = webL10n.get("Paragraph");
- document.getElementById("list").title = webL10n.get("List");
- document.getElementById("resize-inc").title = webL10n.get("Increasefontsize");
- document.getElementById("font-button").title = webL10n.get("ChooseFont");
- document.getElementById("resize-dec").title = webL10n.get("Decreasefontsize");
- document.getElementById("insert-picture").title = webL10n.get("Image");
- document.getElementById("edit-undo").title = webL10n.get("Undo");
- document.getElementById("edit-redo").title = webL10n.get("Redo");
- document.getElementById("edit-copy").title = webL10n.get("Copy");
- document.getElementById("edit-paste").title = webL10n.get("Paste");
- document.getElementById("export").title = webL10n.get("Export");
- document.getElementById(5).title = webL10n.get("Bold");
- document.getElementById(6).title = webL10n.get("Italic");
- document.getElementById(7).title = webL10n.get("Underline");
- document.getElementById(8).title = webL10n.get("Strike");
- document.getElementById(9).title = webL10n.get("OrderedList");
- document.getElementById(10).title = webL10n.get("UnorderedList");
- document.getElementById(11).title = webL10n.get("JustifyLeft");
- document.getElementById(12).title = webL10n.get("JustifyRight");
- document.getElementById(13).title = webL10n.get("JustifyCenter");
- document.getElementById(19).title = webL10n.get("ExportToTxt");
- document.getElementById(20).title = webL10n.get("ExportToPdf");
- document.getElementById(21).title = webL10n.get("ExportToDoc");
- document.getElementById(22).title = webL10n.get("ExportToOdt");
- });
-
- if (!environment.objectId && !environment.sharedId) {
- // New instance
- // Intentionally added setTimeout to allow locale.ini file to be loaded
- setTimeout(function(){
- editor.setContents([
- {insert: webL10n.get('Welcome',{username: environment.user.name}) + '\n' , attributes: { size: "40px" , color : environment.user.colorvalue.stroke , bold: true }},
- ]);
- var length = editor.getLength();
- editor.clipboard.dangerouslyPasteHTML(length,webL10n.get('Write'));
- length = editor.getLength();
- editor.clipboard.dangerouslyPasteHTML(length,webL10n.get('Writefeatures'));
- length = editor.getLength();
- editor.clipboard.dangerouslyPasteHTML(length,webL10n.get('Enjoy'));
- length = editor.getLength();
- editor.clipboard.dangerouslyPasteHTML(length,"<br></br>");
- length = editor.getLength();
- editor.updateContents(
- new Delta()
- .retain(editor.getSelection().index+1)
- .insert({
- image: window.initialImageDataUrl
- })
- );
- },200);
- } else {
- // Existing instance
- activity.getDatastoreObject().loadAsText(function(error, metadata, data) {
- if (error==null && data!=null) {
- var delta = JSON.parse(data);
- console.log(delta);
- editor.setContents(delta);
- }
- });
- }
- // Shared instances
- if (environment.sharedId) {
- console.log("Shared instance");
-
- // Hide GUI of undo and redo for non host users
- document.getElementById("edit-undo").style.display = "none";
- document.getElementById("edit-redo").style.display = "none";
- document.getElementById("shared-button").click();
- presence = activity.getPresenceObject(function(error, network) {
- network.onDataReceived(onNetworkDataReceived);
- network.onSharedActivityUserChanged(onNetworkUserChanged);
- });
- }
-
- });
-
- // Save in Journal on Stop
- document.getElementById("stop-button").addEventListener('click', function (event) {
-
- // Journal handling
- var data = editor.getContents();
- var jsondata = JSON.stringify(data);
- activity.getDatastoreObject().setDataAsText(jsondata);
- activity.getDatastoreObject().save(function (error) {
- if (error === null) {
- console.log("write done.");
- } else {
- console.log("write failed.");
- }
- });
-
- });
-
- var changeMadebyUser=false;
-
- var copiedContent = null ;
-
- document.getElementById("edit-copy").addEventListener('click',function(){
- var range = editor.getSelection();
- copiedContent = editor.getContents(range.index,range.length);
- document.execCommand('copy');
- });
- document.getElementById("edit-paste").addEventListener('click',function(){
- if(document.execCommand('paste')){
- // Your browser supports execCommand('paste')
- } else if(copiedContent!=null) {
- // Your browser does not support execCommand('paste')
- changeMadebyUser=true;
- editor.updateContents(
- new Delta()
- .retain(editor.getSelection().index)
- .concat(copiedContent)
- );
- }
- });
-
- // Sync Keyboard Shortcut of copy with custom events
- editor.keyboard.addBinding({ key: 'C', shortKey: true }, function(){document.getElementById("edit-copy").click()});
-
- document.getElementById("edit-undo").addEventListener('click',function(){
- editor.history.undo();
- });
- document.getElementById("edit-redo").addEventListener('click',function(){
- editor.history.redo();
- });
-
- // Initiating format-text-palette ( for cut/copy/undo/redo )
- var formatButton = document.getElementById("format-text");
- var formatoptions = [
- {"id": 5, "title": "bold", "cmd":"bold"},
- {"id": 6, "title": "italic", "cmd":"italic"},
- {"id": 7, "title": "underline", "cmd":"underline"},
- {"id": 8, "title": "strike", "cmd":"strikeThrough"}
- ];
- formatpalette = new formatpalette.Formatpalette(formatButton, undefined);
- formatpalette.setCategories(formatoptions);
- formatpalette.addEventListener('format', function () {
- formatpalette.popDown();
- editor.focus();
- });
- document.getElementById(5).addEventListener('click',function(){
- document.getElementById("bold").click();
- });
- document.getElementById(6).addEventListener('click',function(){
- document.getElementById("italic").click();
- });
- document.getElementById(7).addEventListener('click',function(){
- document.getElementById("underline").click();
- });
- document.getElementById(8).addEventListener('click',function(){
- document.getElementById("strike").click();
- });
-
-
- // Initiating lists palette
- var listButton = document.getElementById("list");
- var listoptions = [
- {"id": 10, "title": "unordered list", "cmd":"insertUnorderedList"},
- {"id": 9, "title": "ordered list", "cmd":"insertorderedList"},
- ];
- listpalette = new listpalette.Listpalette(listButton, undefined);
- listpalette.setCategories(listoptions);
- listpalette.addEventListener('list', function () {
- listpalette.popDown();
- });
- document.getElementById("9").addEventListener("click",function(){
- document.getElementById("list-ordered").click();
- });
- document.getElementById("10").addEventListener("click",function(){
- document.getElementById("list-unordered").click();
- });
-
- // Initiating paragraph palette ( Alignment settings )
-
- var paraButton = document.getElementById("paragraph");
- var paraoptions = [
- {"id": 11, "title":"justify Left" , "cmd":"justifyLeft"},
- {"id": 13, "title":"justify Center" , "cmd":"justifyCenter"},
- {"id": 12, "title":"justify Right" , "cmd":"justifyRight"},
- ];
- parapalette = new parapalette.Parapalette(paraButton, undefined);
- parapalette.setCategories(paraoptions);
- parapalette.addEventListener('para', function () {
- parapalette.popDown();
- editor.focus();
- });
-
- document.getElementById(11).addEventListener("click",function(){
- changeMadebyUser=true;
- editor.format('align','justify');
- })
- document.getElementById(12).addEventListener("click",function(){
- changeMadebyUser=true;
- editor.format('align','right');
- });
- document.getElementById(13).addEventListener("click",function(){
- changeMadebyUser=true;
- editor.format('align','center');
- });
-
- // Initialise font palette
- var fontButton = document.getElementById("font-button");
- fontPalette = new fontPalette.Fontpalette(fontButton);
- fontPalette.addEventListener('fontChange', function(e) {
- var newfont = e.detail.family;
- if(newfont=="Arial") newfont="arial";
- if(newfont=="Comic Sans MS") newfont="comic";
- changeMadebyUser=true;
- editor.format('font',newfont);
- });
-
- // Initiating colour palette for foreground and background
- var forecolorButton = document.getElementById("color-button-1");
- var changeForeColorPalette = new colorpalette.ColorPalette(forecolorButton);
- changeForeColorPalette.setColor('rgb(0, 0, 0)');
- changeForeColorPalette.addEventListener('colorChange', function(e) {
- changeMadebyUser=true;
- editor.format('color',e.detail.color);
- });
-
- var backcolorButton = document.getElementById("color-button-2");
- var changeBackColorPalette = new colorpalette.ColorPalette(backcolorButton);
- changeBackColorPalette.setColor('rgb(255,255,255)');
- changeBackColorPalette.addEventListener('colorChange', function(e) {
- changeMadebyUser=true;
- editor.format('background-color',e.detail.color);
- });
-
-
- // Initiating font-size-palette
- // For increase
- var sizes = ['16px', '24px', '32px' ,'40px', '48px' , '56px', '64px' , '72px' , '80px' , '100px'];
- var sizeIncButton = document.getElementById("resize-inc");
- sizeIncButton.addEventListener("click",function(){
- var currentSize = editor.getFormat();
- if(currentSize.size==null){
- var index = sizes.indexOf('24px');
- editor.format('size',sizes[index+1]);
- }
- else {
- var index = sizes.indexOf(currentSize.size);
- index++;
- if(index<sizes.length){
- editor.format('size',sizes[index]);
- }
- }
- });
- // For decrease
- var sizeDecButton = document.getElementById("resize-dec");
- sizeDecButton.addEventListener("click",function(){
- var currentSize = editor.getFormat();
- if(currentSize.size==null){
- var index = sizes.indexOf('24px');
- if(index>0)
- editor.format('size',sizes[index-1]);
- }
- else {
- var index = sizes.indexOf(currentSize.size);
- index--;
- if(index>=0){
- editor.format('size',sizes[index]);
- }
- }
- });
-
- // Insert Image handling
- document.getElementById("insert-picture").addEventListener("click",function(e){
- journalchooser.show(function (entry) {
- if (!entry) {
- return;
- }
- var dataentry = new datastore.DatastoreObject(entry.objectId);
- dataentry.loadAsText(function (err, metadata, data) {
- editor.focus();
- changeMadebyUser=true;
- editor.updateContents(
- new Delta()
- .retain(editor.getSelection().index)
- .insert({
- image: data
- })
- );
- });
- }, { mimetype: 'image/png' }, { mimetype: 'image/jpeg' });
- });
-
-
- // Initiating export-palette
-
- var exportButton = document.getElementById("export");
- var options = [
- {"id": 19, "title": "export to txt" , "cmd":"save-as-txt"},
- {"id": 20, "title": "export to pdf", "cmd":"save-as-pdf"},
- {"id": 21, "title": "export to doc", "cmd":"doc"},
- {"id": 22, "title": "export to odt", "cmd":"odt"},
- ];
- exportpalette = new exportpalette.Exportpalette(exportButton, undefined);
- exportpalette.setCategories(options);
- exportpalette.addEventListener('export', function () {
- exportpalette.popDown();
- });
-
- // save as txt
- document.getElementById("19").addEventListener('click',function(){
- var title = document.getElementById("title").value;
- var mimetype = 'text/plain';
- var inputData = document.getElementById("editor").textContent;
- inputData=JSON.stringify(inputData);
- var metadata = {
- mimetype: mimetype,
- title: title+".txt",
- activity: "",
- timestamp: new Date().getTime(),
- creation_time: new Date().getTime(),
- file_size: 0
- };
- datastore.create(metadata, function() {
- console.log("export done.");
- humane.log(webL10n.get("Txt"));
- }, inputData);
- });
-
- // save as PDF
- document.getElementById("20").addEventListener('click',function(){
-
- var title = document.getElementById("title").value;
- editor.scrollingContainer.style.overflowY = 'visible';
- console.log(editor.scrollingContainer.style.height);
- var h = editor.scrollingContainer.offsetHeight;
- editor.scrollingContainer.style.height="auto";
- editor.scrollingContainer.scrollTop=0;
- html2canvas(editor.scrollingContainer).then(function(canvas){
- editor.scrollingContainer.style.height=h;
- editor.scrollingContainer.style.overflowY = 'auto';
- var imgData = canvas.toDataURL('image/png');
- var imgData = canvas.toDataURL('image/png');
- var imgWidth = 210;
- var pageHeight = 295;
- var imgHeight = canvas.height * imgWidth / canvas.width;
- var heightLeft = imgHeight;
-
- var doc = new jsPDF('p', 'mm' , '',true);
- var position = 0;
-
- doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight , '' , 'FAST');
- heightLeft -= pageHeight;
- while (heightLeft >= 0) {
- position = heightLeft - imgHeight;
- doc.addPage();
- doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight , '' , 'FAST');
- heightLeft -= pageHeight;
- }
- var inputData = doc.output('dataurlstring');
- var mimetype = 'application/pdf';
- var metadata = {
- mimetype: mimetype,
- title: title+".pdf",
- activity: "",
- timestamp: new Date().getTime(),
- creation_time: new Date().getTime(),
- file_size: 0
- };
- datastore.create(metadata, function() {
- console.log("export done.");
- humane.log(webL10n.get("Pdf"));
- }, inputData);
- });
- });
-
- // Save as doc
- document.getElementById(21).addEventListener("click",function(){
- var title = document.getElementById("title").value;
- var content =document.getElementById("editor").innerHTML;
- var header = "<html xmlns:o='urn:schemas-microsoft-com:office:office' "+
- "xmlns:w='urn:schemas-microsoft-com:office:word' "+
- "xmlns='http://www.w3.org/TR/REC-html40'>"+
- "<head><meta charset='utf-8'></head><body>";
- var footer = "</body></html>";
- var sourceHTML = header+content+footer;
- var inputData = 'data:application/vnd.ms-word;charset=utf-8;base64,' + btoa(unescape(encodeURIComponent( sourceHTML )));
- var mimetype = 'application/msword';
- var metadata = {
- mimetype: mimetype,
- title: title+".doc",
- activity: "",
- timestamp: new Date().getTime(),
- creation_time: new Date().getTime(),
- file_size: 0
- };
- datastore.create(metadata, function() {
- console.log("export done.");
- humane.log(webL10n.get("Doc"));
- }, inputData);
- });
-
- //Save as odt
- document.getElementById("22").addEventListener("click",function(){
- // resetXML();
- var data = document.getElementsByClassName("ql-editor");
- var xml = traverse(data[0]);
- var mimetype = 'application/vnd.oasis.opendocument.text';
- var title = document.getElementById("title").value;
- var inputData = 'data:application/vnd.oasis.opendocument.text;charset=utf-8;base64,' + btoa(unescape(encodeURIComponent( xml )));
- var metadata = {
- mimetype: mimetype,
- title: title+".odt",
- activity: "",
- timestamp: new Date().getTime(),
- creation_time: new Date().getTime(),
- file_size: 0
- };
- datastore.create(metadata, function() {
- console.log("export done.");
- humane.log(webL10n.get("Odt"));
- resetXML();
- }, inputData);
-
- });
-
- // On content change handlers , sends data to other users on content being changed
-
- editor.on('text-change', function(delta, oldDelta, source) {
- // Executes on text or formatting changes
- if ((source == 'user' || changeMadebyUser==true) && presence!=null) {
- var range = editor.getSelection();
- presence.sendMessage(presence.getSharedInfo().id, {
- user: presence.getUserInfo(),
- content: {
- action: 'typing',
- data: delta,
- range: range
- }
- });
- changeMadebyUser=false;
- }
-
- });
-
- editor.on('selection-change', function(range, oldRange, source) {
- // Executes when user selection changes
- if (range) {
- if (presence!=null) {
- presence.sendMessage(presence.getSharedInfo().id, {
- user: presence.getUserInfo(),
- content: {
- action: 'selection',
- range: range
- }
- });
- }
- }
- });
-
- // Presence Palette
- // Link presence palette
- var presence = null;
- var isHost = false;
- var myid;
- var nomoreinit = false;
- var mycursor;
- var palette = new presencepalette.PresencePalette(document.getElementById("network-button"), undefined);
- palette.addEventListener('shared', function() {
- palette.popDown();
- console.log("Want to share");
- presence = activity.getPresenceObject(function(error, network) {
- if (error) {
- console.log("Sharing error");
- return;
- }
- network.createSharedActivity('org.sugarlabs.Write', function(groupId) {
- console.log("Activity shared");
- isHost = true;
- });
- network.onDataReceived(onNetworkDataReceived);
- network.onSharedActivityUserChanged(onNetworkUserChanged);
- });
- });
-
- var onNetworkDataReceived = function(msg) {
- if (presence.getUserInfo().networkId === msg.user.networkId) {
- return;
- }
- if(msg.content.action=='init' && nomoreinit==false){
- editor.updateContents(msg.content.data);
- var getallcursors = msg.content.allcursors;
- for(var i = 0 ; i < getallcursors.length ; i++){
- console.log(getallcursors[i]);
- if(getallcursors[i].id!=myid){
- cursors.createCursor(getallcursors[i].id, getallcursors[i].name,getallcursors[i].color) ;
- cursors.moveCursor(getallcursors[i].id, getallcursors[i].range) ;
- }
- }
- cursors.update();
- // Create Fake event to init Cursors
- document.getElementById("list-ordered").click();
- document.getElementById("list-ordered").click();
- nomoreinit=true;
- }
- if(msg.content.action=='typing'){
- editor.updateContents(msg.content.data);
- }
- if(msg.content.action=='selection'){
- setTimeout(function() {cursors.moveCursor(msg.user.networkId,msg.content.range)} , 5);
- }
-
- };
-
- var onNetworkUserChanged = function(msg) {
- if (isHost) {
- var data = editor.getContents();
- var range = editor.getSelection();
- mycursor.range = range;
- var allcursors = cursors.cursors();
- presence.sendMessage(presence.getSharedInfo().id, {
- user: presence.getUserInfo(),
- content: {
- action: 'init',
- data: data,
- allcursors: allcursors
- }
- });
- mycursor.range = null;
- }
- if(!myid){
- myid = msg.user.networkId;
- }
- // handle user enter/exit Notifications
- var userName = msg.user.name.replace('<', '<').replace('>', '>');
- var html = "<img style='height:30px;' src='" + generateXOLogoWithColor(msg.user.colorvalue) + "'>";
- presence.listSharedActivities(function(activities){
- for (var i = 0; i < activities.length; i++) {
- if (activities[i].id === presence.getSharedInfo().id) {
- getConnectedPeople(activities[i].users);
- }
- }
- });
- for (var key in connectedPeople) {
- console.log(connectedPeople[key].name,key,connectedPeople[key].networkId);
- }
- if(msg.move==1){
- humane.log(html + webL10n.get("PlayerJoin",{user: userName}));
- var c = cursors.createCursor(msg.user.networkId, userName, msg.user.colorvalue.stroke);
- if(myid==msg.user.networkId) {mycursor=c;}
- }
- if (msg.move === -1) {
- cursors.removeCursor(msg.user.networkId);
- humane.log(html + webL10n.get("PlayerLeave",{user: userName}));
- if(msg.user.networkId == connectedPeople[0].networkId){
- if(connectedPeople[1].networkId == myid){
- document.getElementById(3).style.display = "inline";
- document.getElementById(4).style.display = "inline";
- isHost=true;
- }
- }
- }
- };
-
-
- var xoLogo = '<?xml version="1.0" ?><!DOCTYPE svg PUBLIC \'-//W3C//DTD SVG 1.1//EN\' \'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\' [<!ENTITY stroke_color "#010101"><!ENTITY fill_color "#FFFFFF">]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="stock-xo_1_"><path d="M33.233,35.1l10.102,10.1c0.752,0.75,1.217,1.783,1.217,2.932 c0,2.287-1.855,4.143-4.146,4.143c-1.145,0-2.178-0.463-2.932-1.211L27.372,40.961l-10.1,10.1c-0.75,0.75-1.787,1.211-2.934,1.211 c-2.284,0-4.143-1.854-4.143-4.141c0-1.146,0.465-2.184,1.212-2.934l10.104-10.102L11.409,24.995 c-0.747-0.748-1.212-1.785-1.212-2.93c0-2.289,1.854-4.146,4.146-4.146c1.143,0,2.18,0.465,2.93,1.214l10.099,10.102l10.102-10.103 c0.754-0.749,1.787-1.214,2.934-1.214c2.289,0,4.146,1.856,4.146,4.145c0,1.146-0.467,2.18-1.217,2.932L33.233,35.1z" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5"/><circle cx="27.371" cy="10.849" fill="&fill_color;" r="8.122" stroke="&stroke_color;" stroke-width="3.5"/></g></svg>';
- function generateXOLogoWithColor(color) {
- var coloredLogo = xoLogo;
- coloredLogo = coloredLogo.replace("#010101", color.stroke)
- coloredLogo = coloredLogo.replace("#FFFFFF", color.fill)
-
- return "data:image/svg+xml;base64," + btoa(coloredLogo);
- }
-
- var connectedPeople = {};
- // Maintain a list of connected users
- function displayConnectedPeople(){
- var presenceUsersDiv = document.getElementById("presence-users");
- var html = "<hr><ul style='list-style: none; padding:0;'>";
- for (var key in connectedPeople) {
- html += "<li><img style='height:30px;' src='" + generateXOLogoWithColor(connectedPeople[key].colorvalue) + "'>" + connectedPeople[key].name + "</li>"
- }
- html += "</ul>"
- presenceUsersDiv.innerHTML = html
- }
-
- function getConnectedPeople(users){
- var presenceUsersDiv = document.getElementById("presence-users");
- if (!users || !presenceUsersDiv) {
- return;
- }
- connectedPeople = {};
- presence.listSharedActivityUsers(presence.getSharedInfo().id , function(usersConnected){
- connectedPeople = {};
- for (var i = 0; i < usersConnected.length; i++) {
- var userConnected = usersConnected[i];
- connectedPeople[i] = userConnected;
- }
- displayConnectedPeople();
- });
- }
-
- });
-
- });
|