Office Addin Manifest With a Ribbon Button for Office 2013 - ms-word

I have built a Word addin manifest that inserts a button in the Home tab. Button opens a taskpane, addin does not use commands, therefore is suitable not only for Office 2016, but for Office 2013 as well.
Even though the addin works fine on both Office versions, the button is inserted into the Home tab on Office 2016, but not on 2013.
I suspect there may be something else expected in the manifest, even though I read that VersionOverrides node is sufficient to support both versions.
This is the manifest that shows no problem in Word 2016:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OfficeApp
xmlns="http://schemas.microsoft.com/office/appforoffice/1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0"
xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides"
xsi:type="TaskPaneApp">
<Id>05c2e1c9-3e1d-406e-9a91-e9ac64854143</Id>
<Version>1.0.0.0</Version>
<ProviderName>DEMO</ProviderName>
<DefaultLocale>en-US</DefaultLocale>
<DisplayName DefaultValue="Name">
<Override Locale="en-US" Value="Name" />
</DisplayName>
<Description DefaultValue="Addin" >
<Override Locale="en-US" Value="Addin" />
</Description>
<IconUrl DefaultValue="https://localhost:3000/assets/logo-32.png"/>
<HighResolutionIconUrl DefaultValue="https://localhost:3000/assets/logo-80.png"/>
<SupportUrl DefaultValue="support.com" />
<AppDomains>
<AppDomain>localhost</AppDomain>
</AppDomains>
<Hosts>
<Host Name="Document"/>
</Hosts>
<DefaultSettings>
<SourceLocation DefaultValue="https://localhost:3000/taskpane.html"/>
</DefaultSettings>
<Permissions>ReadWriteDocument</Permissions>
<ov:VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0">
<ov:Hosts>
<ov:Host xsi:type="Document">
<ov:DesktopFormFactor>
<ov:GetStarted>
<ov:Title resid="GetStarted.Title"/>
<ov:Description resid="GetStarted.Description"/>
<ov:LearnMoreUrl resid="GetStarted.LearnMoreUrl"/>
</ov:GetStarted>
<ov:ExtensionPoint xsi:type="PrimaryCommandSurface">
<ov:OfficeTab id="TabHome">
<ov:Group id="AddinGroup">
<ov:Label resid="CommandsGroup.Label" />
<ov:Icon>
<bt:Image size="16" resid="Icon.16x16" />
<bt:Image size="32" resid="Icon.32x32" />
<bt:Image size="80" resid="Icon.80x80" />
</ov:Icon>
<ov:Control xsi:type="Button" id="AddinButton">
<ov:Label resid="AddinButton.Label" />
<ov:Supertip>
<ov:Title resid="AddinButton.Label" />
<ov:Description resid="AddinButton.Tooltip" />
</ov:Supertip>
<ov:Icon>
<bt:Image size="16" resid="Icon.16x16" />
<bt:Image size="32" resid="Icon.32x32" />
<bt:Image size="80" resid="Icon.80x80" />
</ov:Icon>
<ov:Action xsi:type="ShowTaskpane">
<ov:TaskpaneId>AddinButtonTaskpane</ov:TaskpaneId>
<ov:SourceLocation resid="AddinTaskpane.Url" />
</ov:Action>
</ov:Control>
</ov:Group>
</ov:OfficeTab>
</ov:ExtensionPoint>
</ov:DesktopFormFactor>
</ov:Host>
</ov:Hosts>
<ov:Resources>
<bt:Images>
<bt:Image id="Icon.16x16" DefaultValue="https://localhost:3000/assets/logo-16.png"/>
<bt:Image id="Icon.32x32" DefaultValue="https://localhost:3000/assets/logo-32.png"/>
<bt:Image id="Icon.80x80" DefaultValue="https://localhost:3000/assets/logo-80.png"/>
</bt:Images>
<bt:Urls>
<bt:Url id="GetStarted.LearnMoreUrl" DefaultValue="http://started.com" />
<bt:Url id="AddinTaskpane.Url" DefaultValue="https://localhost:3000/taskpane.html" />
</bt:Urls>
<bt:ShortStrings>
<bt:String id="GetStarted.Title" DefaultValue="GetStarted" >
</bt:String>
<bt:String id="CommandsGroup.Label" DefaultValue="Addin" >
</bt:String>
<bt:String id="AddinButton.Label" DefaultValue="Addin" >
</bt:String>
</bt:ShortStrings>
<bt:LongStrings>
<bt:String id="GetStarted.Description" DefaultValue="GetStarted" >
</bt:String>
<bt:String id="AddinButton.Tooltip" DefaultValue="Addin" >
</bt:String>
</bt:LongStrings>
</ov:Resources>
</ov:VersionOverrides>
</OfficeApp>

