Wiki source code of Public Web Site

Version 6.21 by Alex Cotiugă on 2026/05/02 12:05

Show last authors
1 {{velocity}}
2 #macro (displayPublicContent)
3 #set ($discard = $xwiki.ssx.use('PublicWebSite.WebHome'))
4 {{html clean="false"}}
5 ## HERO
6 <section class="hero hero-centered" aria-labelledby="hero-title">
7 <div class="container hero-inner">
8 <h1 id="hero-title">Keep Your XWiki Platform Secure, Stable and Up-to-Date</h1>
9 <p class="lead">Helping organizations safely upgrade and maintain their XWiki environments.</p>
10 <ul class="benefits">
11 <li>Smooth upgrades</li>
12 <li>Reliable support plans</li>
13 <li>Custom integrations</li>
14 <li>Secure, optimized platforms</li>
15 </ul>
16 <div id="hero-cta">
17 $xwiki.getURL('contact.WebHome')
18 <a class="btn btn-primary href="$xwiki.getURL('contact.WebHome')">Contact Agnease</a>
19 #*<a class="btn btn-primary" href="#contact" aria-label="Request a consultation" data-toggle="modal" data-target="#requestConsultation">
20 Request a consultation
21 </a>
22 #requestConsultationModal()*#
23 ##data-toggle="modal" data-target="#requestConsultationModal"
24 </div>
25 </div>
26 </section>
27 ## WHY CHOOSE
28 #set ($whySectionData = [{
29 'title': 'Stability & security',
30 'icon': 'shield',
31 'content': 'Proven upgrade steps, rollback safety, and proactive hardening keep your wiki reliable.'
32 },{
33 'title': 'Predictable delivery',
34 'icon': 'check-square-o',
35 'content': 'Clear scope, defined steps, and documented results to avoid surprises.'
36 },{
37 'title': 'Clean integrations',
38 'icon': 'link',
39 'content': 'Maintainable SSO, API, and system connections tailored to your environment.'
40 },{
41 'title': 'Long-term support',
42 'icon': 'life-ring',
43 'content': 'Guaranteed response times, regular checks, and fast assistance when needed.'
44 }])
45 <section aria-labelledby="why-title">
46 <div class="container">
47 <h2 id="why-title">Why choose Agnease</h2>
48 <p class="lead">10+ years of XWiki expertise with structured delivery and lasting collaboration</p>
49 <div class="widgets">
50 #foreach ($entry in $whySectionData)
51 <article class="widget">
52 <div class="icon" aria-hidden="true">
53 <i class="fa fa-$entry.icon"></i>
54 <h4>$entry.title</h4>
55 </div>
56 <p>$entry.content</p>
57 </article>
58 #end
59 </div>
60 </div>
61 </section>
62 ## SERVICES
63 #set ($servicesSectionData = [{
64 'title': 'Upgrades',
65 'icon': 'refresh',
66 'content': 'Stay current with the latest XWiki LTS and keep your instance reliable.',
67 'items': [
68 'Audit setup, extensions, and configurations',
69 'Test upgrades with backups and validation',
70 'Safe production rollout with minimal downtime'
71 ]
72 },{
73 'title': 'Maintenance, Support & Recovery',
74 'icon': 'stethoscope',
75 'content': 'Ensure long-term stability and quick response when issues appear.',
76 'items': [
77 'Monitoring and performance checks',
78 'Security patching, log analysis, triage',
79 'Issue recovery, data repair, hardening'
80 ]
81 },{
82 'title': 'Development & Integrations',
83 'icon': 'cogs',
84 'content': 'Extend and connect XWiki to fit your workflow and systems.',
85 'items': [
86 'Custom apps, macros, automation',
87 'SSO, REST APIs, LDAP, CRM links',
88 'Maintainable extensions for long-term use'
89 ]
90 },{
91 'title': 'Hosting & Deployment',
92 'icon': 'cloud',
93 'content': 'Cloud-ready environments designed for reliability and performance.',
94 'items': [
95 'Containerized deployment and TLS',
96 'Backups, restore strategy, observability',
97 'Optimization and load tuning'
98 ]
99 },{
100 'title': 'Migrations to XWiki',
101 'icon': 'exchange',
102 'content': 'Move from Confluence, SharePoint, or MediaWiki to XWiki with full data integrity and structure.',
103 'items': [
104 'Preserve hierarchy, attachments, and permissions',
105 'Convert macros, categories, and metadata for XWiki',
106 'Redirect old URLs and maintain SEO consistency'
107 ]
108 }])
109 <section class="services" aria-labelledby="services-title">
110 <div class="container">
111 <h2 id="services-title">Services</h2>
112 <p class="lead">
113 All the XWiki services you need, delivered with precision and care
114 </p>
115
116 #set ($servicesSize = $servicesSectionData.size())
117 <div class="services-grid">
118 #foreach ($entry in $servicesSectionData)
119 #set ($classes = "service")
120 ## If this is the last item AND the total number is odd, center it
121 #if ($foreach.count == $servicesSize && ($servicesSize % 2) == 1)
122 #set ($classes = "service service-center")
123 #end
124
125 <article class="$classes">
126 <div class="service-icon">
127 <i class="fa fa-$entry.icon" aria-hidden="true"></i>
128 </div>
129 <div class="service-body">
130 <h4>$entry.title</h4>
131 <p>$entry.content</p>
132 <ul>
133 #foreach ($item in $entry.items)
134 <li>$item</li>
135 #end
136 </ul>
137 </div>
138 </article>
139 #end
140 </div>
141 </div>
142 </section>
143 ## CTA INLINE
144 <section id="contact" class="cta-section">
145 <div class="container">
146 <p class="text-center contact-inline">
147 Need help with your XWiki? <a href="$xwiki.getURL('contact.WebHome')">Contact Agnease</a>.
148 </p>
149 </div>
150 </section>
151 {{/html}}
152 #end
153
154 #macro(requestConsultationModal)
155 <div class="modal fade" id="requestConsultation" tabindex="-1" role="dialog">
156 <div class="modal-dialog">
157 <div class="modal-content">
158 <div class="modal-header">
159 <button type="button" class="close" data-dismiss="modal">&times;</button>
160 <h4 class="modal-title">Request a consultation</h4>
161 </div>
162 <div class="modal-body">
163 <div>
164 ##Need help with your XWiki? <a href="mailto:alex@agnease.com">Contact Agnease</a>
165 #displayFormFromSheetCode()
166 </div>
167 </div>
168 <div class="modal-footer">
169 ##<input id="continueCategorySelection" type="button" class="btn btn-default" data-dismiss="modal"
170 ## value="$escapetool.xml($services.localization.render('yesno_1'))">
171 </div>
172 </div>
173 </div>
174 </div>
175 #end
176
177 #macro (stripHTMLMacro $displayOutput)
178 $stringtool.removeEnd($stringtool.removeStart($displayOutput, '{{html clean="false" wiki="false"}}'), '{{/html}}').replace('Agnease.Code.Lead.LeadClass_0_', 'acl-')
179 #end
180
181 #macro (displayFormFromSheetCode)
182 #set ($editing = true)
183 ## The object to display.
184 #set ($xobject = $doc.newObject('Agnease.Code.Lead.LeadClass'))
185 ## The class that describes the object properties.
186 #set ($xclass = $xwiki.getClass('Agnease.Code.Lead.LeadClass'))
187 ## Make sure the following display* method calls use the right object.
188 #set ($discard = $doc.use($xobject))
189 ## Using the xform vertical form layout.
190 <div class="xform">
191 <dl>
192 #foreach ($property in $xclass.properties)
193 #if ($property.name != 'status')
194 <dt #if (!$editing)
195 class="editableProperty"
196 #set ($xobjectPropertyReference = $xobject.getPropertyReference($property.name))
197 data-property="$escapetool.xml($services.model.serialize($xobjectPropertyReference))"
198 data-property-type="object"#end>
199 ## This must match the id generated by the $doc.display() method below.
200 #set ($propertyId = "acl-$property.name")
201 <label#if ($editing) for="$escapetool.xml($propertyId)"#end>
202 $escapetool.xml($property.translatedPrettyName)
203 </label>
204 ## Support for specifying a translation key as hint in the property definition.
205 <span class="xHint">$!escapetool.xml($services.localization.render($property.hint))</span>
206 </dt>
207 #set ($displayOutput = $doc.display($property.name, 'edit'))
208 <dd>#stripHTMLMacro($displayOutput)</dd>
209 #end
210 #end
211 #if (!$xclass.properties || $xclass.properties.size() == 0)
212 ## Keep the empty definition term in order to have valid HTML.
213 <dt></dt>
214 <dd>$escapetool.xml($services.localization.render('xclass.defaultObjectSheet.noProperties'))</dd>
215 #end
216 </dl>
217 </div>
218 #end
219 {{/velocity}}