Added Translation

This commit is contained in:
Christoph Haas 2016-11-29 19:58:23 +01:00
parent e70894c048
commit 010bd521bc
31 changed files with 4831 additions and 3842 deletions

View File

@ -1,7 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="e7c9c2bb-66f1-4e37-904c-d33d8c113bde" name="Default" comment="" /> <list default="true" id="e7c9c2bb-66f1-4e37-904c-d33d8c113bde" name="Default" comment="">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/backend/.htaccess" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/Makefile" afterPath="$PROJECT_DIR$/Makefile" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/build.xml" afterPath="$PROJECT_DIR$/build.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/changelog.txt" afterPath="$PROJECT_DIR$/changelog.txt" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/config.php" afterPath="$PROJECT_DIR$/config.php" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/ABOUT.js" afterPath="$PROJECT_DIR$/js/ABOUT.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/data/Actions.js" afterPath="$PROJECT_DIR$/js/data/Actions.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/data/ResponseHandler.js" afterPath="$PROJECT_DIR$/js/data/ResponseHandler.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/data/timezones.js" afterPath="$PROJECT_DIR$/js/data/timezones.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/dialogs/ImportContentPanel.js" afterPath="$PROJECT_DIR$/js/dialogs/ImportContentPanel.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/dialogs/ImportPanel.js" afterPath="$PROJECT_DIR$/js/dialogs/ImportPanel.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/plugin.calendarimporter.js" afterPath="$PROJECT_DIR$/js/plugin.calendarimporter.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/settings/SettingsCalSyncWidget.js" afterPath="$PROJECT_DIR$/js/settings/SettingsCalSyncWidget.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/settings/SettingsWidget.js" afterPath="$PROJECT_DIR$/js/settings/SettingsWidget.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/settings/dialogs/CalSyncEditContentPanel.js" afterPath="$PROJECT_DIR$/js/settings/dialogs/CalSyncEditContentPanel.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/settings/dialogs/CalSyncEditPanel.js" afterPath="$PROJECT_DIR$/js/settings/dialogs/CalSyncEditPanel.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/settings/ui/CalSyncGrid.js" afterPath="$PROJECT_DIR$/js/settings/ui/CalSyncGrid.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/settings/ui/CalSyncPanel.js" afterPath="$PROJECT_DIR$/js/settings/ui/CalSyncPanel.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/ui/ContextMenu.js" afterPath="$PROJECT_DIR$/js/ui/ContextMenu.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/manifest.xml" afterPath="$PROJECT_DIR$/manifest.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/php/download.php" afterPath="$PROJECT_DIR$/php/download.php" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/php/module.calendar.php" afterPath="$PROJECT_DIR$/php/module.calendar.php" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/php/plugin.calendarimporter.php" afterPath="$PROJECT_DIR$/php/plugin.calendarimporter.php" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/php/upload.php" afterPath="$PROJECT_DIR$/php/upload.php" />
</list>
<ignored path="calendarimporter.iws" /> <ignored path="calendarimporter.iws" />
<ignored path=".idea/workspace.xml" /> <ignored path=".idea/workspace.xml" />
<ignored path=".idea/dataSources.local.xml" /> <ignored path=".idea/dataSources.local.xml" />
@ -20,104 +46,70 @@
<favorites_list name="calendarimporter" /> <favorites_list name="calendarimporter" />
</component> </component>
<component name="FileEditorManager"> <component name="FileEditorManager">
<leaf> <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="CalSyncEditPanel.js" pinned="false" current-in-tab="false"> <file leaf-file-name="ContextMenu.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/settings/dialogs/CalSyncEditPanel.js"> <entry file="file://$PROJECT_DIR$/js/ui/ContextMenu.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1480">
<caret line="101" column="30" selection-start-line="101" selection-start-column="30" selection-end-line="101" selection-end-column="30" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="CalSyncGrid.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/settings/ui/CalSyncGrid.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="504"> <state relative-caret-position="504">
<caret line="85" column="59" selection-start-line="85" selection-start-column="59" selection-end-line="85" selection-end-column="59" /> <caret line="101" column="8" selection-start-line="101" selection-start-column="8" selection-end-line="104" selection-end-column="0" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="SettingsCalSyncWidget.js" pinned="false" current-in-tab="false"> <file leaf-file-name="plugin.calendarimporter.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/settings/SettingsCalSyncWidget.js"> <entry file="file://$PROJECT_DIR$/js/plugin.calendarimporter.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="729"> <state relative-caret-position="729">
<caret line="104" column="16" selection-start-line="104" selection-start-column="16" selection-end-line="104" selection-end-column="142" /> <caret line="320" column="54" selection-start-line="320" selection-start-column="31" selection-end-line="320" selection-end-column="54" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="sync.php" pinned="false" current-in-tab="false"> <file leaf-file-name="module.calendar.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/backend/sync.php"> <entry file="file://$PROJECT_DIR$/php/module.calendar.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="360"> <state relative-caret-position="301">
<caret line="24" column="47" selection-start-line="24" selection-start-column="47" selection-end-line="24" selection-end-column="47" /> <caret line="329" column="17" selection-start-line="329" selection-start-column="17" selection-end-line="329" selection-end-column="17" />
<folding> <folding>
<element signature="e#21#926#0#PHP" expanded="true" /> <element signature="e#6#914#0#PHP" expanded="true" />
<element signature="n#__construct#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#execute#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#randomstring#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#getDurationStringFromMintues#0;n#CalendarModule#0;n#!!top" expanded="false" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="changelog.txt" pinned="false" current-in-tab="true"> <file leaf-file-name="Makefile" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/changelog.txt"> <entry file="file://$PROJECT_DIR$/Makefile">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75"> <state relative-caret-position="15">
<caret line="5" column="19" selection-start-line="5" selection-start-column="19" selection-end-line="5" selection-end-column="19" /> <caret line="1" column="92" selection-start-line="1" selection-start-column="92" selection-end-line="1" selection-end-column="92" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="manifest.xml" pinned="false" current-in-tab="false"> <file leaf-file-name="download.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/php/download.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="28" column="35" selection-start-line="28" selection-start-column="35" selection-end-line="28" selection-end-column="35" />
<folding>
<element signature="e#7#908#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="manifest.xml" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/manifest.xml"> <entry file="file://$PROJECT_DIR$/manifest.xml">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0"> <state relative-caret-position="135">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <caret line="9" column="62" selection-start-line="9" selection-start-column="62" selection-end-line="9" selection-end-column="62" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="functions.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/backend/functions.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<caret line="5" column="26" selection-start-line="5" selection-start-column="26" selection-end-line="5" selection-end-column="26" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="README.txt" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/backend/README.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="config.php" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/backend/config.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="CalSyncEditContentPanel.js" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/settings/dialogs/CalSyncEditContentPanel.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="63" selection-start-line="0" selection-start-column="63" selection-end-line="0" selection-end-column="63" />
<folding /> <folding />
</state> </state>
</provider> </provider>
@ -138,21 +130,33 @@
<component name="IdeDocumentHistory"> <component name="IdeDocumentHistory">
<option name="CHANGED_PATHS"> <option name="CHANGED_PATHS">
<list> <list>
<option value="$PROJECT_DIR$/php/plugin.calendarimporter.php" />
<option value="$PROJECT_DIR$/config.php" />
<option value="$PROJECT_DIR$/js/plugin.calendarimporter.js" />
<option value="$PROJECT_DIR$/php/module.calendar.php" />
<option value="$PROJECT_DIR$/js/data/CalendarHelper.js" /> <option value="$PROJECT_DIR$/js/data/CalendarHelper.js" />
<option value="$PROJECT_DIR$/js/data/Actions.js" />
<option value="$PROJECT_DIR$/js/dialogs/ImportPanel.js" />
<option value="$PROJECT_DIR$/js/settings/dialogs/CalSyncEditContentPanel.js" />
<option value="$PROJECT_DIR$/js/settings/SettingsWidget.js" />
<option value="$PROJECT_DIR$/js/settings/SettingsCalSyncWidget.js" />
<option value="$PROJECT_DIR$/js/settings/ui/CalSyncGrid.js" />
<option value="$PROJECT_DIR$/js/settings/dialogs/CalSyncEditPanel.js" />
<option value="$PROJECT_DIR$/backend/sync.php" /> <option value="$PROJECT_DIR$/backend/sync.php" />
<option value="$PROJECT_DIR$/backend/functions.php" /> <option value="$PROJECT_DIR$/backend/functions.php" />
<option value="$PROJECT_DIR$/changelog.txt" /> <option value="$PROJECT_DIR$/changelog.txt" />
<option value="$PROJECT_DIR$/Makefile" />
<option value="$PROJECT_DIR$/manifest.xml" />
<option value="$PROJECT_DIR$/php/upload.php" />
<option value="$PROJECT_DIR$/php/download.php" />
<option value="$PROJECT_DIR$/php/plugin.calendarimporter.php" />
<option value="$PROJECT_DIR$/build.xml" />
<option value="$PROJECT_DIR$/js/ABOUT.js" />
<option value="$PROJECT_DIR$/js/ui/ContextMenu.js" />
<option value="$PROJECT_DIR$/js/settings/SettingsWidget.js" />
<option value="$PROJECT_DIR$/js/settings/SettingsCalSyncWidget.js" />
<option value="$PROJECT_DIR$/js/settings/ui/CalSyncGrid.js" />
<option value="$PROJECT_DIR$/js/settings/ui/CalSyncPanel.js" />
<option value="$PROJECT_DIR$/js/settings/dialogs/CalSyncEditPanel.js" />
<option value="$PROJECT_DIR$/js/settings/dialogs/CalSyncEditContentPanel.js" />
<option value="$PROJECT_DIR$/js/dialogs/ImportPanel.js" />
<option value="$PROJECT_DIR$/js/dialogs/ImportContentPanel.js" />
<option value="$PROJECT_DIR$/js/data/ResponseHandler.js" />
<option value="$PROJECT_DIR$/js/data/Actions.js" />
<option value="$PROJECT_DIR$/js/data/timezones.js" />
<option value="$PROJECT_DIR$/backend/.htaccess" />
<option value="$PROJECT_DIR$/config.php" />
<option value="$PROJECT_DIR$/js/plugin.calendarimporter.js" />
<option value="$PROJECT_DIR$/php/module.calendar.php" />
</list> </list>
</option> </option>
</component> </component>
@ -162,6 +166,9 @@
<detection-done>true</detection-done> <detection-done>true</detection-done>
<sorting>DEFINITION_ORDER</sorting> <sorting>DEFINITION_ORDER</sorting>
</component> </component>
<component name="PhpServers">
<servers />
</component>
<component name="PhpWorkspaceProjectConfiguration" backward_compatibility_performed="true" /> <component name="PhpWorkspaceProjectConfiguration" backward_compatibility_performed="true" />
<component name="ProjectFrameBounds"> <component name="ProjectFrameBounds">
<option name="x" value="65" /> <option name="x" value="65" />
@ -213,6 +220,20 @@
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" /> <option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT> </PATH_ELEMENT>
</PATH> </PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="php" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
</PATH>
<PATH> <PATH>
<PATH_ELEMENT> <PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" /> <option name="myItemId" value="calendarimporter" />
@ -245,86 +266,6 @@
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" /> <option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT> </PATH_ELEMENT>
</PATH> </PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="js" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="settings" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="js" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="settings" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ui" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="js" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="settings" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="dialogs" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="js" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="dialogs" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
</PATH>
<PATH> <PATH>
<PATH_ELEMENT> <PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" /> <option name="myItemId" value="calendarimporter" />
@ -343,20 +284,6 @@
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" /> <option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT> </PATH_ELEMENT>
</PATH> </PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="calendarimporter" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="backend" />
<option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
</PATH_ELEMENT>
</PATH>
</subPane> </subPane>
</pane> </pane>
<pane id="Scope" /> <pane id="Scope" />
@ -386,6 +313,12 @@
<method /> <method />
</configuration> </configuration>
<configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js"> <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
<node-interpreter>project</node-interpreter>
<node-options />
<gulpfile />
<tasks />
<arguments />
<envs />
<method /> <method />
</configuration> </configuration>
<configuration default="true" type="js.build_tools.npm" factoryName="npm"> <configuration default="true" type="js.build_tools.npm" factoryName="npm">
@ -412,6 +345,9 @@
<component name="ShelveChangesManager" show_recycled="false"> <component name="ShelveChangesManager" show_recycled="false">
<option name="remove_strategy" value="false" /> <option name="remove_strategy" value="false" />
</component> </component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager"> <component name="TaskManager">
<task active="true" id="Default" summary="Default task"> <task active="true" id="Default" summary="Default task">
<changelist id="e7c9c2bb-66f1-4e37-904c-d33d8c113bde" name="Default" comment="" /> <changelist id="e7c9c2bb-66f1-4e37-904c-d33d8c113bde" name="Default" comment="" />
@ -419,12 +355,13 @@
<option name="number" value="Default" /> <option name="number" value="Default" />
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1477949602474</updated> <updated>1477949602474</updated>
<workItem from="1477949603566" duration="9042000" /> <workItem from="1477949603566" duration="9204000" />
<workItem from="1480441197414" duration="4152000" />
</task> </task>
<servers /> <servers />
</component> </component>
<component name="TimeTrackingManager"> <component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="9042000" /> <option name="totallyTimeSpent" value="13356000" />
</component> </component>
<component name="ToolWindowManager"> <component name="ToolWindowManager">
<frame x="65" y="24" width="1792" height="999" extended-state="6" /> <frame x="65" y="24" width="1792" height="999" extended-state="6" />
@ -432,19 +369,19 @@
<layout> <layout>
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" /> <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" /> <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" /> <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" /> <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32900432" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32900432" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32900432" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" /> <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32900432" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" /> <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" /> <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" /> <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
</layout> </layout>
@ -467,131 +404,17 @@
<watches-manager /> <watches-manager />
</component> </component>
<component name="editorHistoryManager"> <component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/Makefile"> <entry file="file://$PROJECT_DIR$/js/settings/dialogs/CalSyncEditPanel.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0"> <state relative-caret-position="1515">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <caret line="101" column="30" selection-start-line="101" selection-start-column="30" selection-end-line="101" selection-end-column="30" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/php/composer.json">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/php/upload.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/data/ResponseHandler.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-456">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="n#!!doc" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/php/module.calendar.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1057">
<caret line="467" column="64" selection-start-line="467" selection-start-column="64" selection-end-line="467" selection-end-column="64" />
<folding>
<element signature="n#__construct#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#execute#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#randomstring#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#getDurationStringFromMintues#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#exportCalendar#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#importCalendar#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#getAttachmentPath#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#loadCalendar#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#parseCalendarToArray#0;n#CalendarModule#0;n#!!top" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="60">
<caret line="4" column="60" selection-start-line="4" selection-start-column="12" selection-end-line="4" selection-end-column="60" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/php/plugin.calendarimporter.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="569">
<caret line="82" column="40" selection-start-line="82" selection-start-column="29" selection-end-line="82" selection-end-column="40" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/dialogs/ImportContentPanel.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-171">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="n#!!doc" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/data/CalendarHelper.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/dialogs/ImportPanel.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="332">
<caret line="245" column="12" selection-start-line="245" selection-start-column="12" selection-end-line="245" selection-end-column="226" />
<folding>
<element signature="n#!!doc" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/data/Actions.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="133" column="67" selection-start-line="133" selection-start-column="22" selection-end-line="133" selection-end-column="67" />
<folding>
<element signature="n#!!doc" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/settings/SettingsWidget.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="340">
<caret line="83" column="82" selection-start-line="83" selection-start-column="82" selection-end-line="83" selection-end-column="82" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/plugin.calendarimporter.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-51">
<caret line="262" column="12" selection-start-line="262" selection-start-column="12" selection-end-line="262" selection-end-column="12" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/js/settings/ui/CalSyncGrid.js"> <entry file="file://$PROJECT_DIR$/js/settings/ui/CalSyncGrid.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="504"> <state relative-caret-position="1275">
<caret line="85" column="59" selection-start-line="85" selection-start-column="59" selection-end-line="85" selection-end-column="59" /> <caret line="85" column="59" selection-start-line="85" selection-start-column="59" selection-end-line="85" selection-end-column="59" />
<folding /> <folding />
</state> </state>
@ -599,12 +422,62 @@
</entry> </entry>
<entry file="file://$PROJECT_DIR$/js/settings/SettingsCalSyncWidget.js"> <entry file="file://$PROJECT_DIR$/js/settings/SettingsCalSyncWidget.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="729"> <state relative-caret-position="1560">
<caret line="104" column="16" selection-start-line="104" selection-start-column="16" selection-end-line="104" selection-end-column="142" /> <caret line="104" column="16" selection-start-line="104" selection-start-column="16" selection-end-line="104" selection-end-column="142" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/backend/sync.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="60">
<caret line="24" column="47" selection-start-line="24" selection-start-column="47" selection-end-line="24" selection-end-column="47" />
<folding>
<element signature="e#21#926#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/changelog.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/manifest.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/backend/functions.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<caret line="5" column="26" selection-start-line="5" selection-start-column="26" selection-end-line="5" selection-end-column="26" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/backend/README.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/backend/config.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/settings/dialogs/CalSyncEditContentPanel.js"> <entry file="file://$PROJECT_DIR$/js/settings/dialogs/CalSyncEditContentPanel.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0"> <state relative-caret-position="0">
@ -613,14 +486,14 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/js/settings/dialogs/CalSyncEditPanel.js"> <entry file="file://$PROJECT_DIR$/php/composer.json">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1480"> <state relative-caret-position="0">
<caret line="101" column="30" selection-start-line="101" selection-start-column="30" selection-end-line="101" selection-end-column="30" /> <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/js/data/CalendarHelper.js" />
<entry file="file://$PROJECT_DIR$/backend/functions.php"> <entry file="file://$PROJECT_DIR$/backend/functions.php">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75"> <state relative-caret-position="75">
@ -637,6 +510,139 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/backend/sync.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="60">
<caret line="24" column="47" selection-start-line="24" selection-start-column="47" selection-end-line="24" selection-end-column="47" />
<folding>
<element signature="e#21#926#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/changelog.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="30" selection-start-line="2" selection-start-column="30" selection-end-line="2" selection-end-column="30" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/build.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="56" selection-start-line="2" selection-start-column="56" selection-end-line="2" selection-end-column="56" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/ABOUT.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="744">
<caret line="61" column="71" selection-start-line="61" selection-start-column="71" selection-end-line="61" selection-end-column="71" />
<folding>
<marker date="1480442383471" expanded="true" signature="1214:1218" ph="&lt;" />
<marker date="1480442383471" expanded="true" signature="1244:1248" ph="&gt;" />
<marker date="1480442383471" expanded="true" signature="2881:2885" ph="&lt;" />
<marker date="1480442383471" expanded="true" signature="2905:2909" ph="&gt;" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/settings/SettingsCalSyncWidget.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="945">
<caret line="63" column="55" selection-start-line="63" selection-start-column="55" selection-end-line="63" selection-end-column="55" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/settings/ui/CalSyncGrid.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="435">
<caret line="44" column="93" selection-start-line="44" selection-start-column="57" selection-end-line="44" selection-end-column="93" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/settings/ui/CalSyncPanel.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="744">
<caret line="65" column="17" selection-start-line="65" selection-start-column="17" selection-end-line="65" selection-end-column="17" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/settings/SettingsWidget.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="20" selection-end-column="3" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/settings/dialogs/CalSyncEditContentPanel.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="624">
<caret line="48" column="55" selection-start-line="48" selection-start-column="55" selection-end-line="48" selection-end-column="55" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/external/Ext.util.base64.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/settings/dialogs/CalSyncEditPanel.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="585">
<caret line="147" column="28" selection-start-line="147" selection-start-column="28" selection-end-line="147" selection-end-column="64" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/dialogs/ImportContentPanel.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="774">
<caret line="63" column="2" selection-start-line="63" selection-start-column="2" selection-end-line="63" selection-end-column="2" />
<folding>
<element signature="n#!!doc" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/dialogs/ImportPanel.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="n#!!doc" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/data/ResponseHandler.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15">
<caret line="1" column="29" selection-start-line="1" selection-start-column="29" selection-end-line="1" selection-end-column="29" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/data/timezones.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-9350">
<caret line="90" column="87" selection-start-line="90" selection-start-column="87" selection-end-line="90" selection-end-column="87" />
<folding>
<element signature="n#!!doc" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/backend/README.txt"> <entry file="file://$PROJECT_DIR$/backend/README.txt">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0"> <state relative-caret-position="0">
@ -645,28 +651,111 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/backend/sync.php"> <entry file="file://$PROJECT_DIR$/backend/.htaccess">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="360"> <state relative-caret-position="0">
<caret line="24" column="47" selection-start-line="24" selection-start-column="47" selection-end-line="24" selection-end-column="47" /> <caret line="0" column="13" selection-start-line="0" selection-start-column="13" selection-end-line="0" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/README.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="2" column="59" selection-start-line="2" selection-start-column="54" selection-end-line="2" selection-end-column="59" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/php/plugin.calendarimporter.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-90">
<caret line="36" column="5" selection-start-line="36" selection-start-column="5" selection-end-line="36" selection-end-column="5" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/php/upload.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-314">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding> <folding>
<element signature="e#21#926#0#PHP" expanded="true" /> <element signature="e#6#905#0#PHP" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/js/ui/ContextMenu.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="504">
<caret line="101" column="8" selection-start-line="101" selection-start-column="8" selection-end-line="104" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/php/download.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="28" column="35" selection-start-line="28" selection-start-column="35" selection-end-line="28" selection-end-column="35" />
<folding>
<element signature="e#7#908#0#PHP" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/data/Actions.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1191">
<caret line="45" column="63" selection-start-line="45" selection-start-column="63" selection-end-line="45" selection-end-column="63" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/plugin.calendarimporter.js">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="729">
<caret line="320" column="54" selection-start-line="320" selection-start-column="31" selection-end-line="320" selection-end-column="54" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/php/module.calendar.php">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="301">
<caret line="329" column="17" selection-start-line="329" selection-start-column="17" selection-end-line="329" selection-end-column="17" />
<folding>
<element signature="e#6#914#0#PHP" expanded="true" />
<element signature="n#__construct#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#execute#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#randomstring#0;n#CalendarModule#0;n#!!top" expanded="false" />
<element signature="n#getDurationStringFromMintues#0;n#CalendarModule#0;n#!!top" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Makefile">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="15">
<caret line="1" column="92" selection-start-line="1" selection-start-column="92" selection-end-line="1" selection-end-column="92" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/manifest.xml"> <entry file="file://$PROJECT_DIR$/manifest.xml">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0"> <state relative-caret-position="135">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" /> <caret line="9" column="62" selection-start-line="9" selection-start-column="62" selection-end-line="9" selection-end-column="62" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/changelog.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<caret line="5" column="19" selection-start-line="5" selection-start-column="19" selection-end-line="5" selection-end-column="19" />
<folding /> <folding />
</state> </state>
</provider> </provider>

