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
);
/**
* session identification for an empty new file
*/
const NEW_FILE_ES_ID = 'new';
/**
* Constructor
*
@ -35,12 +40,24 @@ class filemanager_collab extends filemanager_collab_bo {
/**
* 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
*/
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 (
'id' => $GLOBALS['egw_info']['user']['account_id'],
'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']);
break;
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']);
break;
case 'sync_ops':
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']: '';
$es_id = $params['args']['es_id'];
$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();
}
/**
* 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
*
@ -249,10 +319,12 @@ class filemanager_collab extends filemanager_collab_bo {
* client.
*
* @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();
$es_id = md5($file_path);
$paths = explode('/webdav.php', $file_path);
@ -260,6 +332,15 @@ class filemanager_collab extends filemanager_collab_bo {
array_pop($dir_parts);
$dir = join('/', $dir_parts);
$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);
if ($session && $session['genesis_url'] !== '')

View File

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

View File

@ -1020,7 +1020,6 @@ app.classes.filemanager = AppJS.extend(
var template_url = '/api/js/webodf/template.odt';
egw.open_link(egw.link('/index.php', {
menuaction: 'filemanager.filemanager_ui.editor',
path: template_url
}), '', 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
* editors options:
@ -129,9 +89,9 @@ app.classes.filemanager = app.classes.filemanager.extend({
*/
_init_odf_collab_editor: function ()
{
var self = this;
egw.json('filemanager.filemanager_collab.ajax_getGenesisUrl',[this.editor_getFilePath()], function (_data){
var self = this,
isNew = window.location.href.search(/&path=/) == -1?true:false;
egw.json('filemanager.filemanager_collab.ajax_getGenesisUrl',[this.editor_getFilePath(), isNew], function (_data){
var serverOptions = {
serverParams: {
url:egw.link('/index.php?', {
@ -188,7 +148,8 @@ app.classes.filemanager = app.classes.filemanager.extend({
editor_close: function (_egwAction, _callback) {
var self = this,
action = _egwAction.id,
callback = _callback;
callback = _callback,
file_path = this.et2.getWidgetById('file_path');
if (this.editor)
{
@ -202,8 +163,8 @@ app.classes.filemanager = app.classes.filemanager.extend({
callback.call(this);
};
// warn user about unsaved changes
if (this.editor.isDocumentModified())
// it's an unsaved new file try to warn user about unsaved changes
if (file_path.value == '')
{
et2_dialog.show_dialog(
function(_btn)