diff --git a/config/alfresco/messages/office-addin.properties b/config/alfresco/messages/office-addin.properties index 07914ae865..fb16179a28 100644 --- a/config/alfresco/messages/office-addin.properties +++ b/config/alfresco/messages/office-addin.properties @@ -1,6 +1,7 @@ ## ## Microsoft Office Add-In Messages ## +# Page Titles office.title.my_alfresco=My Alfresco office.title.navigation=Browse Spaces and Documents office.title.search=Search Alfresco @@ -8,16 +9,132 @@ office.title.document_details=Document Details office.title.my_tasks=My Tasks office.title.document_tags=Document Tags -## My Alfresco -office.my_alfresco.my_checked_out_documents=My Checked Out Documents +# Headers and Subheaders +office.header.my_checked_out_documents=My Checked Out Documents +office.header.my_tasks=My Tasks +office.header.current_space=Current Space +office.header.spaces_in=Spaces in {0} +office.header.documents_in=Documents in {0} +office.header.document_actions=Document Actions +office.header.actions=Actions +office.header.details=Current Document Details +office.header.document_tags=Document Tags +office.header.document_tags.for=Document Tags for {0} +office.header.version_history=Version History +office.header.version_history.for=Version History for {0} +office.header.search=Search +office.header.task_details=Task Details +office.header.tag_cloud=Tag Cloud +office.header.tagged=Tagged Documents -## Navigation -office.navigation.header=Current Space +# Document Status +office.status.locked=Locked -## Search +# Actions +office.action.add_tag=Add a tag +office.action.remove_tag=Remove tag "{0}" +office.action.download=Download {0} +office.action.open=Open {0} +office.action.make_versionable=Make Versionable +office.action.compare_current=Compare with current +office.action.checkin=Check In +office.action.checkin.description=Check in the current document. +office.action.checkout=Check Out +office.action.checkout.description=Check out the current document to a working copy. +office.action.start_workflow=Start Workflow +office.action.start_workflow.description=Start Advanced Workflow for the current document. +office.action.transform_pdf=Transform to PDF +office.action.transform_pdf.description=Transform to Adobe PDF format. +office.action.open_details=Open Full Details +office.action.open_details.description=Open the document details in Alfresco Explorer. +office.action.save_to_alfresco=Save To Alfresco +office.action.save_to_alfresco.description=Allows you to place the current document under Alfresco management. +office.action.insert=Insert File into Current Document +office.action.create_collaboration_space=Create Collaboration Space +office.action.create_collaboration_space.description=Create a new Collaboration Space in the Alfresco Repository. +office.action.launch_alfresco=Launch Alfresco +office.action.launch_alfresco.description=Start the Alfresco Explorer Web Client. +office.action.userhome=To User Home Space +office.action.parent_space=Up to Parent Space +office.action.create_space=Create New Space +office.action.create_collaboration_space=Create New Collaboration Space +office.action.delete=Delete +office.action.return_search=Back to Search Results +office.action.return_search.description=Return to the Search Tab +office.action.manage_task=Manage -## Document Details +# Buttons +office.button.submit=Submit +office.button.cancel=Cancel +office.button.ok=OK +office.button.search=Search -## My Tasks +# Messages +office.message.unmanaged=The current document is not managed by Alfresco. +office.message.unversioned=The current document is not versioned. +office.message.none=None +office.message.no_documents=No documents +office.message.no_due_date=No due date +office.message.no_tasks=No tasks +office.message.no_subspaces=No subspaces +office.message.search_for=Search for +office.message.results_max.before=Return a maximum of +office.message.results_max.after=items +office.message.no_results=No results found +office.message.confirm_delete=Are you sure you want to delete this document? +office.message.enter_workflow_details=Enter new workflow details below +office.message.workflow_action_complete=Workflow action '{0}' completed. -## Document Tags \ No newline at end of file +# Properties +office.property.title=Title +office.property.description=Description +office.property.creator=Creator +office.property.created=Created +office.property.modifier=Modifier +office.property.modified=Modified +office.property.size=Size +office.property.categories=Categories +office.property.author=Author +office.property.date=Date +office.property.due_date=Due date +office.property.name=Name +office.property.template=Template +office.property.filename=Document filename +office.property.workflow=Workflow +office.property.assign_to=Assign to +office.property.due_on=Due on +office.property.status=Status +office.property.priority=Priority +office.property.start_date=Start Date +office.property.type=Type +office.property.complete=Complete + +# Workflow +office.workflow.review=Review and Approve +office.workflow.adhoc=Adhoc Task + +# Result messages +office.result.failed=Action failed +office.result.convert.failed=Could not convert document +office.result.converted=Document converted +office.result.delete.failed=Could not delete document +office.result.deleted=Document deleted +office.result.checkout.failed=Could not checkout document +office.result.checked_out=Document checked out +office.result.checkin.failed=Could not checkin document +office.result.checked_in=Document checked in +office.result.version.failed=Could not version document +office.result.versioned=Document versioned +office.result.workflow_started=New workflow started +office.result.unknown=Unknown action +office.result.exception=Action failed due to exception +office.result.create_space.failed=Could not create space +office.result.create_space.missing_name=Space must have a Name +office.result.space_created=New space created + +# Miscellaneous +office.unit.kb=KB +office.version.notes=Notes +office.task.overdue=overdue +office.task.due_today=due today +office.tip.task_item=Task item diff --git a/config/alfresco/messages/office-addin_de_DE.properties b/config/alfresco/messages/office-addin_de_DE.properties new file mode 100644 index 0000000000..5615375282 --- /dev/null +++ b/config/alfresco/messages/office-addin_de_DE.properties @@ -0,0 +1,139 @@ +## +## Microsoft Office Add-In Messages +## +# Page Titles +office.title.my_alfresco=Mein Alfresco +office.title.navigation=Verzeichnisse und Dokumente durchsuchen +office.title.search=In Alfresco suchen +office.title.document_details=Detailinformationen ansehen +office.title.my_tasks=Meine Aufgaben +office.title.document_tags=Dokumente Tags + +# Headers and Subheaders +office.header.my_checked_out_documents=Meine ausgecheckten Dokumente +office.header.my_tasks=Meine Aufgaben +office.header.current_space=Aktuelles Verzeichnis +office.header.spaces_in=Ordner in {0} +office.header.documents_in=Dokumente in {0} +office.header.document_actions=Dokumente Aktionen +office.header.actions=Aktionen +office.header.details=Aktuelle Detailinformationen zum Dokument +office.header.document_tags=Dokumente Tags +office.header.document_tags.for=Dokumente Tags für {0} +office.header.version_history=Vorgangshistorie +office.header.version_history.for=Vorgangshistorie für {0} +office.header.search=Suche +office.header.task_details=Detailinformationen zum Aufgaben +office.header.tag_cloud=Tagwolke +office.header.tagged=Dokumente mit Tag + +# Document Status +office.status.locked=gesperrt + +# Actions +office.action.add_tag=Tag hinzufügen +office.action.remove_tag=Tag "{0}" entfernen +office.action.download=Herunterladen {0} +office.action.open=Öffnen {0} +office.action.make_versionable=Versionierung generieren +office.action.compare_current=Vergleich mit aktuellem Dokument +office.action.checkin=Check-in +office.action.checkin.description=Aktuelles Dokument zuweisen +office.action.checkout=Check-out +office.action.checkout.description=Aktuelles Dokument als Arbeitskopie auslesen +office.action.start_workflow=Workflow anlegen +office.action.start_workflow.description=Workflow mit aktuelles Dokument anlegen +office.action.transform_pdf=In PDF konvertieren +office.action.transform_pdf.description=Aktuelles Dokument in ein Adobe PDF Format konvertieren +office.action.open_details=Dateilinformationen öffnen +office.action.open_details.description=Detailinformationen zum aktuellen Dokument im Alfresco Explorer öffnen +office.action.save_to_alfresco=Speichern unter Alfresco +office.action.save_to_alfresco.description=Das aktuelle Dokument kann im Alfresco Management abgelegt werden +office.action.insert=Datei in aktuelles Dokument einfügen +office.action.create_collaboration_space=Neues Verzeichnis anlegen +office.action.create_collaboration_space.description=Im Alfresco Aktenplan und Aktenverzeichnis einen neuen Ornder anlegen +office.action.launch_alfresco=Alfresco starten +office.action.launch_alfresco.description=Den Alfresco Web Client starten +office.action.userhome=Meine Basis +office.action.parent_space=Ebene nach oben +office.action.create_space=Neu Anlegen +office.action.create_collaboration_space=Neu Anlegen (Mitarbeit) +office.action.delete=Löschen +office.action.return_search=Zurück zu Ergebnissen +office.action.return_search.description=Zurück zu den Suchergebnissen + +# Buttons +office.button.submit=Zusenden +office.button.cancel=Abbrechen +office.button.ok=OK +office.button.search=Suche + +# Messages +office.message.unmanaged=Das aktuelle Dokument wird nicht von Alfresco verwaltet. +office.message.unversioned=Das aktuelle Dokument ist nicht versioniert +office.message.none=keine +office.message.no_documents=Keine Dokumente +office.message.no_due_date=Kein Abgabedatum +office.message.no_tasks=Keine Aufgaben +office.message.no_subspaces=Kein Ordner +office.message.search_for=Suche nach +office.message.results_max.before=Erhalte ein Maximum von +office.message.results_max.after=Ergebnisse +office.message.no_results=Keine Suchergebnisse +office.message.confirm_delete=Möchten Sie dieses Dokument wirklich löschen +office.message.enter_workflow_details=Workfloweinstellungen +office.message.workflow_action_complete=Workflow '{0}' abgeschlossen + +# Properties +office.property.title=Titel +office.property.description=Beschreibung +office.property.creator=Erstellt von +office.property.created=Erstellt am +office.property.modifier=Bearbeiter +office.property.modified=Bearbeitet am +office.property.size=Größe +office.property.categories=Kategorien +office.property.author=Erfasser +office.property.date=Datum +office.property.due_date=Abgabedatum +office.property.name=Name +office.property.template=Template +office.property.filename=Dateiname +office.property.workflow=Workflow +office.property.assign_to=Zuweisen zu +office.property.due_on=Abgabedatum +office.property.status=Status +office.property.priority=Priorität +office.property.start_date=Beginn +office.property.type=Typ +office.property.complete=Abgeschlossen + +# Workflow +office.workflow.review=Überprüft und genehmigt +office.workflow.adhoc=Adhoc Task + +# Result messages +office.result.failed=Action failed +office.result.convert.failed=Could not convert document +office.result.converted=Document converted +office.result.delete.failed=Could not delete document +office.result.deleted=Document deleted +office.result.checkout.failed=Could not checkout document +office.result.checked_out=Document checked out +office.result.checkin.failed=Could not checkin document +office.result.checked_in=Document checked in +office.result.version.failed=Could not version document +office.result.versioned=Document versioned +office.result.workflow_started=New workflow started +office.result.unknown=Unknown action +office.result.exception=Action failed due to exception +office.result.create_space.failed=Could not create space +office.result.create_space.missing_name=Space must have a Name +office.result.space_created=Ordner angelegt + +# Miscellaneous +office.unit.kb=KB +office.version.notes=Notizen +office.task.overdue=überfällig +office.task.due_today=heute fällig +office.tip.task_item=Aufgaben diff --git a/source/web/css/office.css b/source/web/css/office.css index 4e76bb09f3..b252071bc3 100644 --- a/source/web/css/office.css +++ b/source/web/css/office.css @@ -502,6 +502,22 @@ input.button { width: 160px; } +.searchButton { + background-color: #cce6ff; + border: 1px solid #0073e6; + color: #0073e6; + float: left; + font-size: 11px; + font-weight: bold; + cursor: pointer; + margin: 0px 0px 0px 4px; + padding: 4px; + filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#ffffff', EndColorStr='#cce6ff'); +} + +.searchButtonDisabled { +} + #searchResultsList { overflow: hidden; } diff --git a/source/web/images/office/info.gif b/source/web/images/office/info.gif new file mode 100644 index 0000000000..7697b05332 Binary files /dev/null and b/source/web/images/office/info.gif differ diff --git a/source/web/scripts/office/external_component.js b/source/web/scripts/office/external_component.js new file mode 100755 index 0000000000..9d1528a820 --- /dev/null +++ b/source/web/scripts/office/external_component.js @@ -0,0 +1,270 @@ +/** + * External component static wrapper that composes and 'calls' external component methods + */ +var ExternalComponent = +{ + extender: null, + + init: function(params, extenderType) + { + if (typeof extenderType == "undefined") + { + // MSOffice mode check + extenderType = (typeof top.window.external != "undefined" && typeof top.window.external.saveToAlfresco != "undefined") ? "msoffice" : "openoffice"; + } + + switch (extenderType.toLowerCase()) + { + case "msoffice": + this.extender = new MSOffice(params); + break; + + case "openoffice": + this.extender = new OpenOffice(params); + break; + + default: + alert('ExtenderType "' + extenderType + '" is not supported.'); + return; + } + }, + + openDocument: function() + { + return this.extender.openDocument.apply(this.extender, arguments); + }, + + docHasExtension: function() + { + return this.extender.docHasExtension.apply(this.extender, arguments); + }, + + saveToAlfresco: function() + { + return this.extender.saveToAlfresco.apply(this.extender, arguments); + }, + + saveToAlfrescoAs: function() + { + return this.extender.saveToAlfrescoAs.apply(this.extender, arguments); + }, + + compareDocument: function() + { + return this.extender.compareDocument.apply(this.extender, arguments); + }, + + insertDocument: function() + { + return this.extender.insertDocument.apply(this.extender, arguments); + } +} + + +/** + * External component wrapper for Microsoft Internet Explorer and MSOffice add-in + */ +var MSOffice = new Class( +{ + params: {}, + + initialize: function(params) + { + $extend(this.params, params); + }, + + openDocument: function(relativePath) + { + window.external.openDocument(relativePath); + }, + + docHasExtension: function(fnTrue, fnFalse) + { + if (window.external.docHasExtension()) + { + fnTrue.apply(arguments.callee); + } + else + { + fnFalse.apply(arguments.callee); + } + }, + + saveToAlfresco: function(relativePath) + { + return window.external.saveToAlfresco(relativePath); + }, + + saveToAlfrescoAs: function(relativePath, filename) + { + return window.external.saveToAlfrescoAs(relativePath, filename); + }, + + compareDocument: function(url) + { + return window.external.compareDocument(url); + }, + + insertDocument: function(relativePath) + { + return window.external.insertDocument(); + } +}); + + +/** + * External component wrapper for OpenOffice.org add-in + */ +var OpenOffice = new Class( +{ + debugMode: false, + queryResults: [], + params: {}, + + initialize: function(params) + { + $extend(this.params, params); + }, + + // Open document with given relativePath + openDocument: function(relativePath) + { + with (this) + { + logDebug('openDocument', 'relativePath=' + relativePath); + doExternalCall('openDocument', relativePath); + } + }, + + // call external hoster object method + docHasExtension: function(functionIfTrue, functionIfFalse) + { + with (this) + { + logDebug('docHasExtension', 'functionIfTrue, functionIfFalse'); + queryResults["docHasExtension"] = null; + checkBooleanResult(10, 'docHasExtension', functionIfTrue, functionIfFalse).delay(100, this); + doExternalCall('docHasExtension', '').delay(1000, this); + } + }, + + // call external hoster object method + saveToAlfresco: function(currentPath) + { + with (this) + { + logDebug('saveToAlfresco', 'currentPath=' + currentPath); + doExternalCall('saveToAlfresco', currentPath); + } + }, + + // call external hoster object method + saveToAlfrescoAs: function(currentPath, filename) + { + with (this) + { + logDebug('saveToAlfrescoAs', 'currentPath=' + currentPath + ", filename=" + filename); + doExternalCallEx('saveToAlfrescoAs', currentPath, filename); + } + }, + + compareDocument: function(currentPath) + { + with (this) + { + logDebug('compareDocument', 'currentPath=' + currentPath); + doExternalCall('compareDocument', currentPath); + } + }, + + // Insert a document into the currently open one + insertDocument: function(relativePath) + { + with (this) + { + logDebug('insertDocument', 'relativePath=' + relativePath); + doExternalCall('insertDocument', relativePath); + } + }, + + + /** + * Implementation-specific functions + */ + + // Set external method call result + setResult: function(methodName, success) + { + with (this) + { + logDebug('setResult', 'method=' + methodName + ', success=' + success); + queryResults[methodName] = success; + } + }, + + // used by timer for checking boolean result of external method call + checkBooleanResult: function(maxCount, methodName, functionIfTrue, functionIfFalse) + { + with (this) + { + var result = queryResults[methodName]; + logDebug('checkBooleanResult', 'waiting: maxCount=' + maxCount + ", methodName=" + methodName + ", ..."); + if (result != null) + { + if (result) + { + functionIfTrue(); + } + else + { + functionIfFalse(); + } + return; + } + if (maxCount <= 0) + { + logDebug('checkBooleanResult', 'waiting timeout: maxCount=' + maxCount + ", methodName=" + methodName + ", ..."); + return; + } + checkBooleanResult(maxCount-1, methodName, functionIfTrue, functionIfFalse).delay(1000, this); + } + }, + + // compose URL for purpose to call external object method + doExternalCall: function(methodName, path) + { + with (this) + { + var newUrl = params.folderPath + "callexternal?extcall=&action=" + methodName + + "&path=" + path + "&ts=" + new Date().getTime() + + (params.ticket != "" ? "&ticket=" + params.ticket : ""); + logDebug('doExternalCall', 'url=' + newUrl); + $("if_externalComponenetMethodCall").src = newUrl; + } + }, + + // compose URL for purpose to call external object method + doExternalCallEx: function(methodName, path, filename) + { + with (this) + { + var newUrl = params.folderPath + "callexternal?extcall=&action=" + methodName + + "&path=" + path + "&filename=" + filename + "&ts=" + new Date().getTime() + + (params.ticket != "" ? "&ticket=" + params.ticket : ""); + logDebug('doExternalCallEx', 'url=' + newUrl); + $("if_externalComponenetMethodCall").src = newUrl; + } + }, + + // logger method + logDebug: function(methodName, message) + { + with (this) + { + if (debugMode.enabled && debugMode.methods[methodName]) + { + alert("[DEBUG][ExternalComponent::" + methodName + "] " + message); + } + } + } +}); diff --git a/source/web/scripts/office/my_alfresco.js b/source/web/scripts/office/my_alfresco.js index 9940528d46..99ba81ef33 100644 --- a/source/web/scripts/office/my_alfresco.js +++ b/source/web/scripts/office/my_alfresco.js @@ -6,11 +6,15 @@ var OfficeMyAlfresco = { TOGGLE_AMOUNT: 150, ANIM_LENGTH: 800, + taskCount: 0, init: function() { - OfficeAddin.sortTasks($('taskList')); - OfficeMyAlfresco.setupTasks(); + if (OfficeMyAlfresco.taskCount > 0) + { + OfficeAddin.sortTasks($('taskList')); + OfficeMyAlfresco.setupTasks(); + } OfficeMyAlfresco.setupToggles(); }, diff --git a/source/web/scripts/office/navigation.js b/source/web/scripts/office/navigation.js index 175414a28a..cdfd2e49d4 100644 --- a/source/web/scripts/office/navigation.js +++ b/source/web/scripts/office/navigation.js @@ -34,7 +34,12 @@ var OfficeNavigation = var toggles = $$('.toggle'); // Animation - var fxPanel = new Fx.Elements(panels, {wait: false, duration: OfficeNavigation.ANIM_LENGTH, transition: Fx.Transitions.Back.easeInOut}); + var fxPanel = new Fx.Elements(panels, + { + wait: false, + duration: OfficeNavigation.ANIM_LENGTH, + transition: Fx.Transitions.Back.easeInOut + }); panels.each(function(panel, i) { @@ -183,9 +188,13 @@ var OfficeNavigation = actionURL += "&st=" + encodeURIComponent(spaceTitle); actionURL += "&sd=" + encodeURIComponent(spaceDescription); actionURL += "&t=" + encodeURIComponent(spaceTemplate); - var myAjax = new Ajax(actionURL, { + var myAjax = new Ajax(actionURL, + { method: 'get', - headers: {'If-Modified-Since': 'Sat, 1 Jan 2000 00:00:00 GMT'}, + headers: + { + 'If-Modified-Since': 'Sat, 1 Jan 2000 00:00:00 GMT' + }, onComplete: function(textResponse, xmlResponse) { // Remove any trailing hash @@ -206,16 +215,14 @@ var OfficeNavigation = saveToAlfresco: function(currentPath) { - // Does the current doc have an extension? - if (!window.external.docHasExtension()) + // Does the current doc have an extension? - async request + ExternalComponent.docHasExtension(function() { - // No - we need to ask for a filename - OfficeNavigation.showSaveFilenamePanel(currentPath); - } - else + ExternalComponent.saveToAlfresco(currentPath) + }, function() { - window.external.saveToAlfresco(currentPath); - } + OfficeNavigation.showSaveFilenamePanel(currentPath) + }); }, showSaveFilenamePanel: function(currentPath) @@ -291,7 +298,7 @@ var OfficeNavigation = if (!cancelSave) { - window.external.saveToAlfrescoAs(currentPath, filename); + ExternalComponent.saveToAlfrescoAs(currentPath, filename); } } OfficeNavigation.saveCancel(); diff --git a/source/web/scripts/office/office_addin.js b/source/web/scripts/office/office_addin.js index cb1155f2df..991d7a1520 100644 --- a/source/web/scripts/office/office_addin.js +++ b/source/web/scripts/office/office_addin.js @@ -233,7 +233,7 @@ var OfficeAddin = // Register our "well known" callback function window.alfrescoCallback = OfficeAddin.openWindowOnCallback; // Use a named window so that only one dialog is active at a time - window.open(url, 'alfrescoDialog', 'width=1024,height=768'); + window.open(url, 'alfrescoDialog', 'width=1024,height=768,scrollbars=yes'); }, openWindowOnCallback: function(fromTimeout) diff --git a/source/web/scripts/office/search.js b/source/web/scripts/office/search.js index e9ab2b872a..efc13b3d68 100644 --- a/source/web/scripts/office/search.js +++ b/source/web/scripts/office/search.js @@ -4,6 +4,8 @@ */ var OfficeSearch = { + MIN_LENGTH: 3, + init: function() { $('searchText').addEvent('keydown', function(event) @@ -16,6 +18,8 @@ var OfficeSearch = }); $('itemsFound').innerHTML = "Results Shown Below"; + + $('searchText').focus(); }, itemsFound: function(shownResults, totalResults) @@ -39,11 +43,16 @@ var OfficeSearch = /* AJAX call to perform server-side search */ runSearch: function(useTemplate, argPath) { - OfficeAddin.showStatusText("Searching...", "ajax_anim.gif", false); - var searchString = $('searchText').value; var maxResults = $('maxResults').value; + + if (searchString.length < OfficeSearch.MIN_LENGTH) + { + OfficeAddin.showStatusText("Minimum " + OfficeSearch.MIN_LENGTH + " characters.", "info.gif", true); + return; + } + OfficeAddin.showStatusText("Searching...", "ajax_anim.gif", false); var actionURL = useTemplate + argPath + "&search=" + encodeURIComponent(searchString) + "&maxresults=" + maxResults; var myAjax = new Ajax(actionURL, { method: 'get',