View File

@ -1,2 +1,2 @@
default: default:
ant deploy; cp -r /home/osboxes/Documents/kopano-webapp-3.2.0.285/deploy/plugins/calendarimporter /usr/share/kopano-webapp/plugins/ rm -rf /home/osboxes/Documents/kopano-webapp-3.2.0.285/deploy/plugins/calendarimporter; ant deploy; cp -r /home/osboxes/Documents/kopano-webapp-3.2.0.285/deploy/plugins/calendarimporter /usr/share/kopano-webapp/plugins/

1
backend/.htaccess Normal file
View File

@ -0,0 +1 @@
deny from all

409
build.xml
View File

@ -1,200 +1,247 @@
<project default="all"> <project default="all">
<property environment="env"/> <property environment="env"/>
<property name="root-folder" value="${basedir}/../../"/> <property name="root-folder" value="${basedir}/../.."/>
<property name="tools-folder" value="${root-folder}/tools/"/> <property name="tools-folder" value="${root-folder}/tools/"/>
<property name="target-folder" value="${root-folder}/deploy/plugins"/> <property name="target-folder" value="${root-folder}/deploy/plugins"/>
<property name="server-folder" value="${root-folder}/server"/> <property name="server-folder" value="${root-folder}/server"/>
<property name="language-folder" value="${basedir}/languages"/>
<import file="${tools-folder}/antutil.xml"/> <import file="${tools-folder}/antutil.xml"/>
<typedef file="${tools-folder}/antlib.xml"> <typedef file="${tools-folder}/antlib.xml">
<classpath> <classpath>
<pathelement location="${tools-folder}/tools.jar"/> <pathelement location="${tools-folder}/tools.jar"/>
</classpath> </classpath>
</typedef> </typedef>
<taskdef resource="net/sf/antcontrib/antcontrib.properties"> <taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath> <classpath>
<pathelement location="${tools-folder}/lib/ant-contrib-1.0b3.jar"/> <pathelement location="${tools-folder}/lib/ant-contrib-1.0b3.jar"/>
</classpath> </classpath>
</taskdef> </taskdef>
<!-- Determine plugin name --> <!-- Determine plugin name -->
<basename file="${basedir}" property="plugin"/> <basename file="${basedir}" property="plugin"/>
<!-- The Plugin distribution files --> <!-- The Plugin distribution files -->
<property name="plugin-folder" value="${plugin}"/> <property name="plugin-folder" value="${plugin}"/>
<property name="plugin-debugfile" value="${plugin}-debug.js"/> <property name="plugin-debugfile" value="${plugin}-debug.js"/>
<property name="plugin-file" value="${plugin}.js"/> <property name="plugin-file" value="${plugin}.js"/>
<!-- The Plugin CSS files --> <!-- The Plugin CSS files -->
<property name="plugin-css-folder" value="resources/css"/> <property name="plugin-css-folder" value="resources/css"/>
<property name="plugin-css-file" value="${plugin}.css"/> <property name="plugin-css-file" value="${plugin}.css"/>
<!-- Meta target --> <!-- Meta target -->
<target name="all" depends="concat, compress"/> <target name="all" depends="concat, compress"/>
<!-- Clean --> <!-- Clean -->
<target name="clean"> <target name="clean">
<delete includeemptydirs="true" failonerror="false"> <delete includeemptydirs="true" failonerror="false">
<!-- Delete the Plugin files --> <!-- Delete the Plugin files -->
<fileset dir="${target-folder}/${plugin-folder}/js"> <fileset dir="${target-folder}/${plugin-folder}/js">
<include name="${plugin-file}"/> <include name="${plugin-file}"/>
<include name="${plugin-debugfile}"/> <include name="${plugin-debugfile}"/>
</fileset> </fileset>
</delete> </delete>
</target> </target>
<!-- Concatenates JavaScript files with automatic dependency generation --> <!-- Concatenates JavaScript files with automatic dependency generation -->
<target name="concat"> <target name="concat">
<!-- Concatenate plugin JS file --> <!-- Concatenate plugin JS file -->
<if> <if>
<available file="js" type="dir" /> <available file="js" type="dir"/>
<then> <then>
<mkdir dir="${target-folder}/${plugin-folder}/js"/> <mkdir dir="${target-folder}/${plugin-folder}/js"/>
<echo message="Concatenating: ${plugin-debugfile}"/> <echo message="Concatenating: ${plugin-debugfile}"/>
<zConcat outputFolder="${target-folder}/${plugin-folder}/js" outputFile="${plugin-debugfile}" prioritize="\w+"> <zConcat outputFolder="${target-folder}/${plugin-folder}/js" outputFile="${plugin-debugfile}"
<concatfiles> prioritize="\w+">
<fileset dir="js" includes="**/*.js" /> <concatfiles>
</concatfiles> <fileset dir="js" includes="**/*.js"/>
</zConcat> </concatfiles>
</then> </zConcat>
</if> </then>
</if>
<!-- Concatenate plugin CSS files --> <!-- Concatenate plugin CSS files -->
<if> <if>
<available file="${plugin-css-folder}" type="dir" /> <available file="${plugin-css-folder}" type="dir"/>
<then> <then>
<mkdir dir="${target-folder}/${plugin-folder}/${plugin-css-folder}"/> <mkdir dir="${target-folder}/${plugin-folder}/${plugin-css-folder}"/>
<echo message="Concatenating: ${plugin-css-file}"/> <echo message="Concatenating: ${plugin-css-file}"/>
<zConcat outputFolder="${target-folder}/${plugin-folder}/${plugin-css-folder}" outputFile="${plugin-css-file}"> <zConcat outputFolder="${target-folder}/${plugin-folder}/${plugin-css-folder}"
<concatfiles> outputFile="${plugin-css-file}">
<fileset dir="${plugin-css-folder}" includes="**/*.css" /> <concatfiles>
</concatfiles> <fileset dir="${plugin-css-folder}" includes="**/*.css"/>
</zConcat> </concatfiles>
</then> </zConcat>
</if> </then>
</target> </if>
</target>
<!-- Preformat the Concatenated Javascript files to improve compilation --> <!-- Preformat the Concatenated Javascript files to improve compilation -->
<target name="preformat" depends="concat"> <target name="preformat" depends="concat">
<if> <if>
<available file="${target-folder}/${plugin-folder}/js/${plugin-debugfile}" type="file" /> <available file="${target-folder}/${plugin-folder}/js/${plugin-debugfile}" type="file"/>
<then> <then>
<echo message="Preformatting: ${plugin-debugfile}"/> <echo message="Preformatting: ${plugin-debugfile}"/>
<replaceregexp byline="true"> <replaceregexp byline="true">
<regexp pattern="(^[ ,\t]*\*[ ,\t]@.*)\{(.*)\[\]\}"/> <regexp pattern="(^[ ,\t]*\*[ ,\t]@.*)\{(.*)\[\]\}"/>
<substitution expression="\1{\2\|Array}"/> <substitution expression="\1{\2\|Array}"/>
<fileset dir="${target-folder}/${plugin-folder}/js" includes="${plugin-debugfile}"/> <fileset dir="${target-folder}/${plugin-folder}/js" includes="${plugin-debugfile}"/>
</replaceregexp> </replaceregexp>
</then> </then>
</if> </if>
</target> </target>
<!-- Compress JavaScript --> <!-- Compress JavaScript -->
<target name="compress" depends="preformat"> <target name="compress" depends="preformat">
<if> <if>
<available file="${target-folder}/${plugin-folder}/js/${plugin-debugfile}" type="file" /> <available file="${target-folder}/${plugin-folder}/js/${plugin-debugfile}" type="file"/>
<then> <then>
<echo message="Compiling: ${plugin-debugfile}" /> <echo message="Compiling: ${plugin-debugfile}"/>
<zCompile inputFolder="${target-folder}/${plugin-folder}/js" inputFile="${plugin-debugfile}" outputFolder="${target-folder}/${plugin-folder}/js" outputFile="${plugin-file}"> <zCompile inputFolder="${target-folder}/${plugin-folder}/js" inputFile="${plugin-debugfile}"
<externs> outputFolder="${target-folder}/${plugin-folder}/js" outputFile="${plugin-file}">
var Ext = {}; <externs>
var Zarafa = {}; var Ext = {};
var container = {}; var Zarafa = {};
var _ = function(key, domain) {}; var container = {};
var dgettext = function(domain, msgid) {}; var _ = function(key, domain) {};
var dngettext = function(domain, msgid, msgid_plural, count) {}; var dgettext = function(domain, msgid) {};
var dnpgettext = function(domain, msgctxt, msgid, msgid_plural, count) {}; var dngettext = function(domain, msgid, msgid_plural, count) {};
var dpgettext = function(domain, msgctxt, msgid) {}; var dnpgettext = function(domain, msgctxt, msgid, msgid_plural, count) {};
var ngettext = function(msgid, msgid_plural, count) {}; var dpgettext = function(domain, msgctxt, msgid) {};
var npgettext = function(msgctxt, msgid, msgid_plural, count) {}; var ngettext = function(msgid, msgid_plural, count) {};
var pgettext = function(msgctxt, msgid) {}; var npgettext = function(msgctxt, msgid, msgid_plural, count) {};
</externs> var pgettext = function(msgctxt, msgid) {};
</zCompile> </externs>
</then> </zCompile>
</if> </then>
</target> </if>
</target>
<!-- syntax check all PHP files --> <!-- syntax check all PHP files -->
<target name="validate"> <target name="validate">
<if> <if>
<available file="php" filepath="${env.PATH}" /> <available file="php" filepath="${env.PATH}"/>
<then> <then>
<if> <if>
<available file="config.php" type="file" /> <available file="config.php" type="file"/>
<then> <then>
<antcall target="syntax-check"> <antcall target="syntax-check">
<param name="file" value="config.php"/> <param name="file" value="config.php"/>
</antcall> </antcall>
</then> </then>
</if> </if>
<if> <if>
<available file="php" type="dir" /> <available file="php" type="dir"/>
<then> <then>
<foreach target="syntax-check" param="file"> <foreach target="syntax-check" param="file">
<path> <path>
<fileset dir="."> <fileset dir=".">
<exclude name="php/vendor/**" /> <exclude name="php/vendor/**"/>
<include name="**/*.php"/> <include name="**/*.php"/>
</fileset> </fileset>
</path> </path>
</foreach> </foreach>
</then> </then>
</if> </if>
</then> </then>
<else> <else>
<echo message="WARNING: PHP not available, not performing syntax-check on php files"/> <echo message="WARNING: PHP not available, not performing syntax-check on php files"/>
</else> </else>
</if> </if>
</target> </target>
<target name="syntax-check"> <target name="syntax-check">
<echo message="validating ${file}"/> <echo message="validating ${file}"/>
<exec executable="php" failonerror="true"> <exec executable="php" failonerror="true">
<arg value="-l"/> <arg value="-l"/>
<arg value="${file}"/> <arg value="${file}"/>
</exec> </exec>
</target> </target>
<!-- Install all files into the target folder --> <!-- Generate language files -->
<target name="deploy" depends="compress, validate"> <target name="language">
<mkdir dir="${target-folder}/${plugin-folder}"/> <if>
<available file="msgfmt" filepath="${env.PATH}"/>
<then>
<for param="file" parallel="true">
<fileset dir="${language-folder}">
<include name="**/LC_MESSAGES/*.po"/>
</fileset>
<sequential>
<antcall target="msgfmt">
<param name="file" value="@{file}"/>
</antcall>
</sequential>
</for>
</then>
<else>
<echo message="WARNING: msgfmt not available, not generating *.mo files for translations"/>
<!-- just copy files -->
<copy todir="${target-folder}/${plugin-folder}">
<fileset dir=".">
<include name="languages/**/*.mo"/>
<include name="languages/**/*.txt"/>
</fileset>
</copy>
</else>
</if>
</target>
<!-- Copy (and validate) manifest.xml --> <target name="msgfmt">
<if> <propertyregex property="outfile" input="${file}" regexp=".*\/(languages\/.*)\.po"
<available file="xmllint" filepath="${env.PATH}" /> replace="${target-folder}/${plugin-folder}/\1\.mo"/>
<then> <echo message="Converting ${file} to ${outfile}"/>
<exec executable="xmllint" output="${target-folder}/${plugin-folder}/manifest.xml" failonerror="true"> <dirname property="outdir" file="${outfile}"/>
<arg value="--valid"/> <mkdir dir="${outdir}"/>
<arg value="--path"/> <exec executable="msgfmt" failonerror="true">
<arg value="${server-folder}"/> <arg value="-v"/>
<arg value="manifest.xml"/> <arg value="-o"/>
</exec> <arg value="${outfile}"/>
</then> <arg value="${file}"/>
<else> </exec>
<echo message="WARNING: xmllint not available, not performing syntax-check on manifest.xml"/> </target>
<!-- xmllint is not available, so we must copy the file manually -->
<copy todir="${target-folder}/${plugin-folder}">
<fileset dir=".">
<include name="manifest.xml"/>
</fileset>
</copy>
</else>
</if>
<!-- copy files --> <!-- Install all files into the target folder -->
<copy todir="${target-folder}/${plugin-folder}"> <target name="deploy" depends="compress, validate, language">
<fileset dir="."> <mkdir dir="${target-folder}/${plugin-folder}"/>
<include name="resources/**/*.*"/>
<include name="external/**/*.*"/> <!-- Copy (and validate) manifest.xml -->
<include name="php/**/*.php"/> <if>
<include name="config.php"/> <available file="xmllint" filepath="${env.PATH}"/>
<!-- exclude the ant script --> <then>
<exclude name="build.xml"/> <exec executable="xmllint" output="${target-folder}/${plugin-folder}/manifest.xml" failonerror="true">
<!-- CSS is generated during build --> <arg value="--valid"/>
<exclude name="resources/css/*.*"/> <arg value="--path"/>
</fileset> <arg value="${server-folder}"/>
</copy> <arg value="manifest.xml"/>
</target> </exec>
</then>
<else>
<echo message="WARNING: xmllint not available, not performing syntax-check on manifest.xml"/>
<!-- xmllint is not available, so we must copy the file manually -->
<copy todir="${target-folder}/${plugin-folder}">
<fileset dir=".">
<include name="manifest.xml"/>
</fileset>
</copy>
</else>
</if>
<!-- copy files -->
<copy todir="${target-folder}/${plugin-folder}">
<fileset dir=".">
<include name="resources/**/*.*"/>
<include name="external/**/*.*"/>
<include name="php/**/*.php"/>
<include name="config.php"/>
<!-- exclude the ant script -->
<exclude name="build.xml"/>
<!-- CSS is generated during build -->
<exclude name="resources/css/*.*"/>
</fileset>
</copy>
</target>
</project> </project>

View File

@ -1,3 +1,7 @@
calendarimporter 2.2.1:
- finally supporting Kopano Webapp 3.1.x
- translation to german added
calendarimporter 2.2.0: calendarimporter 2.2.0:
- support for Kopano Webapp 3.1.1 - support for Kopano Webapp 3.1.1
- Code rework - Code rework

View File

@ -1,13 +1,12 @@
<?php <?php
/** Disable the import plugin for all clients */ /** Disable the import plugin for all clients */
define('PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE', true); define('PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE', false);
/** Disable the sync feature for all clients */ /** Disable the sync feature for all clients */
define('PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE_SYNC', true); // not yet implemented define('PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE_SYNC', true);
/** The default calendar to import to*/ /** The default calendar to import to*/
define('PLUGIN_CALENDARIMPORTER_DEFAULT', "Kalender"); define('PLUGIN_CALENDARIMPORTER_DEFAULT', "Kalender");
define('PLUGIN_CALENDARIMPORTER_DEFAULT_TIMEZONE', "Europe/Vienna"); define('PLUGIN_CALENDARIMPORTER_DEFAULT_TIMEZONE', "Europe/Vienna");
/** Tempory path for uploaded files... */ /** Tempory path for uploaded files... */
define('PLUGIN_CALENDARIMPORTER_TMP_UPLOAD', "/var/lib/kopano-webapp/tmp/"); define('PLUGIN_CALENDARIMPORTER_TMP_UPLOAD', "/var/lib/kopano-webapp/tmp/");
?>

View File

