W.I.P. collab editor:

- Implement create new empty document
This commit is contained in:
Hadi Nategh 2016-08-23 17:57:03 +02:00
parent 6a4c89d61a
commit d622af8c44
4 changed files with 96 additions and 51 deletions

View File

@ -23,6 +23,11 @@ class filemanager_collab extends filemanager_collab_bo {
'poll' => true 'poll' => true
); );
/**
* session identification for an empty new file
*/
const NEW_FILE_ES_ID = 'new';
/** /**
* Constructor * Constructor
* *
@ -35,12 +40,24 @@ class filemanager_collab extends filemanager_collab_bo {
/** /**
* Join session, initialises edit session for opened file by user * Join session, initialises edit session for opened file by user
* *
* @param type $es_id session id * @param type $es_id session id, 'new' session id means it's an empty
* template opened as new file, and should not be store in DB.
*
* @return array returns an array consists of session data * @return array returns an array consists of session data
*/ */
function join_session ($es_id) function join_session ($es_id)
{ {
$response = $this->initSession($es_id); if ($es_id === self::NEW_FILE_ES_ID)
{
$response = array(
'member_id' => '0',
'es_id' => self::NEW_FILE_ES_ID
);
}
else
{
$response = $this->initSession($es_id);
}
$response += array ( $response += array (
'id' => $GLOBALS['egw_info']['user']['account_id'], 'id' => $GLOBALS['egw_info']['user']['account_id'],
'full_name' => $GLOBALS['egw_info']['user']['account_fullname'], 'full_name' => $GLOBALS['egw_info']['user']['account_fullname'],
@ -87,11 +104,33 @@ class filemanager_collab extends filemanager_collab_bo {
$response = $this->join_session($params['args']['es_id'],$params['args']['user_id']); $response = $this->join_session($params['args']['es_id'],$params['args']['user_id']);
break; break;
case 'leave_session': case 'leave_session':
if ($params['args']['es_id'] === self::NEW_FILE_ES_ID)
{
$response = array ('success' => true,'memberid' => '0','session_id'=>self::NEW_FILE_ES_ID);
break;
}
$response = $this->leave_session($params['args']['es_id'],$params['args']['member_id']); $response = $this->leave_session($params['args']['es_id'],$params['args']['member_id']);
break; break;
case 'sync_ops': case 'sync_ops':
try try
{ {
// handle new file operation
if ($params['args']['es_id'] === self::NEW_FILE_ES_ID)
{
if (!$params['args']['client_ops'] && !$params['args']['seq_head'])
{
$response = $this->prepare_newFile();
}
else
{
$response = array(
'result' => 'added',
'seq_head' => 1
);
}
break;
}
$memberid = $params['args']['member_id']? $params['args']['member_id']: ''; $memberid = $params['args']['member_id']? $params['args']['member_id']: '';
$es_id = $params['args']['es_id']; $es_id = $params['args']['es_id'];
$seq_head = (string) isset($params['args']['seq_head'])? $params['args']['seq_head']: null; $seq_head = (string) isset($params['args']['seq_head'])? $params['args']['seq_head']: null;
@ -157,6 +196,37 @@ class filemanager_collab extends filemanager_collab_bo {
exit(); exit();
} }
/**
* This function prepare an op structure for new file operation
* as new file is not saved yet in database we need to satisfy the
* client in order to be able to edit an empty document.
*
* @return array return op structure
*/
function prepare_newFile()
{
$date = new Api\DateTime();
$use_id = $GLOBALS['egw_info']['user']['account_id'];
$response = array (
'result' => 'new_ops',
'ops'=> array (
0 => array (
'optype' => 'AddMember',
'memberid' => '0',
'timestamp' => $date->getTimestamp(),
'setProperties' => array(
'fullName' => $GLOBALS['egw_info']['user']['account_fullname'],
'color' => $GLOBALS['egw_info']['user']['preferences']['filemanager']['collab_user_color'],
'imageUrl' => $GLOBALS['egw_info']['server']['webserver_url'].'/index.php?menuaction=addressbook.addressbook_ui.photo&account_id='.$use_id,
'uid' => $use_id
)
)
),
'head_seq' => '1'
);
return $response;
}
/** /**
* Function to get a new head sequence * Function to get a new head sequence
* *
@ -249,10 +319,12 @@ class filemanager_collab extends filemanager_collab_bo {
* client. * client.
* *
* @param type $file_path file path * @param type $file_path file path
* * @param boolean $_isNew true means this is an empty doc opened as new file
* in client-side and not stored yet therefore no genesis file should get generated for it.
*/ */
function ajax_getGenesisUrl ($file_path) function ajax_getGenesisUrl ($file_path, $_isNew)
{ {
$result = array(); $result = array();
$es_id = md5($file_path); $es_id = md5($file_path);
$paths = explode('/webdav.php', $file_path); $paths = explode('/webdav.php', $file_path);
@ -260,6 +332,15 @@ class filemanager_collab extends filemanager_collab_bo {
array_pop($dir_parts); array_pop($dir_parts);
$dir = join('/', $dir_parts); $dir = join('/', $dir_parts);
$response = Api\Json\Response::get(); $response = Api\Json\Response::get();
// handle new empty file
if ($_isNew)
{
$response->data(array (
'es_id' => self::NEW_FILE_ES_ID,
'genesis_url' => $GLOBALS['egw_info']['server']['webserver_url'].'/api/js/webodf/template.odt'
));
return;
}
$session = $this->SESSION_Get($es_id); $session = $this->SESSION_Get($es_id);
if ($session && $session['genesis_url'] !== '') if ($session && $session['genesis_url'] !== '')

View File

@ -1499,6 +1499,10 @@ class filemanager_ui
$content['es_id'] = md5 ($file_path); $content['es_id'] = md5 ($file_path);
$content['file_path'] = $paths[1]; $content['file_path'] = $paths[1];
} }
else
{
$content = array();
}
} }
$actions = self::getActions_edit(); $actions = self::getActions_edit();

View File

@ -1020,7 +1020,6 @@ app.classes.filemanager = AppJS.extend(
var template_url = '/api/js/webodf/template.odt'; var template_url = '/api/js/webodf/template.odt';
egw.open_link(egw.link('/index.php', { egw.open_link(egw.link('/index.php', {
menuaction: 'filemanager.filemanager_ui.editor', menuaction: 'filemanager.filemanager_ui.editor',
path: template_url
}), '', egw.link_get_registry('filemanager','view_popup')); }), '', egw.link_get_registry('filemanager','view_popup'));
}, },

View File

@ -73,46 +73,6 @@ app.classes.filemanager = app.classes.filemanager.extend({
} }
}, },
/**
* Initiate odf editor popup & load given file_path
*
*/
_init_odf_editor: function ()
{
var widgetFilePath = this.et2.getWidgetById('file_path'),
file_path = widgetFilePath.value,
isNew = file_path == '/api/js/webodf/template.odt'? true: false,
self = this;
var onEditorCreated = function (err ,editor)
{
if (err)
{
console.log('Something went wrong whilst loading editor.'+ err);
return;
}
self.editor = editor;
self.editor.openDocumentFromUrl(egw.webserverUrl+file_path);
if (isNew) {
widgetFilePath.set_value('');
}
};
var editorOptions = {
allFeaturesEnabled: true,
userData: {
fullName: egw.user('account_fullName'),
color: 'blue'
}
};
var editor = this.et2.getWidgetById('odfEditor');
if (editor)
{
Wodo.createTextEditor('filemanager-editor_odfEditor', editorOptions, onEditorCreated);
}
},
/** /**
* Initiate odf collab editor popup & load given file_path as active session * Initiate odf collab editor popup & load given file_path as active session
* editors options: * editors options:
@ -129,9 +89,9 @@ app.classes.filemanager = app.classes.filemanager.extend({
*/ */
_init_odf_collab_editor: function () _init_odf_collab_editor: function ()
{ {
var self = this; var self = this,
isNew = window.location.href.search(/&path=/) == -1?true:false;
egw.json('filemanager.filemanager_collab.ajax_getGenesisUrl',[this.editor_getFilePath()], function (_data){ egw.json('filemanager.filemanager_collab.ajax_getGenesisUrl',[this.editor_getFilePath(), isNew], function (_data){
var serverOptions = { var serverOptions = {
serverParams: { serverParams: {
url:egw.link('/index.php?', { url:egw.link('/index.php?', {
@ -188,7 +148,8 @@ app.classes.filemanager = app.classes.filemanager.extend({
editor_close: function (_egwAction, _callback) { editor_close: function (_egwAction, _callback) {
var self = this, var self = this,
action = _egwAction.id, action = _egwAction.id,
callback = _callback; callback = _callback,
file_path = this.et2.getWidgetById('file_path');
if (this.editor) if (this.editor)
{ {
@ -202,8 +163,8 @@ app.classes.filemanager = app.classes.filemanager.extend({
callback.call(this); callback.call(this);
}; };
// warn user about unsaved changes // it's an unsaved new file try to warn user about unsaved changes
if (this.editor.isDocumentModified()) if (file_path.value == '')
{ {
et2_dialog.show_dialog( et2_dialog.show_dialog(
function(_btn) function(_btn)