Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117888088
kolab_notes_ui.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
14 KB
Referenced Files
None
Subscribers
None
kolab_notes_ui.php
View Options
<?php
class
kolab_notes_ui
{
private
$rc
;
private
$plugin
;
private
$ready
=
false
;
function
__construct
(
$plugin
)
{
$this
->
plugin
=
$plugin
;
$this
->
rc
=
$plugin
->
rc
;
}
/**
* Calendar UI initialization and requests handlers
*/
public
function
init
()
{
if
(
$this
->
ready
)
// already done
return
;
// add taskbar button
$this
->
plugin
->
add_button
(
array
(
'command'
=>
'notes'
,
'class'
=>
'button-notes'
,
'classsel'
=>
'button-notes button-selected'
,
'innerclass'
=>
'button-inner'
,
'label'
=>
'kolab_notes.navtitle'
,
'type'
=>
'link'
),
'taskbar'
);
$this
->
plugin
->
include_stylesheet
(
$this
->
plugin
->
local_skin_path
()
.
'/notes.css'
);
$this
->
ready
=
true
;
}
/**
* Register handler methods for the template engine
*/
public
function
init_templates
()
{
$this
->
plugin
->
register_handler
(
'plugin.notebooks'
,
array
(
$this
,
'folders'
));
#$this->plugin->register_handler('plugin.folders_select', array($this, 'folders_select'));
$this
->
plugin
->
register_handler
(
'plugin.searchform'
,
array
(
$this
->
rc
->
output
,
'search_form'
));
$this
->
plugin
->
register_handler
(
'plugin.listing'
,
array
(
$this
,
'listing'
));
$this
->
plugin
->
register_handler
(
'plugin.editform'
,
array
(
$this
,
'editform'
));
$this
->
plugin
->
register_handler
(
'plugin.notetitle'
,
array
(
$this
,
'notetitle'
));
$this
->
plugin
->
register_handler
(
'plugin.detailview'
,
array
(
$this
,
'detailview'
));
$this
->
plugin
->
register_handler
(
'plugin.attachments_list'
,
array
(
$this
,
'attachments_list'
));
$this
->
plugin
->
register_handler
(
'plugin.object_changelog_table'
,
array
(
'libkolab'
,
'object_changelog_table'
));
$this
->
rc
->
output
->
include_script
(
'list.js'
);
$this
->
rc
->
output
->
include_script
(
'treelist.js'
);
$this
->
plugin
->
include_script
(
'notes.js'
);
$this
->
plugin
->
api
->
include_script
(
'libkolab/libkolab.js'
);
// load config options and user prefs relevant for the UI
$settings
=
array
(
'sort_col'
=>
$this
->
rc
->
config
->
get
(
'kolab_notes_sort_col'
,
'changed'
),
);
if
(
$list
=
rcube_utils
::
get_input_value
(
'_list'
,
rcube_utils
::
INPUT_GPC
))
{
$settings
[
'selected_list'
]
=
$list
;
}
if
(
$uid
=
rcube_utils
::
get_input_value
(
'_id'
,
rcube_utils
::
INPUT_GPC
))
{
$settings
[
'selected_uid'
]
=
$uid
;
}
$this
->
rc
->
html_editor
();
$this
->
rc
->
output
->
set_env
(
'kolab_notes_settings'
,
$settings
);
$this
->
rc
->
output
->
add_label
(
'save'
,
'cancel'
,
'delete'
,
'close'
,
'listoptionstitle'
);
}
public
function
folders
(
$attrib
)
{
$attrib
+=
array
(
'id'
=>
'rcmkolabnotebooks'
);
if
(
$attrib
[
'type'
]
==
'select'
)
{
$attrib
[
'is_escaped'
]
=
true
;
$select
=
new
html_select
(
$attrib
);
}
$tree
=
$attrib
[
'type'
]
!=
'select'
?
true
:
null
;
$lists
=
$this
->
plugin
->
get_lists
(
$tree
);
$jsenv
=
array
();
if
(
is_object
(
$tree
))
{
$html
=
$this
->
folder_tree_html
(
$tree
,
$lists
,
$jsenv
,
$attrib
);
}
else
{
$html
=
''
;
foreach
(
$lists
as
$prop
)
{
$id
=
$prop
[
'id'
];
if
(!
$prop
[
'virtual'
])
{
unset
(
$prop
[
'user_id'
]);
$jsenv
[
$id
]
=
$prop
;
}
if
(
$attrib
[
'type'
]
==
'select'
)
{
if
(
$prop
[
'editable'
]
||
strpos
(
$prop
[
'rights'
],
'i'
)
!==
false
)
{
$select
->
add
(
$prop
[
'name'
],
$prop
[
'id'
]);
}
}
else
{
$html
.=
html
::
tag
(
'li'
,
array
(
'id'
=>
'rcmliknb'
.
rcube_utils
::
html_identifier
(
$id
),
'class'
=>
$prop
[
'group'
]),
$this
->
folder_list_item
(
$id
,
$prop
,
$jsenv
)
);
}
}
}
$this
->
rc
->
output
->
set_env
(
'kolab_notebooks'
,
$jsenv
);
$this
->
rc
->
output
->
add_gui_object
(
'notebooks'
,
$attrib
[
'id'
]);
return
$attrib
[
'type'
]
==
'select'
?
$select
->
show
()
:
html
::
tag
(
'ul'
,
$attrib
,
$html
,
html
::
$common_attrib
);
}
/**
* Return html for a structured list <ul> for the folder tree
*/
public
function
folder_tree_html
(
$node
,
$data
,
&
$jsenv
,
$attrib
)
{
$out
=
''
;
foreach
(
$node
->
children
as
$folder
)
{
$id
=
$folder
->
id
;
$prop
=
$data
[
$id
];
$is_collapsed
=
false
;
// TODO: determine this somehow?
$content
=
$this
->
folder_list_item
(
$id
,
$prop
,
$jsenv
);
if
(!
empty
(
$folder
->
children
))
{
$content
.=
html
::
tag
(
'ul'
,
array
(
'style'
=>
(
$is_collapsed
?
"display:none;"
:
null
)),
$this
->
folder_tree_html
(
$folder
,
$data
,
$jsenv
,
$attrib
));
}
if
(
strlen
(
$content
))
{
$out
.=
html
::
tag
(
'li'
,
array
(
'id'
=>
'rcmliknb'
.
rcube_utils
::
html_identifier
(
$id
),
'class'
=>
$prop
[
'group'
]
.
(
$prop
[
'virtual'
]
?
' virtual'
:
''
),
),
$content
);
}
}
return
$out
;
}
/**
* Helper method to build a tasklist item (HTML content and js data)
*/
public
function
folder_list_item
(
$id
,
$prop
,
&
$jsenv
,
$checkbox
=
false
)
{
if
(!
$prop
[
'virtual'
])
{
unset
(
$prop
[
'user_id'
]);
$jsenv
[
$id
]
=
$prop
;
}
$classes
=
array
(
'folder'
);
if
(
$prop
[
'virtual'
])
{
$classes
[]
=
'virtual'
;
}
else
if
(!
$prop
[
'editable'
])
{
$classes
[]
=
'readonly'
;
}
if
(
$prop
[
'subscribed'
])
{
$classes
[]
=
'subscribed'
;
}
if
(
$prop
[
'class'
])
{
$classes
[]
=
$prop
[
'class'
];
}
$title
=
$prop
[
'title'
]
?:
(
$prop
[
'name'
]
!=
$prop
[
'listname'
]
||
strlen
(
$prop
[
'name'
])
>
25
?
html_entity_decode
(
$prop
[
'name'
],
ENT_COMPAT
,
RCUBE_CHARSET
)
:
''
);
$label_id
=
'nl:'
.
$id
;
$attr
=
$prop
[
'virtual'
]
?
array
(
'tabindex'
=>
'0'
)
:
array
(
'href'
=>
$this
->
rc
->
url
(
array
(
'_list'
=>
$id
)));
return
html
::
div
(
join
(
' '
,
$classes
),
html
::
a
(
$attr
+
array
(
'class'
=>
'listname'
,
'title'
=>
$title
,
'id'
=>
$label_id
),
$prop
[
'listname'
]
?:
$prop
[
'name'
])
.
(
$prop
[
'virtual'
]
?
''
:
(
$checkbox
?
html
::
tag
(
'input'
,
array
(
'type'
=>
'checkbox'
,
'name'
=>
'_list[]'
,
'value'
=>
$id
,
'checked'
=>
$prop
[
'active'
],
'aria-labelledby'
=>
$label_id
))
:
''
)
.
html
::
span
(
'handle'
,
''
)
.
html
::
span
(
'actions'
,
(!
$prop
[
'default'
]
?
html
::
a
(
array
(
'href'
=>
'#'
,
'class'
=>
'remove'
,
'title'
=>
$this
->
plugin
->
gettext
(
'removelist'
)),
' '
)
:
''
)
.
(
isset
(
$prop
[
'subscribed'
])
?
html
::
a
(
array
(
'href'
=>
'#'
,
'class'
=>
'subscribed'
,
'title'
=>
$this
->
plugin
->
gettext
(
'foldersubscribe'
),
'role'
=>
'checkbox'
,
'aria-checked'
=>
$prop
[
'subscribed'
]
?
'true'
:
'false'
),
' '
)
:
''
)
)
)
);
return
''
;
}
public
function
listing
(
$attrib
)
{
$attrib
+=
array
(
'id'
=>
'rcmkolabnoteslist'
);
$this
->
rc
->
output
->
add_gui_object
(
'noteslist'
,
$attrib
[
'id'
]);
return
html
::
tag
(
'table'
,
$attrib
,
'<tbody></tbody>'
,
html
::
$common_attrib
);
}
public
function
editform
(
$attrib
)
{
$attrib
+=
array
(
'action'
=>
'#'
,
'id'
=>
'rcmkolabnoteseditform'
);
$textarea
=
new
html_textarea
(
array
(
'name'
=>
'content'
,
'id'
=>
'notecontent'
,
'cols'
=>
60
,
'rows'
=>
20
,
'tabindex'
=>
0
,
'class'
=>
'mce_editor form-control'
,
));
$this
->
rc
->
output
->
add_gui_object
(
'noteseditform'
,
$attrib
[
'id'
]);
return
html
::
tag
(
'form'
,
$attrib
,
$textarea
->
show
(),
array_merge
(
html
::
$common_attrib
,
array
(
'action'
)));
}
public
function
detailview
(
$attrib
)
{
$attrib
+=
array
(
'id'
=>
'rcmkolabnotesdetailview'
);
$this
->
rc
->
output
->
add_gui_object
(
'notesdetailview'
,
$attrib
[
'id'
]);
return
html
::
div
(
$attrib
,
''
);
}
public
function
notetitle
(
$attrib
)
{
$attrib
+=
array
(
'id'
=>
'rcmkolabnotestitle'
);
$this
->
rc
->
output
->
add_gui_object
(
'noteviewtitle'
,
$attrib
[
'id'
]);
$summary
=
new
html_inputfield
(
array
(
'name'
=>
'summary'
,
'class'
=>
'notetitle inline-edit form-control'
,
'size'
=>
60
,
'id'
=>
'notetitleinput'
,
'tabindex'
=>
0
));
$html
=
html
::
div
(
'form-group row'
,
html
::
label
(
array
(
'class'
=>
'col-sm-2 col-form-label'
,
'for'
=>
'notetitleinput'
),
$this
->
plugin
->
gettext
(
'kolab_notes.title'
))
.
html
::
span
(
'col-sm-10'
,
$summary
->
show
())
)
.
html
::
div
(
'form-group row'
,
html
::
label
(
array
(
'class'
=>
'col-sm-2 col-form-label'
),
$this
->
plugin
->
gettext
(
'kolab_notes.tags'
))
.
html
::
div
(
array
(
'class'
=>
'tagline tagedit col-sm-10'
),
' '
)
)
.
html
::
div
(
array
(
'class'
=>
'dates text-only'
,
'style'
=>
'display:none'
),
html
::
div
(
'form-group row'
,
html
::
label
(
array
(
'class'
=>
'col-sm-2 col-form-label'
),
$this
->
plugin
->
gettext
(
'created'
))
.
html
::
span
(
'col-sm-10'
,
html
::
span
(
'notecreated form-control-plaintext'
,
''
))
)
.
html
::
div
(
'form-group row'
,
html
::
label
(
array
(
'class'
=>
'col-sm-2 col-form-label'
),
$this
->
plugin
->
gettext
(
'changed'
))
.
html
::
span
(
'col-sm-10'
,
html
::
span
(
'notechanged form-control-plaintext'
,
''
))
)
);
return
html
::
div
(
$attrib
,
$html
);
}
public
function
attachments_list
(
$attrib
)
{
$attrib
+=
array
(
'id'
=>
'rcmkolabnotesattachmentslist'
);
$this
->
rc
->
output
->
add_gui_object
(
'notesattachmentslist'
,
$attrib
[
'id'
]);
return
html
::
tag
(
'ul'
,
$attrib
,
''
,
html
::
$common_attrib
);
}
/**
* Render create/edit form for notes lists (folders)
*/
public
function
list_editform
(
$action
,
$list
,
$folder
)
{
$this
->
action
=
$action
;
$this
->
list
=
$list
;
$this
->
folder
=
is_object
(
$folder
)
?
$folder
->
name
:
''
;
// UTF7;
$this
->
rc
->
output
->
add_handler
(
'notebookform'
,
array
(
$this
,
'notebookform'
));
$this
->
rc
->
output
->
send
(
'kolab_notes.listform'
);
}
/**
* Render create/edit form for notes lists (folders)
*/
public
function
notebookform
(
$attrib
)
{
$folder_name
=
$this
->
folder
;
$hidden_fields
[]
=
array
(
'name'
=>
'oldname'
,
'value'
=>
$folder_name
);
$storage
=
$this
->
rc
->
get_storage
();
$delim
=
$storage
->
get_hierarchy_delimiter
();
$form
=
array
();
if
(
strlen
(
$folder_name
))
{
$options
=
$storage
->
folder_info
(
$folder_name
);
$path_imap
=
explode
(
$delim
,
$folder_name
);
array_pop
(
$path_imap
);
// pop off name part
$path_imap
=
implode
(
$path_imap
,
$delim
);
}
else
{
$path_imap
=
''
;
$options
=
array
();
}
// General tab
$form
[
'properties'
]
=
array
(
'name'
=>
$this
->
rc
->
gettext
(
'properties'
),
'fields'
=>
array
(),
);
// folder name (default field)
$input_name
=
new
html_inputfield
(
array
(
'name'
=>
'name'
,
'id'
=>
'noteslist-name'
,
'size'
=>
20
));
$form
[
'properties'
][
'fields'
][
'name'
]
=
array
(
'label'
=>
$this
->
plugin
->
gettext
(
'listname'
),
'value'
=>
$input_name
->
show
(
$this
->
list
[
'editname'
],
array
(
'disabled'
=>
(
$options
[
'norename'
]
||
$options
[
'protected'
]))),
'id'
=>
'noteslist-name'
,
);
// prevent user from moving folder
if
(!
empty
(
$options
)
&&
(
$options
[
'norename'
]
||
$options
[
'protected'
]))
{
$hidden_fields
[]
=
array
(
'name'
=>
'parent'
,
'value'
=>
$path_imap
);
}
else
{
$select
=
kolab_storage
::
folder_selector
(
'note'
,
array
(
'name'
=>
'parent'
,
'id'
=>
'parent-folder'
),
$folder_name
);
$form
[
'properties'
][
'fields'
][
'path'
]
=
array
(
'label'
=>
$this
->
plugin
->
gettext
(
'parentfolder'
),
'value'
=>
$select
->
show
(
strlen
(
$folder_name
)
?
$path_imap
:
''
),
'id'
=>
'parent-folder'
,
);
}
// add folder ACL tab
if
(
$this
->
action
!=
'form-new'
)
{
$form
[
'sharing'
]
=
array
(
'name'
=>
rcube
::
Q
(
$this
->
plugin
->
gettext
(
'tabsharing'
)),
'content'
=>
$this
->
folder_acl_form
()
);
}
$form_html
=
''
;
if
(
is_array
(
$hidden_fields
))
{
foreach
(
$hidden_fields
as
$field
)
{
$hiddenfield
=
new
html_hiddenfield
(
$field
);
$form_html
.=
$hiddenfield
->
show
()
.
"
\n
"
;
}
}
// create form output
foreach
(
$form
as
$tab
)
{
if
(
is_array
(
$tab
[
'fields'
])
&&
empty
(
$tab
[
'content'
]))
{
$table
=
new
html_table
(
array
(
'cols'
=>
2
,
'class'
=>
'propform'
));
foreach
(
$tab
[
'fields'
]
as
$col
=>
$colprop
)
{
$label
=
!
empty
(
$colprop
[
'label'
])
?
$colprop
[
'label'
]
:
$this
->
plugin
->
gettext
(
$col
);
$table
->
add
(
'title'
,
html
::
label
(
$colprop
[
'id'
],
rcube
::
Q
(
$label
)));
$table
->
add
(
null
,
$colprop
[
'value'
]);
}
$content
=
$table
->
show
();
}
else
{
$content
=
$tab
[
'content'
];
}
if
(!
empty
(
$content
))
{
$form_html
.=
html
::
tag
(
'fieldset'
,
null
,
html
::
tag
(
'legend'
,
null
,
rcube
::
Q
(
$tab
[
'name'
]))
.
$content
)
.
"
\n
"
;
}
}
return
html
::
tag
(
'form'
,
$attrib
+
array
(
'action'
=>
'#'
,
'method'
=>
'post'
,
'id'
=>
'noteslistpropform'
),
$form_html
);
}
/**
* Returns ACL form
*/
public
function
folder_acl_form
()
{
if
(
strlen
(
$this
->
folder
))
{
$this
->
plugin
->
require_plugin
(
'acl'
);
$storage
=
$this
->
rc
->
get_storage
();
$options
=
$storage
->
folder_info
(
$this
->
folder
);
// get sharing UI from acl plugin
$acl
=
$this
->
rc
->
plugins
->
exec_hook
(
'folder_form'
,
array
(
'form'
=>
array
(),
'options'
=>
$options
,
'name'
=>
$this
->
folder
));
}
return
$acl
[
'form'
][
'sharing'
][
'content'
]
?:
html
::
div
(
'hint'
,
$this
->
plugin
->
gettext
(
'aclnorights'
));
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Mon, Apr 6, 3:10 AM (3 w, 3 h ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
0b/f4/f3a904f110e90c389110b61d0706
Default Alt Text
kolab_notes_ui.php (14 KB)
Attached To
Mode
rRPK roundcubemail-plugins-kolab
Attached
Detach File
Event Timeline