@ -1,5 +1,5 @@
/** /**
* ABOUT.js zarafa calender to ics im/exporter * ABOUT.js, Kopano calender to ics im/exporter
* *
* Author: Christoph Haas <christoph.h@sprinternet.at> * Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas * Copyright (C) 2012-2016 Christoph Haas
@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
*/ */
Ext.namespace('Zarafa.plugins.calendarimporter'); Ext.namespace('Zarafa.plugins.calendarimporter');
/** /**
@ -29,38 +29,38 @@ Ext.namespace('Zarafa.plugins.calendarimporter');
* The copyright string holding the copyright notice for the Zarafa calendarimporter Plugin. * The copyright string holding the copyright notice for the Zarafa calendarimporter Plugin.
*/ */
Zarafa.plugins.calendarimporter.ABOUT = "" Zarafa.plugins.calendarimporter.ABOUT = ""
+ "<p>Copyright (C) 2012-2016 Christoph Haas &lt;christoph.h@sprinternet.at&gt;</p>" + "<p>Copyright (C) 2012-2016 Christoph Haas &lt;christoph.h@sprinternet.at&gt;</p>"
+ "<p>This program is free software; you can redistribute it and/or " + "<p>This program is free software; you can redistribute it and/or "
+ "modify it under the terms of the GNU Lesser General Public " + "modify it under the terms of the GNU Lesser General Public "
+ "License as published by the Free Software Foundation; either " + "License as published by the Free Software Foundation; either "
+ "version 2.1 of the License, or (at your option) any later version.</p>" + "version 2.1 of the License, or (at your option) any later version.</p>"
+ "<p>This program is distributed in the hope that it will be useful, " + "<p>This program is distributed in the hope that it will be useful, "
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of " + "but WITHOUT ANY WARRANTY; without even the implied warranty of "
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU " + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU "
+ "Lesser General Public License for more details.</p>" + "Lesser General Public License for more details.</p>"
+ "<p>You should have received a copy of the GNU Lesser General Public " + "<p>You should have received a copy of the GNU Lesser General Public "
+ "License along with this program; if not, write to the Free Software " + "License along with this program; if not, write to the Free Software "
+ "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</p>" + "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</p>"
+ "<hr />" + "<hr />"
+ "<p>The calendarimporter plugin contains the following third-party components:</p>" + "<p>The calendarimporter plugin contains the following third-party components:</p>"
+ "<h1>iCalcreator v2.16.12</h1>"
+ "<p>Copyright 2007-2013 Kjell-Inge Gustafsson kigkonsult</p>" + "<h1>iCalcreator v2.16.12</h1>"
+ "<p>This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.</p>" + "<p>Copyright 2007-2013 Kjell-Inge Gustafsson kigkonsult</p>"
+ "<p>This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</p>"
+ "<h1>Ics-parser</h1>"
+ "<p>Copyright 2002-2007 Martin Thoma <info@martin-thoma.de></p>" + "<p>This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.</p>"
+ "<p>Licensed under the MIT License.</p>" + "<p>This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.</p>"
+ "<p>Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.</p>"; + "<h1>Ics-parser</h1>"
+ "<p>Copyright 2002-2007 Martin Thoma &lt;info@martin-thoma.de&gt;</p>"
+ "<p>Licensed under the MIT License.</p>"
+ "<p>Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.</p>";

View File

@ -34,96 +34,96 @@ Ext.namespace('Zarafa.plugins.calendarimporter.data');
* @singleton * @singleton
*/ */
Zarafa.plugins.calendarimporter.data.Actions = { Zarafa.plugins.calendarimporter.data.Actions = {
/** /**
* Callback for the export request. * Callback for the export request.
* @param {Object} response * @param {Object} response
*/ */
downloadICS: function (response) { downloadICS: function (response) {
if (response.status == false) { if (response.status == false) {
Zarafa.common.dialogs.MessageBox.show({ Zarafa.common.dialogs.MessageBox.show({
title : dgettext('plugin_files', 'Warning'), title: dgettext('plugin_calendarimporter', 'Warning'),
msg : dgettext('plugin_files', response.message), msg: response.message,
icon : Zarafa.common.dialogs.MessageBox.WARNING, icon: Zarafa.common.dialogs.MessageBox.WARNING,
buttons: Zarafa.common.dialogs.MessageBox.OK buttons: Zarafa.common.dialogs.MessageBox.OK
}); });
} else { } else {
var downloadFrame = Ext.getBody().createChild({ var downloadFrame = Ext.getBody().createChild({
tag: 'iframe', tag: 'iframe',
cls: 'x-hidden' cls: 'x-hidden'
}); });
var url = document.URL; var url = document.URL;
var link = url.substring(0, url.lastIndexOf('/') + 1); var link = url.substring(0, url.lastIndexOf('/') + 1);
link += "index.php?sessionid=" + container.getUser().getSessionId() + "&load=custom&name=download_ics"; link += "index.php?sessionid=" + container.getUser().getSessionId() + "&load=custom&name=download_ics";
link = Ext.urlAppend(link, "token=" + encodeURIComponent(response.download_token)); link = Ext.urlAppend(link, "token=" + encodeURIComponent(response.download_token));
link = Ext.urlAppend(link, "filename=" + encodeURIComponent(response.filename)); link = Ext.urlAppend(link, "filename=" + encodeURIComponent(response.filename));
downloadFrame.dom.contentWindow.location = link; downloadFrame.dom.contentWindow.location = link;
} }
}, },
/** /**
* Get all calendar folders. * Get all calendar folders.
* @param {boolean} asDropdownStore If true, a simple array store will be returned. * @param {boolean} asDropdownStore If true, a simple array store will be returned.
* @returns {*} * @returns {*}
*/ */
getAllCalendarFolders: function (asDropdownStore) { getAllCalendarFolders: function (asDropdownStore) {
asDropdownStore = Ext.isEmpty(asDropdownStore) ? false : asDropdownStore; asDropdownStore = Ext.isEmpty(asDropdownStore) ? false : asDropdownStore;
var allFolders = []; var allFolders = [];
var inbox = container.getHierarchyStore().getDefaultStore(); var inbox = container.getHierarchyStore().getDefaultStore();
var pub = container.getHierarchyStore().getPublicStore(); var pub = container.getHierarchyStore().getPublicStore();
if (!Ext.isEmpty(inbox.subStores) && inbox.subStores.folders.totalLength > 0) { if (!Ext.isEmpty(inbox.subStores) && inbox.subStores.folders.totalLength > 0) {
for (var i = 0; i < inbox.subStores.folders.totalLength; i++) { for (var i = 0; i < inbox.subStores.folders.totalLength; i++) {
var folder = inbox.subStores.folders.getAt(i); var folder = inbox.subStores.folders.getAt(i);
if (!Ext.isEmpty(folder) && folder.get("container_class") == "IPF.Appointment") { if (!Ext.isEmpty(folder) && folder.get("container_class") == "IPF.Appointment") {
if (asDropdownStore) { if (asDropdownStore) {
allFolders.push([ allFolders.push([
folder.get("entryid"), folder.get("entryid"),
folder.get("display_name") folder.get("display_name")
]); ]);
} else { } else {
allFolders.push({ allFolders.push({
display_name : folder.get("display_name"), display_name: folder.get("display_name"),
entryid : folder.get("entryid"), entryid: folder.get("entryid"),
store_entryid: folder.get("store_entryid"), store_entryid: folder.get("store_entryid"),
is_public : false is_public: false
}); });
} }
} }
} }
} }
if (!Ext.isEmpty(pub.subStores) && pub.subStores.folders.totalLength > 0) { if (!Ext.isEmpty(pub.subStores) && pub.subStores.folders.totalLength > 0) {
for (var j = 0; j < pub.subStores.folders.totalLength; j++) { for (var j = 0; j < pub.subStores.folders.totalLength; j++) {
var folder = pub.subStores.folders.getAt(j); var folder = pub.subStores.folders.getAt(j);
if (!Ext.isEmpty(folder) && folder.get("container_class") == "IPF.Appointment") { if (!Ext.isEmpty(folder) && folder.get("container_class") == "IPF.Appointment") {
if (asDropdownStore) { if (asDropdownStore) {
allFolders.push([ allFolders.push([
folder.get("entryid"), folder.get("entryid"),
folder.get("display_name") + " (Public)" folder.get("display_name") + " (Public)"
]); ]);
} else { } else {
allFolders.push({ allFolders.push({
display_name : folder.get("display_name"), display_name: folder.get("display_name"),
entryid : folder.get("entryid"), entryid: folder.get("entryid"),
store_entryid: folder.get("store_entryid"), store_entryid: folder.get("store_entryid"),
is_public : true is_public: true
}); });
} }
} }
} }
} }
if (asDropdownStore) { if (asDropdownStore) {
return allFolders.sort(Zarafa.plugins.calendarimporter.data.Actions.dynamicSort(1)); return allFolders.sort(Zarafa.plugins.calendarimporter.data.Actions.dynamicSort(1));
} else { } else {
return allFolders; return allFolders;
} }
}, },
/** /**
* Return a calendar folder element by name. * Return a calendar folder element by name.
@ -159,20 +159,20 @@ Zarafa.plugins.calendarimporter.data.Actions = {
return container.getHierarchyStore().getDefaultFolder('calendar'); return container.getHierarchyStore().getDefaultFolder('calendar');
}, },
/** /**
* Dynamic sort function, sorts by property name. * Dynamic sort function, sorts by property name.
* @param {string|int} property * @param {string|int} property
* @returns {Function} * @returns {Function}
*/ */
dynamicSort: function (property) { dynamicSort: function (property) {
var sortOrder = 1; var sortOrder = 1;
if (property[0] === "-") { if (property[0] === "-") {
sortOrder = -1; sortOrder = -1;
property = property.substr(1); property = property.substr(1);
} }
return function (a, b) { return function (a, b) {
var result = (a[property].toLowerCase() < b[property].toLowerCase()) ? -1 : (a[property].toLowerCase() > b[property].toLowerCase()) ? 1 : 0; var result = (a[property].toLowerCase() < b[property].toLowerCase()) ? -1 : (a[property].toLowerCase() > b[property].toLowerCase()) ? 1 : 0;
return result * sortOrder; return result * sortOrder;
} }
} }
}; };

View File