Add-in commands are not supported on Word 2013. For more information on supported platforms for add-in commands see here

Related

finding target worksheet for action in twb (xml) file

My intention is to find target worksheet for actions in tableau workbook. where should I search for that target worksheet correspond to some particular action in twb(xml) file?
For example:
<actions>
<action caption='Filter 1 (generated)' name='[Action1]'>
<activation auto-clear='true' type='on-select' />
<source dashboard='Figure 8-60 thought 8-65' type='sheet' worksheet='Heat Map' />
<command command='tsc:tsl-filter'>
<param name='special-fields' value='all' />
<param name='target' value='Figure 8-60 thought 8-65' />
</command>
</action>
<action caption='Filter 2 (generated)' name='[Action2]'>
<activation auto-clear='true' type='on-select' />
<source dashboard='Figure 8-59' type='sheet' worksheet='Poor Filter Design' />
<command command='tsc:tsl-filter'>
<param name='special-fields' value='all' />
<param name='target' value='Figure 8-59' />
</command>
</action>
<action caption='Filter 3 (generated)' name='[Action3]'>
<activation auto-clear='true' type='on-select' />
<source dashboard='Figure 8-59' type='sheet' worksheet='Good Filter Design' />
<command command='tsc:tsl-filter'>
<param name='special-fields' value='all' />
<param name='target' value='Figure 8-59' />
</command>
</action>
</actions>
As you can see above code filter1 action got a param tag inside that target attribute is present, but the value present there is a dashoard name. What i want is target woksheet corresponded to the action filter.
Tried to play a bit with .twb file and got this for dashboard actions:
<actions>
<action caption='Filter 1 (generated)' name='[Action1]'>
<activation auto-clear='true' type='on-select' />
<source dashboard='Dashboard 1' type='sheet' worksheet='Sheet 3' />
<command command='tsc:tsl-filter'>
<param name='special-fields' value='all' />
<param name='target' value='Dashboard 1' />
</command>
</action>
<action caption='Filter 2 (generated)' name='[Action2]'>
<activation auto-clear='true' type='on-select' />
<source dashboard='Dashboard 2' type='sheet' worksheet='Sheet 2' />
<command command='tsc:tsl-filter'>
<param name='special-fields' value='all' />
<param name='target' value='Dashboard 2' />
</command>
</action>
<action caption='Filter 3 (generated)' name='[Action3]'>
<activation auto-clear='true' type='on-select' />
<source dashboard='Dashboard 2' type='sheet' worksheet='Sheet 3' />
<command command='tsc:tsl-filter'>
<param name='special-fields' value='all' />
<param name='target' value='Dashboard 2' />
</command>
</action>
</actions>
Honestly I couldn't find any direct link to the target sheet while source sheet is always available in actions, This can be observed in Actions window.
But I was able to see the actions that were mapped to target sheets if we go to the individual sheet actions instead of dashboard actions where we can see target as dashboard.
See below data where I have created a dummy dashboard to check actions.
These are the actions that created in report:
<group caption='Action (Product Category)' hidden='true' name='[Action (Product Category)]' name-style='unqualified' user:auto-column='sheet_link'>
<groupfilter function='crossjoin'>
<groupfilter function='level-members' level='[Product Category]' />
</groupfilter>
</group>
<group caption='Action (Product Sub-Category)' hidden='true' name='[Action (Product Sub-Category)]' name-style='unqualified' user:auto-column='sheet_link'>
<groupfilter function='crossjoin'>
<groupfilter function='level-members' level='[Product Sub-Category]' />
</groupfilter>
</group>
Along with this if we go to individual sheets then we can see the actions mapped first one is for Sheet 2 and other is for Sheet 3:
<filter class='categorical' column='[federated.0idnrl40bk56fg130xiy30dnljux].[Action (Product Category)]'>
<groupfilter function='level-members' level='[Product Category]' user:ui-enumeration='all' user:ui-marker='enumerate' />
</filter>
<slices>
<column>[federated.0idnrl40bk56fg130xiy30dnljux].[Action (Product Category)]</column>
</slices>
<filter class='categorical' column='[federated.0idnrl40bk56fg130xiy30dnljux].[Action (Product Sub-Category)]'>
<groupfilter function='level-members' level='[Product Sub-Category]' user:ui-enumeration='all' user:ui-marker='enumerate' />
</filter>
<slices>
<column>[federated.0idnrl40bk56fg130xiy30dnljux].[Action (Product Sub-Category)]</column>
</slices>
If we keep track of actions that were created in dashboards then we can easily tell what all sheets are joined in a dashboard using the name of the actions.
Would like to know your thoughts and observations aswell.
Changing the names of the actions
Going into the .twb XML and changing the order of the <> blocks.
Going into the .twb XML and changing the internal Action1, Action2, etc. names. Doing this I'm able to change which of Dashboard 2 and Dashboard 3 is opened.
adding a Web Page object to Dashboard 1 and then a URL action using about:blank as the target, on the idea that maybe URL actions take precedence over filter actions.