@ -1,5 +1,5 @@
/** /**
* ResponseHandler.js zarafa calender to ics im/exporter * ResponseHandler.js, Kopano calender to ics im/exporter
* *
* Author: Christoph Haas <christoph.h@sprinternet.at> * Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas * Copyright (C) 2012-2016 Christoph Haas
@ -34,52 +34,52 @@ Ext.namespace('Zarafa.plugins.calendarimporter.data');
* Calendar specific response handler. * Calendar specific response handler.
*/ */
Zarafa.plugins.calendarimporter.data.ResponseHandler = Ext.extend(Zarafa.core.data.AbstractResponseHandler, { Zarafa.plugins.calendarimporter.data.ResponseHandler = Ext.extend(Zarafa.core.data.AbstractResponseHandler, {
/** /**
* @cfg {Function} successCallback The function which * @cfg {Function} successCallback The function which
* will be called after success request. * will be called after success request.
*/ */
successCallback: null, successCallback: null,
/** /**
* Call the successCallback callback function. * Call the successCallback callback function.
* @param {Object} response Object contained the response data. * @param {Object} response Object contained the response data.
*/ */
doExport: function (response) { doExport: function (response) {
this.successCallback(response); this.successCallback(response);
}, },
/** /**
* Call the successCallback callback function. * Call the successCallback callback function.
* @param {Object} response Object contained the response data. * @param {Object} response Object contained the response data.
*/ */
doLoad: function (response) { doLoad: function (response) {
this.successCallback(response); this.successCallback(response);
}, },
/** /**
* Call the successCallback callback function. * Call the successCallback callback function.
* @param {Object} response Object contained the response data. * @param {Object} response Object contained the response data.
*/ */
doImport: function (response) { doImport: function (response) {
this.successCallback(response); this.successCallback(response);
}, },
/** /**
* Call the successCallback callback function. * Call the successCallback callback function.
* @param {Object} response Object contained the response data. * @param {Object} response Object contained the response data.
*/ */
doImportattachment: function (response) { doImportattachment: function (response) {
this.successCallback(response); this.successCallback(response);
}, },
/** /**
* In case exception happened on server, server will return * In case exception happened on server, server will return
* exception response with the code of exception. * exception response with the code of exception.
* @param {Object} response Object contained the response data. * @param {Object} response Object contained the response data.
*/ */
doError: function (response) { doError: function (response) {
alert("error response code: " + response.error.info.code); alert("error response code: " + response.error.info.code);
} }
}); });
Ext.reg('calendarimporter.calendarresponsehandler', Zarafa.plugins.calendarimporter.data.ResponseHandler); Ext.reg('calendarimporter.calendarresponsehandler', Zarafa.plugins.calendarimporter.data.ResponseHandler);

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/** /**
* ImportContentPanel.js zarafa calender to ics im/exporter * ImportContentPanel.js, Kopano calender to ics im/exporter
* *
* Author: Christoph Haas <christoph.h@sprinternet.at> * Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas * Copyright (C) 2012-2016 Christoph Haas
@ -19,13 +19,13 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
*/ */
/** /**
* ImportContentPanel * ImportContentPanel
* *
* Container for the importpanel. * Container for the importpanel.
*/ */
Ext.namespace("Zarafa.plugins.calendarimporter.dialogs"); Ext.namespace("Zarafa.plugins.calendarimporter.dialogs");
/** /**
* @class Zarafa.plugins.calendarimporter.dialogs.ImportContentPanel * @class Zarafa.plugins.calendarimporter.dialogs.ImportContentPanel
@ -36,31 +36,31 @@ Ext.namespace("Zarafa.plugins.calendarimporter.dialogs");
*/ */
Zarafa.plugins.calendarimporter.dialogs.ImportContentPanel = Ext.extend(Zarafa.core.ui.ContentPanel, { Zarafa.plugins.calendarimporter.dialogs.ImportContentPanel = Ext.extend(Zarafa.core.ui.ContentPanel, {
/** /**
* @constructor * @constructor
* @param config Configuration structure * @param config Configuration structure
*/ */
constructor : function(config) { constructor: function (config) {
config = config || {}; config = config || {};
Ext.applyIf(config, { Ext.applyIf(config, {
layout : 'fit', layout: 'fit',
title : _('Import Calendar File'), title: dgettext('plugin_calendarimporter', 'Import Calendar File'),
closeOnSave : true, closeOnSave: true,
width : 800, width: 800,
height : 700, height: 700,
//Add panel //Add panel
items : [ items: [
{ {
xtype : 'calendarimporter.importpanel', xtype: 'calendarimporter.importpanel',
filename : config.filename, filename: config.filename,
folder : config.folder folder: config.folder
} }
] ]
}); });
Zarafa.plugins.calendarimporter.dialogs.ImportContentPanel.superclass.constructor.call(this, config); Zarafa.plugins.calendarimporter.dialogs.ImportContentPanel.superclass.constructor.call(this, config);
} }
}); });
Ext.reg('calendarimporter.contentpanel' ,Zarafa.plugins.calendarimporter.dialogs.ImportContentPanel); Ext.reg('calendarimporter.contentpanel', Zarafa.plugins.calendarimporter.dialogs.ImportContentPanel);

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/** /**
* plugin.calendarimporter.js zarafa calender to ics im/exporter * plugin.calendarimporter.js, Kopano calender to ics im/exporter
* *
* Author: Christoph Haas <christoph.h@sprinternet.at> * Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas * Copyright (C) 2012-2016 Christoph Haas
@ -24,285 +24,291 @@ Ext.namespace("Zarafa.plugins.calendarimporter"); // Assign the right na
Zarafa.plugins.calendarimporter.ImportPlugin = Ext.extend(Zarafa.core.Plugin, { // create new import plugin Zarafa.plugins.calendarimporter.ImportPlugin = Ext.extend(Zarafa.core.Plugin, { // create new import plugin
/** /**
* @constructor * @constructor
* @param {Object} config Configuration object * @param {Object} config Configuration object
* *
*/ */
constructor: function (config) { constructor: function (config) {
config = config || {}; config = config || {};
Zarafa.plugins.calendarimporter.ImportPlugin.superclass.constructor.call(this, config); Zarafa.plugins.calendarimporter.ImportPlugin.superclass.constructor.call(this, config);
}, },
/** /**
* initialises insertion point for plugin * initialises insertion point for plugin
* @protected * @protected
*/ */
initPlugin: function () { initPlugin: function () {
Zarafa.plugins.calendarimporter.ImportPlugin.superclass.initPlugin.apply(this, arguments); Zarafa.plugins.calendarimporter.ImportPlugin.superclass.initPlugin.apply(this, arguments);
/* our panel */ /* our panel */
Zarafa.core.data.SharedComponentType.addProperty('plugins.calendarimporter.dialogs.importevents'); Zarafa.core.data.SharedComponentType.addProperty('plugins.calendarimporter.dialogs.importevents');
/* directly import received icals */ /* directly import received icals */
this.registerInsertionPoint('common.contextmenu.attachment.actions', this.createAttachmentImportButton); this.registerInsertionPoint('common.contextmenu.attachment.actions', this.createAttachmentImportButton);
/* add settings widget */ /* add settings widget */
this.registerInsertionPoint('context.settings.category.calendar', this.createSettingsWidget); this.registerInsertionPoint('context.settings.category.calendar', this.createSettingsWidget);
/* export a calendar entry via rightclick */ /* export a calendar entry via rightclick */
this.registerInsertionPoint('context.calendar.contextmenu.actions', this.createItemExportInsertionPoint, this); this.registerInsertionPoint('context.calendar.contextmenu.actions', this.createItemExportInsertionPoint, this);
/* ical sync stuff */ /* ical sync stuff */
if (container.getSettingsModel().get("zarafa/v1/plugins/calendarimporter/enable_sync") === true) { if (container.getSettingsModel().get("zarafa/v1/plugins/calendarimporter/enable_sync") === true) {
/* edit panel */ /* edit panel */
Zarafa.core.data.SharedComponentType.addProperty('plugins.calendarimporter.settings.dialogs.calsyncedit'); Zarafa.core.data.SharedComponentType.addProperty('plugins.calendarimporter.settings.dialogs.calsyncedit');
/* enable the settings widget */ /* enable the settings widget */
this.registerInsertionPoint('context.settings.category.calendar', this.createSettingsCalSyncWidget); this.registerInsertionPoint('context.settings.category.calendar', this.createSettingsCalSyncWidget);
} }
}, },
/** /**
* This method hooks to the contact context menu and allows users to export users to vcf. * This method hooks to the contact context menu and allows users to export users to vcf.
* *
* @param include * @param include
* @param btn * @param btn
* @returns {Object} * @returns {Object}
*/ */
createItemExportInsertionPoint: function (include, btn) { createItemExportInsertionPoint: function (include, btn) {
return { return {
text : dgettext('plugin_files', 'Export Event'), text: dgettext('plugin_calendarimporter', 'Export Event'),
handler: this.exportToICS.createDelegate(this, [btn]), handler: this.exportToICS.createDelegate(this, [btn]),
scope : this, scope: this,
iconCls: 'icon_calendarimporter_export' iconCls: 'icon_calendarimporter_export'
}; };
}, },
/** /**
* Generates a request to download the selected records as vCard. * Generates a request to download the selected records as vCard.
* @param {Ext.Button} btn * @param {Ext.Button} btn
*/ */
exportToICS: function (btn) { exportToICS: function (btn) {
if (btn.records.length == 0) { if (btn.records.length == 0) {
return; // skip if no records where given! return; // skip if no records where given!
} }
var recordIds = []; var recordIds = [];
for (var i = 0; i < btn.records.length; i++) { for (var i = 0; i < btn.records.length; i++) {
recordIds.push(btn.records[i].get("entryid")); recordIds.push(btn.records[i].get("entryid"));
} }
var responseHandler = new Zarafa.plugins.calendarimporter.data.ResponseHandler({ var responseHandler = new Zarafa.plugins.calendarimporter.data.ResponseHandler({
successCallback: Zarafa.plugins.calendarimporter.data.Actions.downloadICS, successCallback: Zarafa.plugins.calendarimporter.data.Actions.downloadICS,
scope : this scope: this
}); });
// request attachment preperation // Notify user
container.getRequest().singleRequest( // # TRANSLATORS: {0} will be replaced by the number of contacts that will be exported
'calendarmodule', container.getNotifier().notify('info', dgettext('plugin_contactimporter', 'Calendar Export'), String.format(dgettext('plugin_calendarimporter', 'Exporting {0} events. Please wait...'), recordIds.length));
'export',
{
storeid: btn.records[0].get("store_entryid"),
records: recordIds
},
responseHandler
);
},
/**
* Creates the button
*
* @return {Object} Configuration object for a {@link Ext.Button button}
*
*/
createSettingsWidget: function () {
return [{
xtype: 'calendarimporter.settingswidget'
}];
},
/** // request attachment preperation
* Creates the button container.getRequest().singleRequest(
* 'calendarmodule',
* @return {Object} Configuration object for a {@link Ext.Button button} 'export',
* {
*/ storeid: btn.records[0].get("store_entryid"),
createSettingsCalSyncWidget: function () { records: recordIds
return [{ },
xtype: 'calendarimporter.settingscalsyncwidget' responseHandler
}]; );
}, },
/** /**
* Insert import button in all attachment suggestions * Creates the button
*
* @return {Object} Configuration object for a {@link Ext.Button button}
*
*/
createSettingsWidget: function () {
return [{
xtype: 'calendarimporter.settingswidget'
}];
},
* @return {Object} Configuration object for a {@link Ext.Button button} /**
*/ * Creates the button
createAttachmentImportButton: function (include, btn) { *
return { * @return {Object} Configuration object for a {@link Ext.Button button}
text : _('Import to Calendar'), *
handler : this.getAttachmentFileName.createDelegate(this, [btn]), */
scope : this, createSettingsCalSyncWidget: function () {
iconCls : 'icon_calendarimporter_button', return [{
beforeShow: function (item, record) { xtype: 'calendarimporter.settingscalsyncwidget'
var extension = record.data.name.split('.').pop().toLowerCase(); }];
},
if (record.data.filetype == "text/calendar" || extension == "ics" || extension == "ifb" || extension == "ical" || extension == "ifbf") { /**
item.setVisible(true); * Insert import button in all attachment suggestions
} else {
item.setVisible(false);
}
}
};
},
/** * @return {Object} Configuration object for a {@link Ext.Button button}
* Callback for getAttachmentFileName */
*/ createAttachmentImportButton: function (include, btn) {
gotAttachmentFileName: function (response) { return {
if (response.status == true) { text: dgettext('plugin_calendarimporter', 'Import to Calendar'),
this.scope.openImportDialog(response.tmpname); handler: this.getAttachmentFileName.createDelegate(this, [btn]),
} else { scope: this,
Zarafa.common.dialogs.MessageBox.show({ iconCls: 'icon_calendarimporter_button',
title : _('Error'), beforeShow: function (item, record) {
msg : _(response["message"]), var extension = record.data.name.split('.').pop().toLowerCase();
icon : Zarafa.common.dialogs.MessageBox.ERROR,
buttons: Zarafa.common.dialogs.MessageBox.OK
});
}
},
/** if (record.data.filetype == "text/calendar" || extension == "ics" || extension == "ifb" || extension == "ical" || extension == "ifbf") {
* Clickhandler for the button item.setVisible(true);
*/ } else {
getAttachmentFileName: function (btn, callback) { item.setVisible(false);
Zarafa.common.dialogs.MessageBox.show({ }
title : 'Please wait', }
msg : 'Loading attachment...', };
progressText: 'Initializing...', },
width : 300,
progress : true,
closable : false
});
// progress bar... ;) /**
var f = function (v) { * Callback for getAttachmentFileName
return function () { */
if (v == 100) { gotAttachmentFileName: function (response) {
Zarafa.common.dialogs.MessageBox.hide(); if (response.status == true) {
} else { this.scope.openImportDialog(response.tmpname);
Zarafa.common.dialogs.MessageBox.updateProgress(v / 100, Math.round(v) + '% loaded'); } else {
} Zarafa.common.dialogs.MessageBox.show({
}; title: dgettext('plugin_calendarimporter', 'Error'),
}; msg: response["message"],
icon: Zarafa.common.dialogs.MessageBox.ERROR,
buttons: Zarafa.common.dialogs.MessageBox.OK
});
}
},
for (var i = 1; i < 101; i++) { /**
setTimeout(f(i), 20 * i); * Clickhandler for the button
} */
getAttachmentFileName: function (btn, callback) {
Zarafa.common.dialogs.MessageBox.show({
title: dgettext('plugin_calendarimporter', 'Please wait'),
msg: dgettext('plugin_calendarimporter', 'Loading attachment...'),
progressText: dgettext('plugin_calendarimporter', 'Initializing...'),
width: 300,
progress: true,
closable: false
});
/* store the attachment to a temporary folder and prepare it for uploading */ // progress bar... ;)
var attachmentRecord = btn.records; var f = function (v) {
var attachmentStore = attachmentRecord.store; return function () {
if (v == 100) {
Zarafa.common.dialogs.MessageBox.hide();
} else {
// # TRANSLATORS: {0} will be replaced by the percentage value (0-100)
Zarafa.common.dialogs.MessageBox.updateProgress(v / 100, String.format(dgettext('plugin_calendarimporter', '{0}% loaded'), Math.round(v)));
}
};
};
var store = attachmentStore.getParentRecord().get('store_entryid'); for (var i = 1; i < 101; i++) {
var entryid = attachmentStore.getAttachmentParentRecordEntryId(); setTimeout(f(i), 20 * i);
var attachNum = new Array(1); }
if (attachmentRecord.get('attach_num') != -1) {
attachNum[0] = attachmentRecord.get('attach_num');
} else {
attachNum[0] = attachmentRecord.get('tmpname');
}
var dialog_attachments = attachmentStore.getId();
var filename = attachmentRecord.data.name;
var responseHandler = new Zarafa.plugins.calendarimporter.data.ResponseHandler({ /* store the attachment to a temporary folder and prepare it for uploading */
successCallback: this.gotAttachmentFileName, var attachmentRecord = btn.records;
scope : this var attachmentStore = attachmentRecord.store;
});
// request attachment preperation var store = attachmentStore.getParentRecord().get('store_entryid');
container.getRequest().singleRequest( var entryid = attachmentStore.getAttachmentParentRecordEntryId();
'calendarmodule', var attachNum = new Array(1);
'importattachment', if (attachmentRecord.get('attach_num') != -1) {
{ attachNum[0] = attachmentRecord.get('attach_num');
entryid : entryid, } else {
store : store, attachNum[0] = attachmentRecord.get('tmpname');
attachNum : attachNum, }
dialog_attachments: dialog_attachments, var dialog_attachments = attachmentStore.getId();
filename : filename var filename = attachmentRecord.data.name;
},
responseHandler
);
},
/** var responseHandler = new Zarafa.plugins.calendarimporter.data.ResponseHandler({
* Open the import dialog. successCallback: this.gotAttachmentFileName,
* @param {String} filename scope: this
*/ });
openImportDialog: function (filename) {
var componentType = Zarafa.core.data.SharedComponentType['plugins.calendarimporter.dialogs.importevents'];
var config = {
filename: filename,
modal : true
};
Zarafa.core.data.UIFactory.openLayerComponent(componentType, undefined, config); // request attachment preperation
}, container.getRequest().singleRequest(
'calendarmodule',
'importattachment',
{
entryid: entryid,
store: store,
attachNum: attachNum,
dialog_attachments: dialog_attachments,
filename: filename
},
responseHandler
);
},
/** /**
* Bid for the type of shared component * Open the import dialog.
* and the given record. * @param {String} filename
* This will bid on calendar.dialogs.importevents */
* @param {Zarafa.core.data.SharedComponentType} type Type of component a context can bid for. openImportDialog: function (filename) {
* @param {Ext.data.Record} record Optionally passed record. var componentType = Zarafa.core.data.SharedComponentType['plugins.calendarimporter.dialogs.importevents'];
* @return {Number} The bid for the shared component var config = {
*/ filename: filename,
bidSharedComponent: function (type, record) { modal: true
var bid = -1; };
switch (type) {
case Zarafa.core.data.SharedComponentType['plugins.calendarimporter.dialogs.importevents']:
bid = 2;
break;
case Zarafa.core.data.SharedComponentType['plugins.calendarimporter.settings.dialogs.calsyncedit']:
bid = 2;
break;
case Zarafa.core.data.SharedComponentType['common.contextmenu']:
if (record instanceof Zarafa.core.data.MAPIRecord) {
if (record.get('object_type') == Zarafa.core.mapi.ObjectType.MAPI_FOLDER && record.get('container_class') == "IPF.Appointment") {
bid = 2;
}
}
break;
}
return bid;
},
/** Zarafa.core.data.UIFactory.openLayerComponent(componentType, undefined, config);
* Will return the reference to the shared component. },
* Based on the type of component requested a component is returned.
* @param {Zarafa.core.data.SharedComponentType} type Type of component a context can bid for.
* @param {Ext.data.Record} record Optionally passed record.
* @return {Ext.Component} Component
*/
getSharedComponent: function (type, record) {
var component;
switch (type) {
case Zarafa.core.data.SharedComponentType['plugins.calendarimporter.dialogs.importevents']:
component = Zarafa.plugins.calendarimporter.dialogs.ImportContentPanel;
break;
case Zarafa.core.data.SharedComponentType['plugins.calendarimporter.settings.dialogs.calsyncedit']:
component = Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditContentPanel;
break;
case Zarafa.core.data.SharedComponentType['common.contextmenu']:
component = Zarafa.plugins.calendarimporter.ui.ContextMenu;
break;
}
return component; /**
} * Bid for the type of shared component
* and the given record.
* This will bid on calendar.dialogs.importevents
* @param {Zarafa.core.data.SharedComponentType} type Type of component a context can bid for.
* @param {Ext.data.Record} record Optionally passed record.
* @return {Number} The bid for the shared component
*/
bidSharedComponent: function (type, record) {
var bid = -1;
switch (type) {
case Zarafa.core.data.SharedComponentType['plugins.calendarimporter.dialogs.importevents']:
bid = 2;
break;
case Zarafa.core.data.SharedComponentType['plugins.calendarimporter.settings.dialogs.calsyncedit']:
bid = 2;
break;
case Zarafa.core.data.SharedComponentType['common.contextmenu']:
if (record instanceof Zarafa.core.data.MAPIRecord) {
if (record.get('object_type') == Zarafa.core.mapi.ObjectType.MAPI_FOLDER && record.get('container_class') == "IPF.Appointment") {
bid = 2;
}
}
break;
}
return bid;
},
/**
* Will return the reference to the shared component.
* Based on the type of component requested a component is returned.
* @param {Zarafa.core.data.SharedComponentType} type Type of component a context can bid for.
* @param {Ext.data.Record} record Optionally passed record.
* @return {Ext.Component} Component
*/
getSharedComponent: function (type, record) {
var component;
switch (type) {
case Zarafa.core.data.SharedComponentType['plugins.calendarimporter.dialogs.importevents']:
component = Zarafa.plugins.calendarimporter.dialogs.ImportContentPanel;
break;
case Zarafa.core.data.SharedComponentType['plugins.calendarimporter.settings.dialogs.calsyncedit']:
component = Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditContentPanel;
break;
case Zarafa.core.data.SharedComponentType['common.contextmenu']:
component = Zarafa.plugins.calendarimporter.ui.ContextMenu;
break;
}
return component;
}
}); });
@ -310,10 +316,10 @@ Zarafa.plugins.calendarimporter.ImportPlugin = Ext.extend(Zarafa.core.Plugin, {
* STARTUP * STARTUP
*############################################################################################################################*/ *############################################################################################################################*/
Zarafa.onReady(function () { Zarafa.onReady(function () {
container.registerPlugin(new Zarafa.core.PluginMetaData({ container.registerPlugin(new Zarafa.core.PluginMetaData({
name : 'calendarimporter', name: 'calendarimporter',
displayName : _('Calendarimporter Plugin'), displayName: dgettext('plugin_calendarimporter', 'Calendarimporter Plugin'),
about : Zarafa.plugins.calendarimporter.ABOUT, about: Zarafa.plugins.calendarimporter.ABOUT,
pluginConstructor: Zarafa.plugins.calendarimporter.ImportPlugin pluginConstructor: Zarafa.plugins.calendarimporter.ImportPlugin
})); }));
}); });

View File

@ -1,3 +1,25 @@
/**
* SettingsCalSyncWidget.js, Kopano calender to ics im/exporter
*
* Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
Ext.namespace('Zarafa.plugins.calendarimporter.settings'); Ext.namespace('Zarafa.plugins.calendarimporter.settings');
/** /**
@ -7,108 +29,108 @@ Ext.namespace('Zarafa.plugins.calendarimporter.settings');
* *
*/ */
Zarafa.plugins.calendarimporter.settings.SettingsCalSyncWidget = Ext.extend(Zarafa.settings.ui.SettingsWidget, { Zarafa.plugins.calendarimporter.settings.SettingsCalSyncWidget = Ext.extend(Zarafa.settings.ui.SettingsWidget, {
/** /**
* @cfg {Zarafa.settings.SettingsContext} settingsContext * @cfg {Zarafa.settings.SettingsContext} settingsContext
*/ */
settingsContext : undefined, settingsContext: undefined,
/** /**
* @constructor * @constructor
* @param {Object} config Configuration object * @param {Object} config Configuration object
*/ */
constructor : function(config) { constructor: function (config) {
config = config || {}; config = config || {};
var store = new Ext.data.JsonStore({
fields : [
{ name : 'id', type : 'int' },
{ name : 'icsurl' },
{ name : 'user' },
{ name : 'pass' },
{ name : 'intervall', type : 'int' },
{ name : 'calendar' },
{ name : 'calendarname' },
{ name : 'lastsync' }
],
sortInfo : {
field : 'id',
direction : 'ASC'
},
autoDestroy : true
});
Ext.applyIf(config, { var store = new Ext.data.JsonStore({
height : 400, fields: [
title : _('Calendar Sync settings'), {name: 'id', type: 'int'},
xtype : 'calendarimporter.settingscalsyncwidget', {name: 'icsurl'},
layout : { {name: 'user'},
// override from SettingsWidget {name: 'pass'},
type : 'fit' {name: 'intervall', type: 'int'},
}, {name: 'calendar'},
items : [{ {name: 'calendarname'},
xtype : 'calendarimporter.calsyncpanel', {name: 'lastsync'}
store : store, ],
ref : 'calsyncPanel' sortInfo: {
}] field: 'id',
}); direction: 'ASC'
},
autoDestroy: true
});
Zarafa.plugins.calendarimporter.settings.SettingsCalSyncWidget.superclass.constructor.call(this, config); Ext.applyIf(config, {
}, height: 400,
title: dgettext('plugin_calendarimporter', 'Calendar Sync settings'),
/** xtype: 'calendarimporter.settingscalsyncwidget',
* Called by the {@link Zarafa.settings.ui.SettingsCategory Category} when layout: {
* it has been called with {@link zarafa.settings.ui.SettingsCategory#update}. // override from SettingsWidget
* This is used to load the latest version of the settings from the type: 'fit'
* {@link Zarafa.settings.SettingsModel} into the UI of this category. },
* @param {Zarafa.settings.SettingsModel} settingsModel The settings to load items: [{
*/ xtype: 'calendarimporter.calsyncpanel',
update : function(settingsModel) { store: store,
this.model = settingsModel; ref: 'calsyncPanel'
}]
});
// Convert the signatures into Store data Zarafa.plugins.calendarimporter.settings.SettingsCalSyncWidget.superclass.constructor.call(this, config);
var icslinks = settingsModel.get('zarafa/v1/contexts/calendar/icssync', true); },
var syncArray = [];
for (var key in icslinks) {
if(icslinks.hasOwnProperty(key)) { // skip inherited props
syncArray.push(Ext.apply({}, icslinks[key], {id: key}));
}
}
// Load all icslinks into the GridPanel /**
var store = this.calsyncPanel.calsyncGrid.getStore(); * Called by the {@link Zarafa.settings.ui.SettingsCategory Category} when
store.loadData(syncArray); * it has been called with {@link zarafa.settings.ui.SettingsCategory#update}.
}, * This is used to load the latest version of the settings from the
* {@link Zarafa.settings.SettingsModel} into the UI of this category.
* @param {Zarafa.settings.SettingsModel} settingsModel The settings to load
*/
update: function (settingsModel) {
this.model = settingsModel;
/** // Convert the signatures into Store data
* Called by the {@link Zarafa.settings.ui.SettingsCategory Category} when var icslinks = settingsModel.get('zarafa/v1/contexts/calendar/icssync', true);
* it has been called with {@link zarafa.settings.ui.SettingsCategory#updateSettings}. var syncArray = [];
* This is used to update the settings from the UI into the {@link Zarafa.settings.SettingsModel settings model}. for (var key in icslinks) {
* @param {Zarafa.settings.SettingsModel} settingsModel The settings to update if (icslinks.hasOwnProperty(key)) { // skip inherited props
*/ syncArray.push(Ext.apply({}, icslinks[key], {id: key}));
updateSettings : function(settingsModel) { }
settingsModel.beginEdit(); }
// Start reading the Grid store and convert the contents back into // Load all icslinks into the GridPanel
// an object which can be pushed to the settings. var store = this.calsyncPanel.calsyncGrid.getStore();
var icslinks = this.calsyncPanel.calsyncGrid.getStore().getRange(); store.loadData(syncArray);
var icslinkData = {}; },
for (var i = 0, len = icslinks.length; i < len; i++) {
var icslink = icslinks[i];
icslinkData[icslink.get('id')] = { /**
'icsurl' : icslink.get('icsurl'), * Called by the {@link Zarafa.settings.ui.SettingsCategory Category} when
'intervall' : icslink.get('intervall'), * it has been called with {@link zarafa.settings.ui.SettingsCategory#updateSettings}.
'user' : icslink.get('user'), * This is used to update the settings from the UI into the {@link Zarafa.settings.SettingsModel settings model}.
'pass' : icslink.get('pass'), * @param {Zarafa.settings.SettingsModel} settingsModel The settings to update
'lastsync' : icslink.get('lastsync'), */
'calendar' : icslink.get('calendar'), updateSettings: function (settingsModel) {
'calendarname' : Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(icslink.get('calendar')).display_name settingsModel.beginEdit();
};
}
settingsModel.set('zarafa/v1/contexts/calendar/icssync', icslinkData);
settingsModel.endEdit(); // Start reading the Grid store and convert the contents back into
} // an object which can be pushed to the settings.
var icslinks = this.calsyncPanel.calsyncGrid.getStore().getRange();
var icslinkData = {};
for (var i = 0, len = icslinks.length; i < len; i++) {
var icslink = icslinks[i];
icslinkData[icslink.get('id')] = {
'icsurl': icslink.get('icsurl'),
'intervall': icslink.get('intervall'),
'user': icslink.get('user'),
'pass': icslink.get('pass'),
'lastsync': icslink.get('lastsync'),
'calendar': icslink.get('calendar'),
'calendarname': Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(icslink.get('calendar')).display_name
};
}
settingsModel.set('zarafa/v1/contexts/calendar/icssync', icslinkData);
settingsModel.endEdit();
}
}); });
Ext.reg('calendarimporter.settingscalsyncwidget', Zarafa.plugins.calendarimporter.settings.SettingsCalSyncWidget); Ext.reg('calendarimporter.settingscalsyncwidget', Zarafa.plugins.calendarimporter.settings.SettingsCalSyncWidget);

View File

@ -1,3 +1,25 @@
/**
* SettingsWidget.js, Kopano calender to ics im/exporter
*
* Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
Ext.namespace('Zarafa.plugins.calendarimporter.settings'); Ext.namespace('Zarafa.plugins.calendarimporter.settings');
/** /**
@ -7,110 +29,109 @@ Ext.namespace('Zarafa.plugins.calendarimporter.settings');
* *
*/ */
Zarafa.plugins.calendarimporter.settings.SettingsWidget = Ext.extend(Zarafa.settings.ui.SettingsWidget, { Zarafa.plugins.calendarimporter.settings.SettingsWidget = Ext.extend(Zarafa.settings.ui.SettingsWidget, {
/** /**
* @cfg {Zarafa.settings.SettingsContext} settingsContext * @cfg {Zarafa.settings.SettingsContext} settingsContext
*/ */
settingsContext : undefined, settingsContext: undefined,
/** /**
* @constructor * @constructor
* @param {Object} config Configuration object * @param {Object} config Configuration object
*/ */
constructor : function(config) constructor: function (config) {
{ config = config || {};
config = config || {};
Ext.applyIf(config, { Ext.applyIf(config, {
title : _('Calendar Import/Export plugin settings'), title: dgettext('plugin_calendarimporter', 'Calendar Import/Export plugin settings'),
xtype : 'calendarimporter.settingswidget', xtype: 'calendarimporter.settingswidget',
items : [ items: [
{ {
xtype : 'checkbox', xtype: 'checkbox',
name : 'zarafa/v1/plugins/calendarimporter/enable_sync', name: 'zarafa/v1/plugins/calendarimporter/enable_sync',
ref : 'enableSync', ref: 'enableSync',
fieldLabel : 'Enable ical sync', fieldLabel: dgettext('plugin_calendarimporter', 'Enable ical sync'),
lazyInit : false lazyInit: false
}, },
this.createSelectBox(), this.createSelectBox(),
this.createTimezoneBox() this.createTimezoneBox()
] ]
}); });
Zarafa.plugins.calendarimporter.settings.SettingsWidget.superclass.constructor.call(this, config); Zarafa.plugins.calendarimporter.settings.SettingsWidget.superclass.constructor.call(this, config);
}, },
createSelectBox: function() {
var myStore = Zarafa.plugins.calendarimporter.data.Actions.getAllCalendarFolders(true);
return { createSelectBox: function () {
xtype: "selectbox", var myStore = Zarafa.plugins.calendarimporter.data.Actions.getAllCalendarFolders(true);
ref : 'defaultCalendar',
editable: false, return {
name: "zarafa/v1/plugins/calendarimporter/default_calendar", xtype: "selectbox",
ref: 'defaultCalendar',
editable: false,
name: "zarafa/v1/plugins/calendarimporter/default_calendar",
value: Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByName(container.getSettingsModel().get("zarafa/v1/plugins/calendarimporter/default_calendar")).entryid, value: Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByName(container.getSettingsModel().get("zarafa/v1/plugins/calendarimporter/default_calendar")).entryid,
width: 100, width: 100,
fieldLabel: "Default calender", fieldLabel: dgettext('plugin_calendarimporter', 'Default calender'),
store: myStore, store: myStore,
mode: 'local', mode: 'local',
labelSeperator: ":", labelSeperator: ":",
border: false, border: false,
anchor: "100%", anchor: "100%",
scope: this, scope: this,
allowBlank: false allowBlank: false
} }
}, },
createTimezoneBox: function() {
return {
xtype: "selectbox",
ref : 'defaultTimezone',
editable: false,
name: "zarafa/v1/plugins/calendarimporter/default_timezone",
value: Zarafa.plugins.calendarimporter.data.Timezones.unMap(container.getSettingsModel().get("zarafa/v1/plugins/calendarimporter/default_timezone")),
width: 100,
fieldLabel: "Default timezone",
store: Zarafa.plugins.calendarimporter.data.Timezones.store,
labelSeperator: ":",
mode: 'local',
border: false,
anchor: "100%",
scope: this,
allowBlank: false
}
},
/**
* Called by the {@link Zarafa.settings.ui.SettingsCategory Category} when
* it has been called with {@link zarafa.settings.ui.SettingsCategory#update}.
* This is used to load the latest version of the settings from the
* {@link Zarafa.settings.SettingsModel} into the UI of this category.
* @param {Zarafa.settings.SettingsModel} settingsModel The settings to load
*/
update : function(settingsModel) {
this.enableSync.setValue(settingsModel.get(this.enableSync.name));
this.defaultCalendar.setValue(Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByName(settingsModel.get(this.defaultCalendar.name)).entryid);
this.defaultTimezone.setValue(settingsModel.get(this.defaultTimezone.name));
},
/** createTimezoneBox: function () {
* Called by the {@link Zarafa.settings.ui.SettingsCategory Category} when return {
* it has been called with {@link zarafa.settings.ui.SettingsCategory#updateSettings}. xtype: "selectbox",
* This is used to update the settings from the UI into the {@link Zarafa.settings.SettingsModel settings model}. ref: 'defaultTimezone',
* @param {Zarafa.settings.SettingsModel} settingsModel The settings to update editable: false,
*/ name: "zarafa/v1/plugins/calendarimporter/default_timezone",
updateSettings : function(settingsModel) { value: Zarafa.plugins.calendarimporter.data.Timezones.unMap(container.getSettingsModel().get("zarafa/v1/plugins/calendarimporter/default_timezone")),
width: 100,
fieldLabel: dgettext('plugin_calendarimporter', 'Default timezone'),
store: Zarafa.plugins.calendarimporter.data.Timezones.store,
labelSeperator: ":",
mode: 'local',
border: false,
anchor: "100%",
scope: this,
allowBlank: false
}
},
/**
* Called by the {@link Zarafa.settings.ui.SettingsCategory Category} when
* it has been called with {@link zarafa.settings.ui.SettingsCategory#update}.
* This is used to load the latest version of the settings from the
* {@link Zarafa.settings.SettingsModel} into the UI of this category.
* @param {Zarafa.settings.SettingsModel} settingsModel The settings to load
*/
update: function (settingsModel) {
this.enableSync.setValue(settingsModel.get(this.enableSync.name));
this.defaultCalendar.setValue(Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByName(settingsModel.get(this.defaultCalendar.name)).entryid);
this.defaultTimezone.setValue(settingsModel.get(this.defaultTimezone.name));
},
/**
* Called by the {@link Zarafa.settings.ui.SettingsCategory Category} when
* it has been called with {@link zarafa.settings.ui.SettingsCategory#updateSettings}.
* This is used to update the settings from the UI into the {@link Zarafa.settings.SettingsModel settings model}.
* @param {Zarafa.settings.SettingsModel} settingsModel The settings to update
*/
updateSettings: function (settingsModel) {
// check if the user changed a value // check if the user changed a value
var changed = false; var changed = false;
if(settingsModel.get(this.enableSync.name) != this.enableSync.getValue()) { if (settingsModel.get(this.enableSync.name) != this.enableSync.getValue()) {
changed = true; changed = true;
} else if(settingsModel.get(this.defaultCalendar.name) != Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(this.defaultCalendar.getValue()).display_name) { } else if (settingsModel.get(this.defaultCalendar.name) != Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(this.defaultCalendar.getValue()).display_name) {
changed = true; changed = true;
} else if(settingsModel.get(this.defaultTimezone.name) != this.defaultTimezone.getValue()) { } else if (settingsModel.get(this.defaultTimezone.name) != this.defaultTimezone.getValue()) {
changed = true; changed = true;
} }
if(changed) { if (changed) {
// Really save changes // Really save changes
settingsModel.set(this.enableSync.name, this.enableSync.getValue()); settingsModel.set(this.enableSync.name, this.enableSync.getValue());
settingsModel.set(this.defaultCalendar.name, Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(this.defaultCalendar.getValue()).display_name); // store name settingsModel.set(this.defaultCalendar.name, Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(this.defaultCalendar.getValue()).display_name); // store name
@ -118,7 +139,7 @@ Zarafa.plugins.calendarimporter.settings.SettingsWidget = Ext.extend(Zarafa.sett
this.onUpdateSettings(); this.onUpdateSettings();
} }
}, },
/** /**
* Called after the {@link Zarafa.settings.SettingsModel} fires the {@link Zarafa.settings.SettingsModel#save save} * Called after the {@link Zarafa.settings.SettingsModel} fires the {@link Zarafa.settings.SettingsModel#save save}
@ -126,8 +147,7 @@ Zarafa.plugins.calendarimporter.settings.SettingsWidget = Ext.extend(Zarafa.sett
* settings which were saved to the server. * settings which were saved to the server.
* @private * @private
*/ */
onUpdateSettings : function() onUpdateSettings: function () {
{
var message = _('Your WebApp needs to be reloaded to make the changes visible!'); var message = _('Your WebApp needs to be reloaded to make the changes visible!');
message += '<br/><br/>'; message += '<br/><br/>';
message += _('WebApp will automatically restart in order for these changes to take effect'); message += _('WebApp will automatically restart in order for these changes to take effect');
@ -135,17 +155,17 @@ Zarafa.plugins.calendarimporter.settings.SettingsWidget = Ext.extend(Zarafa.sett
Zarafa.common.dialogs.MessageBox.addCustomButtons({ Zarafa.common.dialogs.MessageBox.addCustomButtons({
title: _('Restart WebApp'), title: _('Restart WebApp'),
msg : message, msg: message,
icon: Ext.MessageBox.QUESTION, icon: Ext.MessageBox.QUESTION,
fn : this.restartWebapp, fn: this.restartWebapp,
customButton : [{ customButton: [{
text : _('Restart'), text: _('Restart'),
name : 'restart' name: 'restart'
}, { }, {
text : _('Cancel'), text: _('Cancel'),
name : 'cancel' name: 'cancel'
}], }],
scope : this scope: this
}); });
}, },
@ -156,8 +176,7 @@ Zarafa.plugins.calendarimporter.settings.SettingsWidget = Ext.extend(Zarafa.sett
* @param {String} button The button which user pressed. * @param {String} button The button which user pressed.
* @private * @private
*/ */
restartWebapp : function(button) restartWebapp: function (button) {
{
if (button === 'restart') { if (button === 'restart') {
var contextModel = this.ownerCt.settingsContext.getModel(); var contextModel = this.ownerCt.settingsContext.getModel();
var realModel = contextModel.getRealSettingsModel(); var realModel = contextModel.getRealSettingsModel();
@ -165,7 +184,7 @@ Zarafa.plugins.calendarimporter.settings.SettingsWidget = Ext.extend(Zarafa.sett
realModel.save(); realModel.save();
this.loadMask = new Zarafa.common.ui.LoadMask(Ext.getBody(), { this.loadMask = new Zarafa.common.ui.LoadMask(Ext.getBody(), {
msg : '<b>' + _('Webapp is reloading, Please wait.') + '</b>' msg: '<b>' + _('Webapp is reloading, Please wait.') + '</b>'
}); });
this.loadMask.show(); this.loadMask.show();
@ -183,8 +202,7 @@ Zarafa.plugins.calendarimporter.settings.SettingsWidget = Ext.extend(Zarafa.sett
* settings which were saved to the server. * settings which were saved to the server.
* @private * @private
*/ */
onSettingsSave : function(model, parameters) onSettingsSave: function (model, parameters) {
{
this.mun(model, 'save', this.onSettingsSave, this); this.mun(model, 'save', this.onSettingsSave, this);
Zarafa.core.Util.reloadWebapp(); Zarafa.core.Util.reloadWebapp();
}, },
@ -200,8 +218,7 @@ Zarafa.plugins.calendarimporter.settings.SettingsWidget = Ext.extend(Zarafa.sett
* @param {Object} response The response object as received from the PHP-side * @param {Object} response The response object as received from the PHP-side
* @private * @private
*/ */
onSettingsException : function(model, type, action, options, response) onSettingsException: function (model, type, action, options, response) {
{
this.loadMask.hide(); this.loadMask.hide();
// Remove event handlers // Remove event handlers

View File

@ -1,3 +1,25 @@
/**
* CalSyncEditContentPanel.js, Kopano calender to ics im/exporter
*
* Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
Ext.namespace('Zarafa.plugins.calendarimporter.settings.dialogs'); Ext.namespace('Zarafa.plugins.calendarimporter.settings.dialogs');
/** /**
@ -8,31 +30,31 @@ Ext.namespace('Zarafa.plugins.calendarimporter.settings.dialogs');
* {@link Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditContentPanel CalSyncEditContentPanel} will be used to edit ics sync entries. * {@link Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditContentPanel CalSyncEditContentPanel} will be used to edit ics sync entries.
*/ */
Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditContentPanel = Ext.extend(Zarafa.core.ui.ContentPanel, { Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditContentPanel = Ext.extend(Zarafa.core.ui.ContentPanel, {
/** /**
* @constructor * @constructor
* @param config Configuration structure * @param config Configuration structure
*/ */
constructor : function(config) { constructor: function (config) {
config = config || {}; config = config || {};
// Add in some standard configuration data. // Add in some standard configuration data.
Ext.applyIf(config, { Ext.applyIf(config, {
// Override from Ext.Component // Override from Ext.Component
xtype : 'calendarimporter.calsynceditcontentpanel', xtype: 'calendarimporter.calsynceditcontentpanel',
layout : 'fit', layout: 'fit',
model : true, model: true,
autoSave : false, autoSave: false,
width : 400, width: 400,
height : 400, height: 400,
title : _('ICAL Sync'), title: dgettext('plugin_calendarimporter', 'ICAL Sync'),
items : [{ items: [{
xtype : 'calendarimporter.calsynceditpanel', xtype: 'calendarimporter.calsynceditpanel',
item : config.item item: config.item
}] }]
}); });
Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditContentPanel.superclass.constructor.call(this, config); Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditContentPanel.superclass.constructor.call(this, config);
} }
}); });
Ext.reg('calendarimporter.calsynceditcontentpanel', Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditContentPanel); Ext.reg('calendarimporter.calsynceditcontentpanel', Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditContentPanel);

View File

@ -1,3 +1,25 @@
/**
* CalSyncEditPanel.js, Kopano calender to ics im/exporter
*
* Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
Ext.namespace('Zarafa.plugins.calendarimporter.settings.dialogs'); Ext.namespace('Zarafa.plugins.calendarimporter.settings.dialogs');
/** /**
@ -8,195 +30,194 @@ Ext.namespace('Zarafa.plugins.calendarimporter.settings.dialogs');
* Will generate UI for {@link Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditPanel CalSyncEditPanel}. * Will generate UI for {@link Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditPanel CalSyncEditPanel}.
*/ */
Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditPanel = Ext.extend(Ext.form.FormPanel, { Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditPanel = Ext.extend(Ext.form.FormPanel, {
/**
* the id of the currently edited item
*/
currentItem : undefined,
/**
* @constructor
* @param config Configuration structure
*/
constructor : function(config) {
config = config || {};
if(config.item) /**
this.currentItem = config.item; * the id of the currently edited item
*/
currentItem: undefined,
Ext.applyIf(config, { /**
// Override from Ext.Component * @constructor
xtype : 'calendarimporter.calsynceditpanel', * @param config Configuration structure
labelAlign : 'top', */
defaultType: 'textfield', constructor: function (config) {
items : this.createPanelItems(config), config = config || {};
buttons: [{
text: _('Save'),
handler: this.doSave,
scope: this
},
{
text: _('Cancel'),
handler: this.doClose,
scope: this
}]
});
Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditPanel.superclass.constructor.call(this, config); if (config.item)
}, this.currentItem = config.item;
/**
* close the dialog
*/
doClose : function() {
this.dialog.close();
},
/**
* save the data to the store
*/
doSave : function() {
var store = this.dialog.store;
var id = 0;
var record = undefined;
if(!this.currentItem) { Ext.applyIf(config, {
record = new store.recordType({ // Override from Ext.Component
id: this.hashCode(this.icsurl.getValue()), xtype: 'calendarimporter.calsynceditpanel',
icsurl: this.icsurl.getValue(), labelAlign: 'top',
intervall: this.intervall.getValue(), defaultType: 'textfield',
user: this.user.getValue(), items: this.createPanelItems(config),
pass: Ext.util.base64.encode(this.pass.getValue()), buttons: [{
calendar: this.calendar.getValue(), text: _('Save'),
calendarname : Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(this.calendar.getValue()).display_name, handler: this.doSave,
lastsync: "never" scope: this
}); },
} {
text: _('Cancel'),
if(this.icsurl.isValid()) { handler: this.doClose,
if(record) { scope: this
store.add(record); }]
} else { });
this.currentItem.set('icsurl', this.icsurl.getValue());
this.currentItem.set('intervall', this.intervall.getValue()); Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditPanel.superclass.constructor.call(this, config);
this.currentItem.set('user', this.user.getValue()); },
this.currentItem.set('pass', Ext.util.base64.encode(this.pass.getValue()));
this.currentItem.set('calendar', this.calendar.getValue()); /**
* close the dialog
*/
doClose: function () {
this.dialog.close();
},
/**
* save the data to the store
*/
doSave: function () {
var store = this.dialog.store;
var id = 0;
var record = undefined;
if (!this.currentItem) {
record = new store.recordType({
id: this.hashCode(this.icsurl.getValue()),
icsurl: this.icsurl.getValue(),
intervall: this.intervall.getValue(),
user: this.user.getValue(),
pass: Ext.util.base64.encode(this.pass.getValue()),
calendar: this.calendar.getValue(),
calendarname: Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(this.calendar.getValue()).display_name,
lastsync: "never"
});
}
if (this.icsurl.isValid()) {
if (record) {
store.add(record);
} else {
this.currentItem.set('icsurl', this.icsurl.getValue());
this.currentItem.set('intervall', this.intervall.getValue());
this.currentItem.set('user', this.user.getValue());
this.currentItem.set('pass', Ext.util.base64.encode(this.pass.getValue()));
this.currentItem.set('calendar', this.calendar.getValue());
this.currentItem.set('calendarname', Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(this.calendar.getValue()).display_name); this.currentItem.set('calendarname', Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(this.calendar.getValue()).display_name);
} }
this.dialog.close(); this.dialog.close();
} }
}, },
/** /**
* Function will create panel items for {@link Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditPanel CalSyncEditPanel} * Function will create panel items for {@link Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditPanel CalSyncEditPanel}
* @return {Array} array of items that should be added to panel. * @return {Array} array of items that should be added to panel.
* @private * @private
*/ */
createPanelItems : function(config) createPanelItems: function (config) {
{ var icsurl = "";
var icsurl = ""; var intervall = "15";
var intervall = "15"; var user = "";
var user = ""; var pass = "";
var pass = "";
var calendarname = ""; var calendarname = "";
var calendar = Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByName(container.getSettingsModel().get("zarafa/v1/plugins/calendarimporter/default_calendar")).entryid; var calendar = Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByName(container.getSettingsModel().get("zarafa/v1/plugins/calendarimporter/default_calendar")).entryid;
var myStore = Zarafa.plugins.calendarimporter.data.Actions.getAllCalendarFolders(true); var myStore = Zarafa.plugins.calendarimporter.data.Actions.getAllCalendarFolders(true);
if(config.item){ if (config.item) {
icsurl = config.item.get('icsurl'); icsurl = config.item.get('icsurl');
intervall = config.item.get('intervall'); intervall = config.item.get('intervall');
user = config.item.get('user'); user = config.item.get('user');
pass = Ext.util.base64.decode(config.item.get('pass')); pass = Ext.util.base64.decode(config.item.get('pass'));
calendar = config.item.get('calendar'); calendar = config.item.get('calendar');
calendarname = config.item.get('calendarname'); calendarname = config.item.get('calendarname');
} }
return [{
xtype: 'fieldset',
title: _('ICAL Information'),
defaultType: 'textfield',
layout: 'form',
flex: 1,
defaults: {
anchor: '100%',
flex: 1
},
items: [{
fieldLabel: 'ICS Url',
name: 'icsurl',
ref: '../icsurl',
value: icsurl,
allowBlank: false
},
{
xtype:'selectbox',
fieldLabel: _('Destination Calendar'),
name: 'calendar',
ref: '../calendar',
value: calendar,
editable: false,
store: myStore,
mode: 'local',
labelSeperator: ":",
border: false,
anchor: "100%",
scope: this,
allowBlank: false
},
{
xtype:'numberfield',
fieldLabel: _('Sync Intervall (minutes)'),
name: 'intervall',
ref: '../intervall',
value: intervall,
allowBlank: false
}]
},
{
xtype: 'fieldset',
title: _('Authentication (optional)'),
defaultType: 'textfield',
layout: 'form',
defaults: {
anchor: '100%'
},
items: [{
fieldLabel: _('Username'),
name: 'user',
ref: '../user',
value: user,
allowBlank: true
},
{
fieldLabel: _('Password'),
name: 'pass',
ref: '../pass',
value: pass,
inputType: 'password',
allowBlank: true
}]
}];
},
/**
* Java String.hashCode() implementation
* @private
*/
hashCode : function(str){
var hash = 0;
var chr = 0;
var i = 0;
if (str.length == 0) return hash;
for (i = 0; i < str.length; i++) { return [{
chr = str.charCodeAt(i); xtype: 'fieldset',
hash = ((hash<<5)-hash)+chr; title: dgettext('plugin_calendarimporter', 'ICAL Information'),
hash = hash & hash; // Convert to 32bit integer defaultType: 'textfield',
} layout: 'form',
return Math.abs(hash); flex: 1,
} defaults: {
anchor: '100%',
flex: 1
},
items: [{
fieldLabel: dgettext('plugin_calendarimporter', 'ICS Url'),
name: 'icsurl',
ref: '../icsurl',
value: icsurl,
allowBlank: false
},
{
xtype: 'selectbox',
fieldLabel: dgettext('plugin_calendarimporter', 'Destination Calendar'),
name: 'calendar',
ref: '../calendar',
value: calendar,
editable: false,
store: myStore,
mode: 'local',
labelSeperator: ":",
border: false,
anchor: "100%",
scope: this,
allowBlank: false
},
{
xtype: 'numberfield',
fieldLabel: dgettext('plugin_calendarimporter', 'Sync Intervall (minutes)'),
name: 'intervall',
ref: '../intervall',
value: intervall,
allowBlank: false
}]
},
{
xtype: 'fieldset',
title: dgettext('plugin_calendarimporter', 'Authentication (optional)'),
defaultType: 'textfield',
layout: 'form',
defaults: {
anchor: '100%'
},
items: [{
fieldLabel: dgettext('plugin_calendarimporter', 'Username'),
name: 'user',
ref: '../user',
value: user,
allowBlank: true
},
{
fieldLabel: dgettext('plugin_calendarimporter', 'Password'),
name: 'pass',
ref: '../pass',
value: pass,
inputType: 'password',
allowBlank: true
}]
}];
},
/**
* Java String.hashCode() implementation
* @private
*/
hashCode: function (str) {
var hash = 0;
var chr = 0;
var i = 0;
if (str.length == 0) return hash;
for (i = 0; i < str.length; i++) {
chr = str.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash = hash & hash; // Convert to 32bit integer
}
return Math.abs(hash);
}
}); });
Ext.reg('calendarimporter.calsynceditpanel', Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditPanel); Ext.reg('calendarimporter.calsynceditpanel', Zarafa.plugins.calendarimporter.settings.dialogs.CalSyncEditPanel);

View File

@ -1,3 +1,25 @@
/**
* CalSyncGrid.js, Kopano calender to ics im/exporter
*
* Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
Ext.namespace('Zarafa.plugins.calendarimporter.settings.ui'); Ext.namespace('Zarafa.plugins.calendarimporter.settings.ui');
/** /**
@ -7,162 +29,152 @@ Ext.namespace('Zarafa.plugins.calendarimporter.settings.ui');
* *
*/ */
Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid = Ext.extend(Ext.grid.GridPanel, { Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid = Ext.extend(Ext.grid.GridPanel, {
/** /**
* @constructor * @constructor
* @param {Object} config Configuration structure * @param {Object} config Configuration structure
*/ */
constructor : function(config) constructor: function (config) {
{ config = config || {};
config = config || {};
Ext.applyIf(config, {
xtype : 'calendarimporter.calsyncgrid',
border : true,
store : config.store,
viewConfig : {
forceFit : true,
emptyText : '<div class=\'emptytext\'>' + _('No ICAL sync entry exists') + '</div>'
},
loadMask : this.initLoadMask(),
columns : this.initColumnModel(),
selModel : this.initSelectionModel(),
listeners : {
viewready : this.onViewReady,
rowdblclick : this.onRowDblClick,
scope : this
}
});
Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid.superclass.constructor.call(this, config); Ext.applyIf(config, {
}, xtype: 'calendarimporter.calsyncgrid',
border: true,
store: config.store,
viewConfig: {
forceFit: true,
emptyText: '<div class=\'emptytext\'>' + dgettext('plugin_calendarimporter', 'No ICAL sync entry exists') + '</div>'
},
loadMask: this.initLoadMask(),
columns: this.initColumnModel(),
selModel: this.initSelectionModel(),
listeners: {
viewready: this.onViewReady,
rowdblclick: this.onRowDblClick,
scope: this
}
});
/** Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid.superclass.constructor.call(this, config);
* initialize events for the grid panel. },
* @private
*/
initEvents : function()
{
Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid.superclass.initEvents.call(this);
// select first icssync when store has finished loading /**
this.mon(this.store, 'load', this.onViewReady, this, {single : true}); * initialize events for the grid panel.
}, * @private
*/
/** initEvents: function () {
* Render function Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid.superclass.initEvents.call(this);
* @return {String}
* @private
*/
renderAuthColumn : function(value, p, record)
{
return value ? "true" : "false";
},
/** // select first icssync when store has finished loading
* Render function this.mon(this.store, 'load', this.onViewReady, this, {single: true});
* @return {String} },
* @private
*/
renderCalendarColumn : function(value, p, record)
{
return Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(value).display_name;
},
/** /**
* Creates a column model object, used in {@link #colModel} config * Render function
* @return {Ext.grid.ColumnModel} column model object * @return {String}
* @private * @private
*/ */
initColumnModel : function() renderAuthColumn: function (value, p, record) {
{ return value ? "true" : "false";
return [{ },
dataIndex : 'icsurl',
header : _('ICS File'),
renderer : Zarafa.common.ui.grid.Renderers.text
},
{
dataIndex : 'calendarname',
header : _('Destination Calender'),
renderer : Zarafa.common.ui.grid.Renderers.text
},
{
dataIndex : 'user',
header : _('Authentication'),
renderer : this.renderAuthColumn
},
{
dataIndex : 'intervall',
header : _('Sync Intervall')
},
{
dataIndex : 'lastsync',
header : _('Last Synchronisation'),
renderer : Zarafa.common.ui.grid.Renderers.text
}]
},
/** /**
* Creates a selection model object, used in {@link #selModel} config * Render function
* @return {Ext.grid.RowSelectionModel} selection model object * @return {String}
* @private * @private
*/ */
initSelectionModel : function() renderCalendarColumn: function (value, p, record) {
{ return Zarafa.plugins.calendarimporter.data.Actions.getCalendarFolderByEntryid(value).display_name;
return new Ext.grid.RowSelectionModel({ },
singleSelect : true
});
},
/** /**
* Initialize the {@link Ext.grid.GridPanel.loadMask} field * Creates a column model object, used in {@link #colModel} config
* * @return {Ext.grid.ColumnModel} column model object
* @return {Ext.LoadMask} The configuration object for {@link Ext.LoadMask} * @private
* @private */
*/ initColumnModel: function () {
initLoadMask : function() return [{
{ dataIndex: 'icsurl',
return { header: dgettext('plugin_calendarimporter', 'ICS File'),
msg : _('Loading ics sync entries') + '...' renderer: Zarafa.common.ui.grid.Renderers.text
}; },
}, {
dataIndex: 'calendarname',
header: dgettext('plugin_calendarimporter', 'Destination Calender'),
renderer: Zarafa.common.ui.grid.Renderers.text
},
{
dataIndex: 'user',
header: dgettext('plugin_calendarimporter', 'Authentication'),
renderer: this.renderAuthColumn
},
{
dataIndex: 'intervall',
header: dgettext('plugin_calendarimporter', 'Sync Intervall')
},
{
dataIndex: 'lastsync',
header: dgettext('plugin_calendarimporter', 'Last Synchronisation'),
renderer: Zarafa.common.ui.grid.Renderers.text
}]
},
/** /**
* Event handler which is fired when the gridPanel is ready. This will automatically * Creates a selection model object, used in {@link #selModel} config
* select the first row in the grid. * @return {Ext.grid.RowSelectionModel} selection model object
* @private * @private
*/ */
onViewReady : function() initSelectionModel: function () {
{ return new Ext.grid.RowSelectionModel({
this.getSelectionModel().selectFirstRow(); singleSelect: true
}, });
},
/** /**
* Function will be called to remove a ics sync entry. * Initialize the {@link Ext.grid.GridPanel.loadMask} field
*/ *
removeIcsSyncAs : function() * @return {Ext.LoadMask} The configuration object for {@link Ext.LoadMask}
{ * @private
var icsRecord = this.getSelectionModel().getSelected(); */
if(!icsRecord) { initLoadMask: function () {
Ext.Msg.alert(_('Alert'), _('Please select a ics sync entry.')); return {
return; msg: dgettext('plugin_calendarimporter', 'Loading ics sync entries...')
} };
},
this.store.remove(icsRecord); /**
}, * Event handler which is fired when the gridPanel is ready. This will automatically
* select the first row in the grid.
/** * @private
* Event handler which is fired when the {@link Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid CalSyncGrid} is double clicked. */
* it will call generic function to handle the functionality. onViewReady: function () {
* @private this.getSelectionModel().selectFirstRow();
*/ },
onRowDblClick : function(grid, rowIndex)
{ /**
Zarafa.core.data.UIFactory.openLayerComponent(Zarafa.core.data.SharedComponentType['plugins.calendarimporter.settings.dialogs.calsyncedit'], undefined, { * Function will be called to remove a ics sync entry.
store : grid.getStore(), */
item : grid.getStore().getAt(rowIndex), removeIcsSyncAs: function () {
manager : Ext.WindowMgr var icsRecord = this.getSelectionModel().getSelected();
}); if (!icsRecord) {
} Ext.Msg.alert(dgettext('plugin_calendarimporter', 'Alert'), dgettext('plugin_calendarimporter', 'Please select a ics sync entry.'));
return;
}
this.store.remove(icsRecord);
},
/**
* Event handler which is fired when the {@link Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid CalSyncGrid} is double clicked.
* it will call generic function to handle the functionality.
* @private
*/
onRowDblClick: function (grid, rowIndex) {
Zarafa.core.data.UIFactory.openLayerComponent(Zarafa.core.data.SharedComponentType['plugins.calendarimporter.settings.dialogs.calsyncedit'], undefined, {
store: grid.getStore(),
item: grid.getStore().getAt(rowIndex),
manager: Ext.WindowMgr
});
}
}); });
Ext.reg('calendarimporter.calsyncgrid', Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid); Ext.reg('calendarimporter.calsyncgrid', Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid);

View File

@ -1,3 +1,25 @@
/**
* CalSyncPanel.js, Kopano calender to ics im/exporter
*
* Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
Ext.namespace('Zarafa.plugins.calendarimporter.settings.ui'); Ext.namespace('Zarafa.plugins.calendarimporter.settings.ui');
/** /**
@ -8,151 +30,143 @@ Ext.namespace('Zarafa.plugins.calendarimporter.settings.ui');
*/ */
Zarafa.plugins.calendarimporter.settings.ui.CalSyncPanel = Ext.extend(Ext.Panel, { Zarafa.plugins.calendarimporter.settings.ui.CalSyncPanel = Ext.extend(Ext.Panel, {
// store // store
store : undefined, store: undefined,
/** /**
* @constructor * @constructor
* @param config Configuration structure * @param config Configuration structure
*/ */
constructor : function(config) constructor: function (config) {
{ config = config || {};
config = config || {}; if (config.store)
if(config.store) this.store = config.store;
this.store = config.store;
Ext.applyIf(config, { Ext.applyIf(config, {
// Override from Ext.Component // Override from Ext.Component
xtype : 'calendarimporter.calsyncpanel', xtype: 'calendarimporter.calsyncpanel',
border : false, border: false,
layout : { layout: {
type : 'vbox', type: 'vbox',
align : 'stretch', align: 'stretch',
pack : 'start' pack: 'start'
}, },
items : this.createPanelItems(this.store) items: this.createPanelItems(this.store)
}); });
Zarafa.plugins.calendarimporter.settings.ui.CalSyncPanel.superclass.constructor.call(this, config); Zarafa.plugins.calendarimporter.settings.ui.CalSyncPanel.superclass.constructor.call(this, config);
}, },
/**
* Function will create panel items for {@link Zarafa.plugins.calendarimporter.settings.ui.CalSyncPanel CalSyncPanel}
* @return {Array} array of items that should be added to panel.
* @private
*/
createPanelItems : function(store)
{
return [{
xtype : 'displayfield',
value : _('Setup calendars you want to subscribe to.'),
fieldClass : 'x-form-display-field'
}, {
xtype : 'container',
flex : 1,
layout : {
type : 'hbox',
align : 'stretch',
pack : 'start'
},
items : [{
xtype : 'calendarimporter.calsyncgrid',
ref : '../calsyncGrid',
store : store,
flex : 1
}, {
xtype : 'container',
width : 160,
defaults : {
width : 140
},
layout : {
type : 'vbox',
align : 'center',
pack : 'start'
},
items : [{
xtype : 'button',
text : _('Add') + '...',
handler : this.onCalSyncAdd,
ref : '../../addButton',
scope : this
}, {
xtype : 'spacer',
height : 20
}, {
xtype : 'button',
text : _('Remove') + '...',
disabled : true,
ref : '../../removeButton',
handler : this.onCalSyncRemove,
scope : this
}]
}]
}];
},
/** /**
* initialize events for the panel. * Function will create panel items for {@link Zarafa.plugins.calendarimporter.settings.ui.CalSyncPanel CalSyncPanel}
* @private * @return {Array} array of items that should be added to panel.
*/ * @private
initEvents : function() */
{ createPanelItems: function (store) {
Zarafa.plugins.calendarimporter.settings.ui.CalSyncPanel.superclass.initEvents.call(this); return [{
xtype: 'displayfield',
value: dgettext('plugin_calendarimporter', 'Setup calendars you want to subscribe to.'),
fieldClass: 'x-form-display-field'
}, {
xtype: 'container',
flex: 1,
layout: {
type: 'hbox',
align: 'stretch',
pack: 'start'
},
items: [{
xtype: 'calendarimporter.calsyncgrid',
ref: '../calsyncGrid',
store: store,
flex: 1
}, {
xtype: 'container',
width: 160,
defaults: {
width: 140
},
layout: {
type: 'vbox',
align: 'center',
pack: 'start'
},
items: [{
xtype: 'button',
text: _('Add') + '...',
handler: this.onCalSyncAdd,
ref: '../../addButton',
scope: this
}, {
xtype: 'spacer',
height: 20
}, {
xtype: 'button',
text: _('Remove') + '...',
disabled: true,
ref: '../../removeButton',
handler: this.onCalSyncRemove,
scope: this
}]
}]
}];
},
// register event to enable/disable buttons /**
this.mon(this.calsyncGrid.getSelectionModel(), 'selectionchange', this.onGridSelectionChange, this); * initialize events for the panel.
}, * @private
*/
initEvents: function () {
Zarafa.plugins.calendarimporter.settings.ui.CalSyncPanel.superclass.initEvents.call(this);
/** // register event to enable/disable buttons
* Handler function will be called when user clicks on 'Add' button. this.mon(this.calsyncGrid.getSelectionModel(), 'selectionchange', this.onGridSelectionChange, this);
* @private },
*/
onCalSyncAdd : function()
{
Zarafa.core.data.UIFactory.openLayerComponent(Zarafa.core.data.SharedComponentType['plugins.calendarimporter.settings.dialogs.calsyncedit'], undefined, {
store : this.store,
item : undefined,
manager : Ext.WindowMgr
});
},
/** /**
* Event handler will be called when selection in {@link Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid CalSyncGrid} * Handler function will be called when user clicks on 'Add' button.
* has been changed * @private
* @param {Ext.grid.RowSelectionModel} selectionModel selection model that fired the event */
*/ onCalSyncAdd: function () {
onGridSelectionChange : function(selectionModel) Zarafa.core.data.UIFactory.openLayerComponent(Zarafa.core.data.SharedComponentType['plugins.calendarimporter.settings.dialogs.calsyncedit'], undefined, {
{ store: this.store,
var noSelection = (selectionModel.hasSelection() === false); item: undefined,
manager: Ext.WindowMgr
});
},
this.removeButton.setDisabled(noSelection); /**
}, * Event handler will be called when selection in {@link Zarafa.plugins.calendarimporter.settings.ui.CalSyncGrid CalSyncGrid}
* has been changed
* @param {Ext.grid.RowSelectionModel} selectionModel selection model that fired the event
*/
onGridSelectionChange: function (selectionModel) {
var noSelection = (selectionModel.hasSelection() === false);
/** this.removeButton.setDisabled(noSelection);
* Handler function will be called when user clicks on 'Remove' button. },
* @private
*/
onCalSyncRemove : function()
{
this.calsyncGrid.removeIcsSyncAs();
},
/** /**
* Function will be used to reload data in the store. * Handler function will be called when user clicks on 'Remove' button.
*/ * @private
discardChanges : function() */
{ onCalSyncRemove: function () {
this.store.load(); this.calsyncGrid.removeIcsSyncAs();
}, },
/** /**
* Function will be used to save changes in the store. * Function will be used to reload data in the store.
*/ */
saveChanges : function() discardChanges: function () {
{ this.store.load();
this.store.save(); },
}
/**
* Function will be used to save changes in the store.
*/
saveChanges: function () {
this.store.save();
}
}); });
Ext.reg('calendarimporter.calsyncpanel', Zarafa.plugins.calendarimporter.settings.ui.CalSyncPanel); Ext.reg('calendarimporter.calsyncpanel', Zarafa.plugins.calendarimporter.settings.ui.CalSyncPanel);

View File

@ -1,5 +1,5 @@
/** /**
* ContectMenu.js zarafa calender to ics im/exporter * ContectMenu.js, Kopano calender to ics im/exporter
* *
* Author: Christoph Haas <christoph.h@sprinternet.at> * Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas * Copyright (C) 2012-2016 Christoph Haas
@ -29,101 +29,105 @@ Ext.namespace('Zarafa.plugins.calendarimporter.ui');
*/ */
Zarafa.plugins.calendarimporter.ui.ContextMenu = Ext.extend(Zarafa.hierarchy.ui.ContextMenu, { Zarafa.plugins.calendarimporter.ui.ContextMenu = Ext.extend(Zarafa.hierarchy.ui.ContextMenu, {
/** /**
* @constructor * @constructor
* @param {Object} config Configuration object * @param {Object} config Configuration object
*/ */
constructor: function (config) { constructor: function (config) {
config = config || {}; config = config || {};
if (config.contextNode) { if (config.contextNode) {
config.contextTree = config.contextNode.getOwnerTree(); config.contextTree = config.contextNode.getOwnerTree();
} }
Zarafa.plugins.calendarimporter.ui.ContextMenu.superclass.constructor.call(this, config); Zarafa.plugins.calendarimporter.ui.ContextMenu.superclass.constructor.call(this, config);
// add item to menu // add item to menu
var additionalItems = this.createAdditionalContextMenuItems(config); var additionalItems = this.createAdditionalContextMenuItems(config);
for (var i = 0; i < additionalItems.length; i++) { for (var i = 0; i < additionalItems.length; i++) {
config.items[0].push(additionalItems[i]); config.items[0].push(additionalItems[i]);
} }
Zarafa.plugins.calendarimporter.ui.ContextMenu.superclass.constructor.call(this, config); // redo ... otherwise menu does not get published Zarafa.plugins.calendarimporter.ui.ContextMenu.superclass.constructor.call(this, config); // redo ... otherwise menu does not get published
}, },
/** /**
* Create the Action context menu items. * Create the Action context menu items.
* @param {Object} config Configuration object for the {@link Zarafa.plugins.calendarimporter.ui.ContextMenu ContextMenu} * @param {Object} config Configuration object for the {@link Zarafa.plugins.calendarimporter.ui.ContextMenu ContextMenu}
* @return {Zarafa.core.ui.menu.ConditionalItem[]} The list of Action context menu items * @return {Zarafa.core.ui.menu.ConditionalItem[]} The list of Action context menu items
* @private * @private
* *
* Note: All handlers are called within the scope of {@link Zarafa.plugins.calendarimporter.ui.ContextMenu HierarchyContextMenu} * Note: All handlers are called within the scope of {@link Zarafa.plugins.calendarimporter.ui.ContextMenu HierarchyContextMenu}
*/ */
createAdditionalContextMenuItems: function (config) { createAdditionalContextMenuItems: function (config) {
return [{ return [{
xtype: 'menuseparator' xtype: 'menuseparator'
}, { }, {
text : _('Import Calendar'), text: dgettext('plugin_calendarimporter', 'Import Calendar'),
iconCls : 'icon_calendarimporter_import', iconCls: 'icon_calendarimporter_import',
handler : this.onContextItemImport, handler: this.onContextItemImport,
beforeShow: function (item, record) { beforeShow: function (item, record) {
var access = record.get('access') & Zarafa.core.mapi.Access.ACCESS_MODIFY; var access = record.get('access') & Zarafa.core.mapi.Access.ACCESS_MODIFY;
if (!access || (record.isIPMSubTree() && !record.getMAPIStore().isDefaultStore())) { if (!access || (record.isIPMSubTree() && !record.getMAPIStore().isDefaultStore())) {
item.setDisabled(true); item.setDisabled(true);
} else { } else {
item.setDisabled(false); item.setDisabled(false);
} }
} }
}, { }, {
text : _('Export Calendar'), text: dgettext('plugin_calendarimporter', 'Export Calendar'),
iconCls : 'icon_calendarimporter_export', iconCls: 'icon_calendarimporter_export',
handler : this.onContextItemExport, handler: this.onContextItemExport,
beforeShow: function (item, record) { beforeShow: function (item, record) {
var access = record.get('access') & Zarafa.core.mapi.Access.ACCESS_READ; var access = record.get('access') & Zarafa.core.mapi.Access.ACCESS_READ;
if (!access || (record.isIPMSubTree() && !record.getMAPIStore().isDefaultStore())) { if (!access || (record.isIPMSubTree() && !record.getMAPIStore().isDefaultStore())) {
item.setDisabled(true); item.setDisabled(true);
} else { } else {
item.setDisabled(false); item.setDisabled(false);
} }
} }
}]; }];
}, },
/** /**
* Fires on selecting 'Open' menu option from {@link Zarafa.plugins.calendarimporter.ui.ContextMenu ContextMenu} * Fires on selecting 'Open' menu option from {@link Zarafa.plugins.calendarimporter.ui.ContextMenu ContextMenu}
* @private * @private
*/ */
onContextItemExport: function () { onContextItemExport: function () {
var responseHandler = new Zarafa.plugins.calendarimporter.data.ResponseHandler({ var responseHandler = new Zarafa.plugins.calendarimporter.data.ResponseHandler({
successCallback: Zarafa.plugins.calendarimporter.data.Actions.downloadICS, successCallback: Zarafa.plugins.calendarimporter.data.Actions.downloadICS,
scope : this scope: this
}); });
// request attachment preperation // Notify user
container.getRequest().singleRequest( // # TRANSLATORS: {0} will be replaced by the number of contacts that will be exported
'calendarmodule', container.getNotifier().notify('info', dgettext('plugin_contactimporter', 'Calendar Export'), String.format(dgettext('plugin_calendarimporter', 'Exporting {0} events. Please wait...'), this.records.get('content_count')));
'export',
{
storeid: this.records.get("store_entryid"),
folder : this.records.get("entryid")
},
responseHandler
);
},
/** // request attachment preperation
* Fires on selecting 'Open' menu option from {@link Zarafa.plugins.calendarimporter.ui.ContextMenu ContextMenu} container.getRequest().singleRequest(
* @private 'calendarmodule',
*/ 'export',
onContextItemImport: function () { {
var componentType = Zarafa.core.data.SharedComponentType['plugins.calendarimporter.dialogs.importevents']; storeid: this.records.get("store_entryid"),
var config = { folder: this.records.get("entryid")
modal : true, },
folder: this.records.get("entryid") responseHandler
}; );
},
Zarafa.core.data.UIFactory.openLayerComponent(componentType, undefined, config); /**
} * Fires on selecting 'Open' menu option from {@link Zarafa.plugins.calendarimporter.ui.ContextMenu ContextMenu}
* @private
*/
onContextItemImport: function () {
var componentType = Zarafa.core.data.SharedComponentType['plugins.calendarimporter.dialogs.importevents'];
var config = {
modal: true,
folder: this.records.get("entryid")
};
Zarafa.core.data.UIFactory.openLayerComponent(componentType, undefined, config);
}
}); });
Ext.reg('calendarimporter.hierarchycontextmenu', Zarafa.plugins.calendarimporter.ui.ContextMenu); Ext.reg('calendarimporter.hierarchycontextmenu', Zarafa.plugins.calendarimporter.ui.ContextMenu);

View File

@ -0,0 +1,350 @@
msgid ""
msgstr ""
"Project-Id-Version: Plugin Calendarimporter\n"
"POT-Creation-Date: 2016-11-29 19:49+0100\n"
"PO-Revision-Date: 2016-11-29 19:49+0100\n"
"Last-Translator: \n"
"Language-Team: Christoph Haas <christoph.h@sprinternet.at>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.7.1\n"
"X-Poedit-Basepath: ../../..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-SearchPath-0: php\n"
"X-Poedit-SearchPath-1: js\n"
#: js/data/Actions.js:44
msgid "Warning"
msgstr "Warnung"
#: js/dialogs/ImportContentPanel.js:47
msgid "Import Calendar File"
msgstr "Kalender Datei importieren"
#: js/dialogs/ImportPanel.js:124
msgid "Loading..."
msgstr "Lade..."
#: js/dialogs/ImportPanel.js:209
msgid "Select events to import"
msgstr "Termine zum importieren auswählen"
#: js/dialogs/ImportPanel.js:222
msgid "Title"
msgstr "Titel"
#: js/dialogs/ImportPanel.js:228
msgid "Start"
msgstr "Beginn"
#: js/dialogs/ImportPanel.js:235
msgid "End"
msgstr "Ende"
#: js/dialogs/ImportPanel.js:242
msgid "Location"
msgstr "Ort"
#: js/dialogs/ImportPanel.js:247
msgid "Description"
msgstr "Beschreibung"
#: js/dialogs/ImportPanel.js:248
msgid "Priority"
msgstr "Priorität"
#: js/dialogs/ImportPanel.js:249
msgid "Label"
msgstr "Label"
#: js/dialogs/ImportPanel.js:250
msgid "Busystatus"
msgstr "Beschäftigt"
#: js/dialogs/ImportPanel.js:251
msgid "Privacystatus"
msgstr "Privat"
#: js/dialogs/ImportPanel.js:252
msgid "Organizer"
msgstr "Ersteller"
#: js/dialogs/ImportPanel.js:254
msgid "Alarm"
msgstr "Erinnerung"
#: js/dialogs/ImportPanel.js:259 js/dialogs/ImportPanel.js:296
msgid "Timezone"
msgstr "Zeitzone"
#: js/dialogs/ImportPanel.js:276
msgid "Select folder"
msgstr "Ordner auswählen"
#: js/dialogs/ImportPanel.js:317
msgid "Ignore DST"
msgstr "DST ignorieren"
#: js/dialogs/ImportPanel.js:318
msgid "This will ignore \"Daylight saving time\" offsets."
msgstr ""
"Durch diese Einstellung wird die Sommer bzw. Winterzeit Abweichung ignoriert."
#: js/dialogs/ImportPanel.js:338
msgid "Select an .ics calendar"
msgstr ".ics Kalender Datei wählen"
#: js/dialogs/ImportPanel.js:358
msgid "Import"
msgstr "Importieren"
#: js/dialogs/ImportPanel.js:372
msgid "Import All"
msgstr "Alle Importieren"
#: js/dialogs/ImportPanel.js:384 js/settings/SettingsWidget.js:165
#: js/settings/dialogs/CalSyncEditPanel.js:61
msgid "Cancel"
msgstr "Abbrechen"
#: js/dialogs/ImportPanel.js:428
msgid "Uploading and parsing calendar..."
msgstr "Kalender wird hochgeladen und verarbeitet..."
#: js/dialogs/ImportPanel.js:434 js/dialogs/ImportPanel.js:524
#: js/dialogs/ImportPanel.js:532 js/dialogs/ImportPanel.js:581
#: js/plugin.calendarimporter.js:175
msgid "Error"
msgstr "Fehler"
#: js/dialogs/ImportPanel.js:489
msgid "Parser Error"
msgstr "Verarbeitungsfehler"
#: js/dialogs/ImportPanel.js:525
msgid "You have to choose a calendar!"
msgstr "Es muss ein Kalender ausgewählt werden!"
#: js/dialogs/ImportPanel.js:533
msgid "You have to choose at least one event to import!"
msgstr "Es muss mindestens ein Termin zum Importieren ausgewählt werden."
#: js/dialogs/ImportPanel.js:582
msgid "Import failed: {0}"
msgstr "Importieren fehlgeschalgen: {0}"
#: js/plugin.calendarimporter.js:76
msgid "Export Event"
msgstr "Termin exportieren"
#. TRANSLATORS: {0} will be replaced by the number of contacts that will be exported
#. TRANSLATORS: {0} will be replaced by the number of contacts that will be exported
#: js/plugin.calendarimporter.js:105 js/ui/ContextMenu.js:104
msgid "Calendar Export"
msgstr "Kalenderexport"
#: js/plugin.calendarimporter.js:105 js/ui/ContextMenu.js:104
msgid "Exporting {0} events. Please wait..."
msgstr "Exportiere {0} Termine. Bitte warten..."
#: js/plugin.calendarimporter.js:151
msgid "Import to Calendar"
msgstr "Kalender importieren"
#: js/plugin.calendarimporter.js:188
msgid "Please wait"
msgstr "Bitte warten"
#: js/plugin.calendarimporter.js:189
msgid "Loading attachment..."
msgstr "Lade Anhang..."
#: js/plugin.calendarimporter.js:190
msgid "Initializing..."
msgstr "Initialisierung..."
#. TRANSLATORS: {0} will be replaced by the percentage value (0-100)
#: js/plugin.calendarimporter.js:203
msgid "{0}% loaded"
msgstr "{0}% geladen"
#: js/plugin.calendarimporter.js:321
msgid "Calendarimporter Plugin"
msgstr "Kalender Plugin"
#: js/settings/SettingsCalSyncWidget.js:64
msgid "Calendar Sync settings"
msgstr "Kalender Synchronisierung - Einstellungen"
#: js/settings/SettingsWidget.js:45
msgid "Calendar Import/Export plugin settings"
msgstr "Kalender Import/Export Einstellungen"
#: js/settings/SettingsWidget.js:52
msgid "Enable ical sync"
msgstr "iCAL Synchronisierung aktivieren"
#: js/settings/SettingsWidget.js:73
msgid "Default calender"
msgstr "Standard Kalender"
#: js/settings/SettingsWidget.js:92
msgid "Default timezone"
msgstr "Standard Zeitzone"
#: js/settings/SettingsWidget.js:151
msgid "Your WebApp needs to be reloaded to make the changes visible!"
msgstr "Your WebApp needs to be reloaded to make the changes visible!"
#: js/settings/SettingsWidget.js:153
msgid ""
"WebApp will automatically restart in order for these changes to take effect"
msgstr ""
"WebApp will automatically restart in order for these changes to take effect"
#: js/settings/SettingsWidget.js:157
msgid "Restart WebApp"
msgstr "Restart WebApp"
#: js/settings/SettingsWidget.js:162
msgid "Restart"
msgstr "Restart"
#: js/settings/SettingsWidget.js:187
msgid "Webapp is reloading, Please wait."
msgstr "Webapp is reloading, Please wait."
#: js/settings/dialogs/CalSyncEditContentPanel.js:49
msgid "ICAL Sync"
msgstr "iCAL Synchronisierung"
#: js/settings/dialogs/CalSyncEditPanel.js:56
msgid "Save"
msgstr "Save"
#: js/settings/dialogs/CalSyncEditPanel.js:139
msgid "ICAL Information"
msgstr "iCAL Informationen"
#: js/settings/dialogs/CalSyncEditPanel.js:148
msgid "ICS Url"
msgstr "ICS Url"
#: js/settings/dialogs/CalSyncEditPanel.js:156
msgid "Destination Calendar"
msgstr "Ziel-Kalender"
#: js/settings/dialogs/CalSyncEditPanel.js:171
msgid "Sync Intervall (minutes)"
msgstr "Synchronisationsintervall (Minuten)"
#: js/settings/dialogs/CalSyncEditPanel.js:180
msgid "Authentication (optional)"
msgstr "Anmelden (optional)"
#: js/settings/dialogs/CalSyncEditPanel.js:187
msgid "Username"
msgstr "Benutzername"
#: js/settings/dialogs/CalSyncEditPanel.js:194
msgid "Password"
msgstr "Passwort"
#: js/settings/ui/CalSyncGrid.js:45
msgid "No ICAL sync entry exists"
msgstr "Es existiert kein Synchronisierungs Eintrag"
#: js/settings/ui/CalSyncGrid.js:97
msgid "ICS File"
msgstr "ICS Datei"
#: js/settings/ui/CalSyncGrid.js:102
msgid "Destination Calender"
msgstr "Ziel-Kalender"
#: js/settings/ui/CalSyncGrid.js:107
msgid "Authentication"
msgstr "Anmeldung"
#: js/settings/ui/CalSyncGrid.js:112
msgid "Sync Intervall"
msgstr "Synchronisierungs Intervall"
#: js/settings/ui/CalSyncGrid.js:116
msgid "Last Synchronisation"
msgstr "Letzte Synchronisation"
#: js/settings/ui/CalSyncGrid.js:140
msgid "Loading ics sync entries..."
msgstr "Lade Synchronisierungseinträge..."
#: js/settings/ui/CalSyncGrid.js:159
msgid "Alert"
msgstr "Achtung"
#: js/settings/ui/CalSyncGrid.js:159
msgid "Please select a ics sync entry."
msgstr "Bitte einen Eintrag auswählen."
#: js/settings/ui/CalSyncPanel.js:68
msgid "Setup calendars you want to subscribe to."
msgstr "Kalender zur Synchronisation verwalten."
#: js/settings/ui/CalSyncPanel.js:96
msgid "Add"
msgstr "Add"
#: js/settings/ui/CalSyncPanel.js:105
msgid "Remove"
msgstr "Remove"
#: js/ui/ContextMenu.js:66
msgid "Import Calendar"
msgstr "Kalender importieren"
#: js/ui/ContextMenu.js:78
msgid "Export Calendar"
msgstr "Kalender exportieren"
#. TRANSLATORS: Filename suffix for exported files
#: php/module.calendar.php:341
msgid "_events.ics"
msgstr "_Termine.ics"
#: php/module.calendar.php:344
msgid "No events found. Export skipped!"
msgstr "Keine Termine gefunden. Export abgebrochen!"
#: php/module.calendar.php:456
msgid "ICS file empty!"
msgstr "ICS enthält keine Termine!"
#: php/module.calendar.php:594
msgid "Store could not be opened!"
msgstr "Datenbank kann nicht geöffnet werden!"
#: php/module.calendar.php:600
msgid "Wrong call, store and entryid have to be set!"
msgstr "Inkorrekter Aufruf!"
#: php/module.calendar.php:634
msgid "No event in ics file"
msgstr "ICS enthält keine Termine!"
#: php/module.calendar.php:647
msgid "File could not be read by server"
msgstr "Datei konnte vom Server nicht gelesen werden"
#: php/upload.php:69
msgid ""
"File could not be moved to TMP path! Check plugin config and folder "
"permissions!"
msgstr "Temporärer Pfad ist nicht beschreibbar!"
#: php/upload.php:72
msgid "File could not be read by server, upload error!"
msgstr ""
"Datei konnte vom Server nicht gelesen werden. Hochladen fehlgeschlagen!"

View File

@ -0,0 +1,2 @@
Deutsch
deu_DEU

View File

@ -0,0 +1,349 @@
msgid ""
msgstr ""
"Project-Id-Version: Plugin Calendarimporter\n"
"POT-Creation-Date: 2016-11-29 19:21+0100\n"
"PO-Revision-Date: 2016-11-29 19:39+0100\n"
"Last-Translator: \n"
"Language-Team: Christoph Haas <christoph.h@sprinternet.at>\n"
"Language: en_US\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.7.1\n"
"X-Poedit-Basepath: ../../..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-SearchPath-0: php\n"
"X-Poedit-SearchPath-1: js\n"
#: js/data/Actions.js:44
msgid "Warning"
msgstr "Warning"
#: js/dialogs/ImportContentPanel.js:47
msgid "Import Calendar File"
msgstr "Import Calendar File"
#: js/dialogs/ImportPanel.js:124
msgid "Loading..."
msgstr "Loading..."
#: js/dialogs/ImportPanel.js:209
msgid "Select events to import"
msgstr "Select events to import"
#: js/dialogs/ImportPanel.js:222
msgid "Title"
msgstr "Title"
#: js/dialogs/ImportPanel.js:228
msgid "Start"
msgstr "Start"
#: js/dialogs/ImportPanel.js:235
msgid "End"
msgstr "End"
#: js/dialogs/ImportPanel.js:242
msgid "Location"
msgstr "Location"
#: js/dialogs/ImportPanel.js:247
msgid "Description"
msgstr "Description"
#: js/dialogs/ImportPanel.js:248
msgid "Priority"
msgstr "Priority"
#: js/dialogs/ImportPanel.js:249
msgid "Label"
msgstr "Label"
#: js/dialogs/ImportPanel.js:250
msgid "Busystatus"
msgstr "Busystatus"
#: js/dialogs/ImportPanel.js:251
msgid "Privacystatus"
msgstr "Privacystatus"
#: js/dialogs/ImportPanel.js:252
msgid "Organizer"
msgstr "Organizer"
#: js/dialogs/ImportPanel.js:254
msgid "Alarm"
msgstr "Alarm"
#: js/dialogs/ImportPanel.js:259 js/dialogs/ImportPanel.js:296
msgid "Timezone"
msgstr "Timezone"
#: js/dialogs/ImportPanel.js:276
msgid "Select folder"
msgstr "Select folder"
#: js/dialogs/ImportPanel.js:317
msgid "Ignore DST"
msgstr "Ignore DST"
#: js/dialogs/ImportPanel.js:318
msgid "This will ignore \"Daylight saving time\" offsets."
msgstr "This will ignore \"Daylight saving time\" offsets."
#: js/dialogs/ImportPanel.js:338
msgid "Select an .ics calendar"
msgstr "Select an .ics calendar"
#: js/dialogs/ImportPanel.js:358
msgid "Import"
msgstr "Import"
#: js/dialogs/ImportPanel.js:372
msgid "Import All"
msgstr "Import All"
#: js/dialogs/ImportPanel.js:384 js/settings/SettingsWidget.js:165
#: js/settings/dialogs/CalSyncEditPanel.js:61
msgid "Cancel"
msgstr "Cancel"
#: js/dialogs/ImportPanel.js:428
msgid "Uploading and parsing calendar..."
msgstr "Uploading and parsing calendar..."
#: js/dialogs/ImportPanel.js:434 js/dialogs/ImportPanel.js:524
#: js/dialogs/ImportPanel.js:532 js/dialogs/ImportPanel.js:581
#: js/plugin.calendarimporter.js:170
msgid "Error"
msgstr "Error"
#: js/dialogs/ImportPanel.js:489
msgid "Parser Error"
msgstr "Parser Error"
#: js/dialogs/ImportPanel.js:525
msgid "You have to choose a calendar!"
msgstr "You have to choose a calendar!"
#: js/dialogs/ImportPanel.js:533
msgid "You have to choose at least one event to import!"
msgstr "You have to choose at least one event to import!"
#: js/dialogs/ImportPanel.js:582
msgid "Import failed: {0}"
msgstr "Import failed: {0}"
#: js/plugin.calendarimporter.js:76
msgid "Export Event"
msgstr "Export Event"
#: js/plugin.calendarimporter.js:146
msgid "Import to Calendar"
msgstr "Import to Calendar"
#: js/plugin.calendarimporter.js:183
msgid "Please wait"
msgstr "Please wait"
#: js/plugin.calendarimporter.js:184
msgid "Loading attachment..."
msgstr "Loading attachment..."
#: js/plugin.calendarimporter.js:185
msgid "Initializing..."
msgstr "Initializing..."
#. TRANSLATORS: {0} will be replaced by the percentage value (0-100)
#: js/plugin.calendarimporter.js:198
msgid "{0}% loaded"
msgstr "{0}% loaded"
#: js/plugin.calendarimporter.js:316
msgid "Calendarimporter Plugin"
msgstr "Calendarimporter Plugin"
#: js/settings/SettingsCalSyncWidget.js:64
msgid "Calendar Sync settings"
msgstr "Calendar Sync settings"
#: js/settings/SettingsWidget.js:45
msgid "Calendar Import/Export plugin settings"
msgstr "Calendar Import/Export plugin settings"
#: js/settings/SettingsWidget.js:52
msgid "Enable ical sync"
msgstr "Enable ical sync"
#: js/settings/SettingsWidget.js:73
msgid "Default calender"
msgstr "Default calender"
#: js/settings/SettingsWidget.js:92
msgid "Default timezone"
msgstr "Default timezone"
#: js/settings/SettingsWidget.js:151
msgid "Your WebApp needs to be reloaded to make the changes visible!"
msgstr "Your WebApp needs to be reloaded to make the changes visible!"
#: js/settings/SettingsWidget.js:153
msgid ""
"WebApp will automatically restart in order for these changes to take effect"
msgstr ""
"WebApp will automatically restart in order for these changes to take effect"
#: js/settings/SettingsWidget.js:157
msgid "Restart WebApp"
msgstr "Restart WebApp"
#: js/settings/SettingsWidget.js:162
msgid "Restart"
msgstr "Restart"
#: js/settings/SettingsWidget.js:187
msgid "Webapp is reloading, Please wait."
msgstr "Webapp is reloading, Please wait."
#: js/settings/dialogs/CalSyncEditContentPanel.js:49
msgid "ICAL Sync"
msgstr "ICAL Sync"
#: js/settings/dialogs/CalSyncEditPanel.js:56
msgid "Save"
msgstr "Save"
#: js/settings/dialogs/CalSyncEditPanel.js:139
msgid "ICAL Information"
msgstr "ICAL Information"
#: js/settings/dialogs/CalSyncEditPanel.js:148
msgid "ICS Url"
msgstr "ICS Url"
#: js/settings/dialogs/CalSyncEditPanel.js:156
msgid "Destination Calendar"
msgstr "Destination Calendar"
#: js/settings/dialogs/CalSyncEditPanel.js:171
msgid "Sync Intervall (minutes)"
msgstr "Sync Intervall (minutes)"
#: js/settings/dialogs/CalSyncEditPanel.js:180
msgid "Authentication (optional)"
msgstr "Authentication (optional)"
#: js/settings/dialogs/CalSyncEditPanel.js:187
msgid "Username"
msgstr "Username"
#: js/settings/dialogs/CalSyncEditPanel.js:194
msgid "Password"
msgstr "Password"
#: js/settings/ui/CalSyncGrid.js:45
msgid "No ICAL sync entry exists"
msgstr "No ICAL sync entry exists"
#: js/settings/ui/CalSyncGrid.js:97
msgid "ICS File"
msgstr "ICS File"
#: js/settings/ui/CalSyncGrid.js:102
msgid "Destination Calender"
msgstr "Destination Calender"
#: js/settings/ui/CalSyncGrid.js:107
msgid "Authentication"
msgstr "Authentication"
#: js/settings/ui/CalSyncGrid.js:112
msgid "Sync Intervall"
msgstr "Sync Intervall"
#: js/settings/ui/CalSyncGrid.js:116
msgid "Last Synchronisation"
msgstr "Last Synchronisation"
#: js/settings/ui/CalSyncGrid.js:140
msgid "Loading ics sync entries..."
msgstr "Loading ics sync entries..."
#: js/settings/ui/CalSyncGrid.js:159
msgid "Alert"
msgstr "Alert"
#: js/settings/ui/CalSyncGrid.js:159
msgid "Please select a ics sync entry."
msgstr "Please select a ics sync entry."
#: js/settings/ui/CalSyncPanel.js:68
msgid "Setup calendars you want to subscribe to."
msgstr "Setup calendars you want to subscribe to."
#: js/settings/ui/CalSyncPanel.js:96
msgid "Add"
msgstr "Add"
#: js/settings/ui/CalSyncPanel.js:105
msgid "Remove"
msgstr "Remove"
#: js/ui/ContextMenu.js:66
msgid "Import Calendar"
msgstr "Import Calendar"
#: js/ui/ContextMenu.js:78
msgid "Export Calendar"
msgstr "Export Calendar"
#. TRANSLATORS: {0} will be replaced by the number of contacts that will be exported
#: js/ui/ContextMenu.js:104
msgid "Calendar Export"
msgstr "Calendar Export"
#: js/ui/ContextMenu.js:104
msgid "Exporting {0} events. Please wait..."
msgstr "Exporting {0} events. Please wait..."
#. TRANSLATORS: Filename suffix for exported files
#: php/module.calendar.php:341
msgid "_events.ics"
msgstr "_events.ics"
#: php/module.calendar.php:344
msgid "No events found. Export skipped!"
msgstr "No events found. Export skipped!"
#: php/module.calendar.php:456
msgid "ICS file empty!"
msgstr "ICS file empty!"
#: php/module.calendar.php:594
msgid "Store could not be opened!"
msgstr "Store could not be opened!"
#: php/module.calendar.php:600
msgid "Wrong call, store and entryid have to be set!"
msgstr "Wrong call, store and entryid have to be set!"
#: php/module.calendar.php:634
msgid "No event in ics file"
msgstr "No event in ics file"
#: php/module.calendar.php:647
msgid "File could not be read by server"
msgstr "File could not be read by server"
#: php/upload.php:69
msgid ""
"File could not be moved to TMP path! Check plugin config and folder "
"permissions!"
msgstr ""
"File could not be moved to TMP path! Check plugin config and folder "
"permissions!"
#: php/upload.php:72
msgid "File could not be read by server, upload error!"
msgstr "File could not be read by server, upload error!"

View File

@ -0,0 +1,2 @@
English (US)
eng_USA

View File

@ -1,49 +1,52 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<!DOCTYPE plugin SYSTEM "manifest.dtd"> <!DOCTYPE plugin SYSTEM "manifest.dtd">
<plugin version="2"> <plugin version="2">
<info> <info>
<version>2.2.0</version> <version>2.2.1</version>
<name>calendarimporter</name> <name>calendarimporter</name>
<title>ICS Calendar Importer/Exporter</title> <title>ICS Calendar Importer/Exporter</title>
<author>Christoph Haas</author> <author>Christoph Haas</author>
<authorURL>http://www.sprinternet.at</authorURL> <authorURL>http://www.sprinternet.at</authorURL>
<description>Import or Export a ICS file to/from the zarafa calendar</description> <description>Import or Export a ICS file to/from the Kopano calendar</description>
</info> </info>
<config> <translations>
<configfile>config.php</configfile> <translationsdir>languages</translationsdir>
</config> </translations>
<components> <config>
<component> <configfile>config.php</configfile>
<files> </config>
<server> <components>
<serverfile>php/plugin.calendarimporter.php</serverfile> <component>
<serverfile type="module" module="calendarmodule">php/module.calendar.php</serverfile> <files>
</server> <server>
<client> <serverfile>php/plugin.calendarimporter.php</serverfile>
<clientfile load="release">js/calendarimporter-debug.js</clientfile> <serverfile type="module" module="calendarmodule">php/module.calendar.php</serverfile>
<clientfile load="debug">js/calendarimporter-debug.js</clientfile> </server>
<client>
<clientfile load="source">js/data/timezones.js</clientfile> <clientfile load="release">js/calendarimporter-debug.js</clientfile>
<clientfile load="source">js/data/Actions.js</clientfile> <clientfile load="debug">js/calendarimporter-debug.js</clientfile>
<clientfile load="source">js/data/ResponseHandler.js</clientfile>
<clientfile load="source">js/external/Ext.util.base64.js</clientfile> <clientfile load="source">js/data/timezones.js</clientfile>
<clientfile load="source">js/ui/ContextMenu.js</clientfile> <clientfile load="source">js/data/Actions.js</clientfile>
<clientfile load="source">js/dialogs/ImportContentPanel.js</clientfile> <clientfile load="source">js/data/ResponseHandler.js</clientfile>
<clientfile load="source">js/dialogs/ImportPanel.js</clientfile> <clientfile load="source">js/external/Ext.util.base64.js</clientfile>
<clientfile load="source">js/dialogs/settings/SettingsWidget.js</clientfile> <clientfile load="source">js/ui/ContextMenu.js</clientfile>
<clientfile load="source">js/dialogs/settings/SettingsCalSyncWidget.js</clientfile> <clientfile load="source">js/dialogs/ImportContentPanel.js</clientfile>
<clientfile load="source">js/dialogs/settings/ui/CalSyncGrid.js</clientfile> <clientfile load="source">js/dialogs/ImportPanel.js</clientfile>
<clientfile load="source">js/dialogs/settings/ui/CalSyncPanel.js</clientfile> <clientfile load="source">js/dialogs/settings/SettingsWidget.js</clientfile>
<clientfile load="source">js/dialogs/settings/dialogs/CalSyncEditContentPanel.js</clientfile> <clientfile load="source">js/dialogs/settings/SettingsCalSyncWidget.js</clientfile>
<clientfile load="source">js/dialogs/settings/dialogs/CalSyncEditPanel.js</clientfile> <clientfile load="source">js/dialogs/settings/ui/CalSyncGrid.js</clientfile>
<clientfile load="source">js/plugin.calendarimporter.js</clientfile> <clientfile load="source">js/dialogs/settings/ui/CalSyncPanel.js</clientfile>
</client> <clientfile load="source">js/dialogs/settings/dialogs/CalSyncEditContentPanel.js</clientfile>
<resources> <clientfile load="source">js/dialogs/settings/dialogs/CalSyncEditPanel.js</clientfile>
<resourcefile load="release">resources/css/calendarimporter.css</resourcefile> <clientfile load="source">js/plugin.calendarimporter.js</clientfile>
<resourcefile load="debug">resources/css/calendarimporter.css</resourcefile> </client>
<resourcefile load="source">resources/css/calendarimporter-main.css</resourcefile> <resources>
</resources> <resourcefile load="release">resources/css/calendarimporter.css</resourcefile>
</files> <resourcefile load="debug">resources/css/calendarimporter.css</resourcefile>
</component> <resourcefile load="source">resources/css/calendarimporter-main.css</resourcefile>
</components> </resources>
</files>
</component>
</components>
</plugin> </plugin>

View File

@ -1,7 +1,7 @@
<?php <?php
/** /**
* download.php, zarafa calendar to ics im/exporter * download.php, Kopano calendar to ics im/exporter
* *
* Author: Christoph Haas <christoph.h@sprinternet.at> * Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2016 Christoph Haas * Copyright (C) 2012-2016 Christoph Haas
@ -25,50 +25,49 @@ namespace calendarimporter;
class DownloadHandler class DownloadHandler
{ {
/** /**
* Download the given vcf file. * Download the given vcf file.
* @return bool */
*/ public static function doDownload()
public static function doDownload() {
{ if (isset($_GET["token"])) {
if (isset($_GET["token"])) { $token = $_GET["token"];
$token = $_GET["token"]; } else {
} else { return false;
return false; }
}
if (isset($_GET["filename"])) { if (isset($_GET["filename"])) {
$filename = $_GET["filename"]; $filename = $_GET["filename"];
} else { } else {
return false; return false;
} }
// validate token // validate token
if (!ctype_alnum($token)) { // token is a md5 hash if (!ctype_alnum($token)) { // token is a md5 hash
return false; return false;
} }
$file = PLUGIN_CALENDARIMPORTER_TMP_UPLOAD . "ics_" . $token . ".ics"; $file = PLUGIN_CALENDARIMPORTER_TMP_UPLOAD . "ics_" . $token . ".ics";
if (!file_exists($file)) { // invalid token if (!file_exists($file)) { // invalid token
return false; return false;
} }
// set headers here // set headers here
header('Content-Disposition: attachment; filename="' . $filename . '"'); header('Content-Disposition: attachment; filename="' . $filename . '"');
// no caching // no caching
header('Expires: 0'); // set expiration time header('Expires: 0'); // set expiration time
header('Content-Description: File Transfer'); header('Content-Description: File Transfer');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Length: ' . filesize($file)); header('Content-Length: ' . filesize($file));
header('Content-Type: application/octet-stream'); header('Content-Type: application/octet-stream');
header('Pragma: public'); header('Pragma: public');
flush(); flush();
// print the downloaded file // print the downloaded file
readfile($file); readfile($file);
ignore_user_abort(true); ignore_user_abort(true);
unlink($file); unlink($file);
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
<?php <?php
/** /**
* plugin.calendarimporter.php, zarafa calender to ics im/exporter * plugin.calendarimporter.php, Kopano calender to ics im/exporter
* *
* Author: Christoph Haas <christoph.h@sprinternet.at> * Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2014 Christoph Haas * Copyright (C) 2012-2016 Christoph Haas
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -30,65 +30,65 @@ require_once __DIR__ . "/download.php";
*/ */
class Plugincalendarimporter extends Plugin class Plugincalendarimporter extends Plugin
{ {
/** /**
* Constructor * Constructor
*/ */
function __construct() {} function __construct()
{
}
/** /**
* Function initializes the Plugin and registers all hooks * Function initializes the Plugin and registers all hooks
* *
* @return void * @return void
*/ */
function init() function init()
{ {
$this->registerHook('server.core.settings.init.before'); $this->registerHook('server.core.settings.init.before');
$this->registerHook('server.index.load.custom'); $this->registerHook('server.index.load.custom');
} }
/** /**
* Function is executed when a hook is triggered by the PluginManager * Function is executed when a hook is triggered by the PluginManager
* *
* @param string $eventID the id of the triggered hook * @param string $eventID the id of the triggered hook
* @param mixed $data object(s) related to the hook * @param mixed $data object(s) related to the hook
* @return void * @return void
*/ */
function execute($eventID, &$data) function execute($eventID, &$data)
{ {
switch ($eventID) { switch ($eventID) {
case 'server.core.settings.init.before' : case 'server.core.settings.init.before' :
$this->injectPluginSettings($data); $this->injectPluginSettings($data);
break; break;
case 'server.index.load.custom': case 'server.index.load.custom':
if ($data['name'] == 'download_ics') { if ($data['name'] == 'download_ics') {
calendarimporter\DownloadHandler::doDownload(); calendarimporter\DownloadHandler::doDownload();
} }
break; break;
} }
} }
/** /**
* Called when the core Settings class is initialized and ready to accept sysadmin default * Called when the core Settings class is initialized and ready to accept sysadmin default
* settings. * settings.
* @param Array $data Reference to the data of the triggered hook * @param Array $data Reference to the data of the triggered hook
*/ */
function injectPluginSettings(&$data) function injectPluginSettings(&$data)
{ {
$data['settingsObj']->addSysAdminDefaults(Array( $data['settingsObj']->addSysAdminDefaults(Array(
'zarafa' => Array( 'zarafa' => Array(
'v1' => Array( 'v1' => Array(
'plugins' => Array( 'plugins' => Array(
'calendarimporter' => Array( 'calendarimporter' => Array(
'enable' => PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE, 'enable' => PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE,
'enable_sync' => PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE_SYNC, 'enable_sync' => PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE_SYNC,
'default_calendar' => PLUGIN_CALENDARIMPORTER_DEFAULT, 'default_calendar' => PLUGIN_CALENDARIMPORTER_DEFAULT,
'default_timezone' => PLUGIN_CALENDARIMPORTER_DEFAULT_TIMEZONE 'default_timezone' => PLUGIN_CALENDARIMPORTER_DEFAULT_TIMEZONE
) )
) )
) )
) )
)); ));
} }
} }
?>

View File

@ -1,9 +1,9 @@
<?php <?php
/** /**
* upload.php, zarafa calender to ics exporter * upload.php, Kopano calender to ics im/exporter
* *
* Author: Christoph Haas <christoph.h@sprinternet.at> * Author: Christoph Haas <christoph.h@sprinternet.at>
* Copyright (C) 2012-2014 Christoph Haas * Copyright (C) 2012-2016 Christoph Haas
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -20,18 +20,19 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
*/ */
require_once("../config.php"); require_once("../config.php");
/* disable error printing - otherwise json communication might break... */ /* disable error printing - otherwise json communication might break... */
ini_set('display_errors', '0'); ini_set('display_errors', '0');
/** /**
* respond/echo JSON * respond/echo JSON
* @param $arr * @param $arr
*/ */
function respondJSON($arr) { function respondJSON($arr)
echo json_encode($arr); {
echo json_encode($arr);
} }
/** /**
@ -39,34 +40,34 @@ function respondJSON($arr) {
* @param $length the lenght of the generated string * @param $length the lenght of the generated string
* @return string a random string * @return string a random string
*/ */
function randomstring($length = 6) { function randomstring($length = 6)
// $chars - all allowed charakters {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; // $chars - all allowed charakters
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
srand((double)microtime()*1000000); srand((double)microtime() * 1000000);
$i = 0; $i = 0;
$pass = ""; $pass = "";
while ($i < $length) { while ($i < $length) {
$num = rand() % strlen($chars); $num = rand() % strlen($chars);
$tmp = substr($chars, $num, 1); $tmp = substr($chars, $num, 1);
$pass = $pass . $tmp; $pass = $pass . $tmp;
$i++; $i++;
} }
return $pass; return $pass;
} }
$destpath = PLUGIN_CALENDARIMPORTER_TMP_UPLOAD; $destpath = PLUGIN_CALENDARIMPORTER_TMP_UPLOAD;
$destpath .= $_FILES['icsdata']['name'] . randomstring(); $destpath .= $_FILES['icsdata']['name'] . randomstring();
if(is_readable ($_FILES['icsdata']['tmp_name'])) { if (is_readable($_FILES['icsdata']['tmp_name'])) {
$result = move_uploaded_file($_FILES['icsdata']['tmp_name'],$destpath); $result = move_uploaded_file($_FILES['icsdata']['tmp_name'], $destpath);
if($result) { if ($result) {
respondJSON(array ('success'=>true, 'ics_file'=>$destpath)); respondJSON(array('success' => true, 'ics_file' => $destpath));
} else { } else {
respondJSON(array ('success'=>false,'error'=>"File could not be moved to TMP path! Check plugin config and folder permissions!")); respondJSON(array('success' => false, 'error' => dgettext("plugin_calendarimporter", "File could not be moved to TMP path! Check plugin config and folder permissions!")));
} }
} else { } else {
respondJSON(array ('success'=>false,'error'=>"File could not be read by server, upload error!")); respondJSON(array('success' => false, 'error' => dgettext("plugin_calendarimporter", "File could not be read by server, upload error!")));
} }
?>