flux:form.section inside another flux:form.section not rendering flux:form.object Properly

I am creating a Layerslider with Fluid Content Element (FCE).
Below Is my code.
<flux:form.sheet name="elements" label="Elements">
<flux:form.section name="slides" label="Slides">
<flux:form.object name="slide" label="Slide">
<flux:field.input name="title" label="Slide Title" />
<flux:field.text name="layersliderdata" enableRichText="0" rows="4" label="Layerslider data" />
<flux:field.file name="background" allowed="jpg,png,jpeg,gif" label="Background" />
<flux:field.file name="thumbnail" allowed="jpg,png,jpeg,gif" label="Thumbnail" />
<flux:form.section name="elements" label="Elements">
<flux:form.object name="text" label="Text">
<flux:field.text name="content" rows="3" label="Text" />
<flux:field.select name="type" items="p,h1,h2,h3,h4,h5,h6,h7,h8" label="Type" />
<f:render section="SharedObjectFields" arguments="{_all}" />
</flux:form.object>
<flux:form.object name="image" label="Image">
<flux:field.file name="file" allowed="jpg,png,jpeg,gif" label="Image file" />
<f:render section="SharedObjectFields" arguments="{_all}" />
</flux:form.object>
</flux:form.section>
</flux:form.object>
</flux:form.section>
</flux:form.sheet>
<f:section name="SharedObjectFields">
<flux:field.text name="style" enableRichText="0" rows="4" label="CSS Styles" />
<flux:field.text name="layersliderdata" enableRichText="0" rows="4" label="Layerslider data" />
<flux:field.input name="class" label="Class" />
</f:section>
I am Getting Result Like this.
But I want Result as per below screenshot.
I Dont Know. What's going wrong.
I am using below Versions of fluid elements.
Typo3 6.2.14
vhs 2.3.3
fluidcontent 4.2.4
fluidpages 3.2.3
flux 7.2.1
I can confirm this on dcngmbh/moox_core for Split Button with DropDown FCE (Fluid Content Element) in which its display result in backend like this.
http://screencast.com/t/wIeYk8AUmGl
http://screencast.com/t/QLqnSmpy
I faced the same issue some days ago using fluidcontent. It seems, there is a bug in flux, which has been fixed in the GitHub repositories. You could try to switch to the development version of flux or wait for an official release on TER.

Joomla 3 cannot disable custom plugin

I just installed a custom plugin in Joomla 3 and now I cannot disable it.
When I click disable (or edit) I receive "Internal Server Error".
xml file:
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.0" type="plugin" group="content">
<name>Content - Availability Calendar</name>
<author>Joomla! Project</author>
<creationDate>2010</creationDate>
<copyright>Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.</copyright>
<license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL</license>
<authorEmail>support#msc.gr</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>1.5</version>
<description></description>
<files>
<filename plugin="calendar">calendar.php</filename>
<filename>index.html</filename>
</files>
<params>
<param name="unit_id" type="text" size="5" default="50" label="Villa ID" description="Villa ID"/>
</params>
</extension>
You're XML code is old and is based on the code used for Joomla 1.5. You need to replace the following:
<params>
<param name="unit_id" type="text" size="5" default="50" label="Villa ID" description="Villa ID"/>
</params>
with this:
<config>
<fields name="params">
<fieldset name="basic">
<field name="unit_id" type="text" size="5" default="50" label="Villa ID" description="Villa ID"/>
</fieldset>
</fields>
</config>
Then for each new parameter you want to add, simply add a new <field>

Default components in install4j

When my "installation components" screen runs (I'm in console mode, if it matters), I get the list of components to install, as expected. However, the "default" response is to accept 2 of the components, even though their "Initially Selected for installation" option is false.
I want the user to be able to NOT select any of the optional components, and this isn't possible when it's defaulting to have some of them "Selected".
As far as I can tell, there are no varfiles being loaded.
Snippet from my install4j file:
<component name="A" id="527" customizedId="a" displayDescription="false" hideHelpButton="false" selected="false" changeable="true" downloadable="false" hidden="false">
<description />
<include all="false">
<entry location=".i4j_external_314/a" fileType="regular" />
<entry location=".i4j_external_2366/a" fileType="regular" />
<entry location=".i4j_external_316/a" fileType="regular" />
<entry location=".i4j_external_8155/a" fileType="regular" />
<entry location=".i4j_external_318/a" fileType="regular" />
</include>
<dependencies />
</component>
<component name="B" id="528" customizedId="b" displayDescription="false" hideHelpButton="false" selected="false" changeable="true" downloadable="false" hidden="false">
<description />
<include all="false">
<entry location=".i4j_external_316/b" fileType="regular" />
<entry location=".i4j_external_8155/b" fileType="regular" />
<entry location=".i4j_external_318/b" fileType="regular" />
</include>
<dependencies />
</component>
<component name="C" id="69" customizedId="c" displayDescription="false" hideHelpButton="false" selected="false" changeable="true" downloadable="false" hidden="false">
<description />
<include all="false">
<entry location=".i4j_external_316/c" fileType="regular" />
<entry location=".i4j_external_8155/c" fileType="regular" />
<entry location=".i4j_external_318/c" fileType="regular" />
</include>
<dependencies />
Notice that in all 3 components, "selected" is false, and "changeable" is true.
When the installer runs, though, here is how it is presented:
Which components should be installed?
*: D
*: E
1: A
2: B
3: C
Please enter a comma-separated list of the selected values or [Enter] for the default selection:
[1,2]
(D and E are fine - they're set to "selected" and "not user changeable")
So, even though A and B are not "selected", they show up as a default. Also notice that "C" is configured the same way as "A" and "B", yet doesn't show up in the default.
This is problematic, because I have no way to select "none" of the optional components. I have to select at least 1 in order to not accept the default.
Thanks for any info - if you need more detail, I'd be happy to provide it.

Shorten WSDL syntax by using defaults

I am a newbie in WSDL syntax so I am just using it in a very basic way, e.g.
<message name="ping_Request">
</message>
<message name="ping_Response">
<part name="response" type="xsd:string" />
</message>
<message name="auth_Request">
<part name="username" type="xsd:string" />
<part name="password" type="xsd:string" />
</message>
<message name="auth_Response">
<part name="response" type="xsd:string" />
</message>
<portType name="ping_PortType">
<operation name="ping">
<input message="tns:ping_Request" />
<output message="tns:ping_Response" />
</operation>
</portType>
<portType name="auth_PortType">
<operation name="auth">
<input message="tns:auth_Request" />
<output message="tns:auth_Response" />
</operation>
</portType>
<binding name="auth_Binding" type="tns:auth_PortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="auth">
<soap:operation soapAction="auth"/>
<input>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:auth_NameSpace"/>
</input>
<output>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:auth_NameSpace"/>
</output>
</operation>
</binding>
<service name="info_Service">
<port binding="tns:ping_Binding" name="ping_Port">
<soap:address location="https://service.example.com/info/info.php"/>
</port>
<port binding="tns:auth_Binding" name="auth_Port">
<soap:address location="https://service.example.com/info/info.php"/>
</port>
</service>
I found my self copying and pasting these blocks for any new function, modifying only the relevant keywords, so I end up with quite a long WSDL even for a relatively small number of functions.
By using WSDL defaults, is it possible to shorten this syntax to a minimum, by removing unnecessary or repeated parameters?
NOTE: this WSDL has to be read by a VB6 soap client library, which has very limited features.