Wiki source code of Public Web Site

Version 4.8 by Alex Cotiugă on 2026/05/01 13:03

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><a href="$xwiki.getURL('services.xwiki-upgrades')">Smooth upgrades</a></li>
12 <li>Reliable support plans</li>
13 <li>Custom integrations</li>
14 <li>Secure, optimized platforms</li>
15 </ul>
16 <div class="hero-cta">
17 <a href="mailto:alex@agnease.com">Contact Agnease</a>
18 #*<a class="btn btn-primary" href="#contact" aria-label="Request a consultation" data-toggle="modal" data-target="#requestConsultation">
19 Request a consultation
20 </a>
21 #requestConsultationModal()*#
22 ##data-toggle="modal" data-target="#requestConsultationModal"
23 </div>
24 </div>
25 </section>
26 ## WHY CHOOSE
27 #set ($whySectionData = [{
28 'title': 'Stability & security',
29 'icon': 'shield',
30 'content': 'Proven upgrade steps, rollback safety, and proactive hardening keep your wiki reliable.'
31 },{
32 'title': 'Predictable delivery',
33 'icon': 'check-square-o',
34 'content': 'Clear scope, defined steps, and documented results to avoid surprises.'
35 },{
36 'title': 'Clean integrations',
37 'icon': 'link',
38 'content': 'Maintainable SSO, API, and system connections tailored to your environment.'
39 },{
40 'title': 'Long-term support',
41 'icon': 'life-ring',
42 'content': 'Guaranteed response times, regular checks, and fast assistance when needed.'
43 }])
44 <section aria-labelledby="why-title">
45 <div class="container">
46 <h2 id="why-title">Why choose Agnease</h2>
47 <p class="lead">10+ years of XWiki expertise with structured delivery and lasting collaboration</p>
48 <div class="widgets">
49 #foreach ($entry in $whySectionData)
50 <article class="widget">
51 <div class="icon" aria-hidden="true">
52 <i class="fa fa-$entry.icon"></i>
53 <h4>$entry.title</h4>
54 </div>
55 <p>$entry.content</p>
56 </article>
57 #end
58 </div>
59 </div>
60 </section>
61 ## SERVICES
62 #set ($servicesSectionData = [{
63 'title': 'Upgrades',
64 'reference': 'services.xwiki-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>
131 #if ("$!entry.reference" != '')
132 <a href="$xwiki.getURL($entry.reference)">$entry.title</a>
133 #else
134 $entry.title
135 #end
136 </h4>
137 <p>$entry.content</p>
138 <ul>
139 #foreach ($item in $entry.items)
140 <li>$item</li>
141 #end
142 </ul>
143 </div>
144 </article>
145 #end
146 </div>
147 </div>
148 </section>
149 ## CTA INLINE
150 <section id="contact" class="cta-section">
151 <div class="container">
152 <p class="text-center contact-inline">
153 Need help with your XWiki? <a href="mailto:alex@agnease.com">Contact Agnease</a>.
154 </p>
155 </div>
156 </section>
157 {{/html}}
158 #end
159
160 #macro(requestConsultationModal)
161 <div class="modal fade" id="requestConsultation" tabindex="-1" role="dialog">
162 <div class="modal-dialog">
163 <div class="modal-content">
164 <div class="modal-header">
165 <button type="button" class="close" data-dismiss="modal">&times;</button>
166 <h4 class="modal-title">Request a consultation</h4>
167 </div>
168 <div class="modal-body">
169 <div>
170 ##Need help with your XWiki? <a href="mailto:alex@agnease.com">Contact Agnease</a>
171 #displayFormFromSheetCode()
172 </div>
173 </div>
174 <div class="modal-footer">
175 ##<input id="continueCategorySelection" type="button" class="btn btn-default" data-dismiss="modal"
176 ## value="$escapetool.xml($services.localization.render('yesno_1'))">
177 </div>
178 </div>
179 </div>
180 </div>
181 #end
182
183 #macro (stripHTMLMacro $displayOutput)
184 $stringtool.removeEnd($stringtool.removeStart($displayOutput, '{{html clean="false" wiki="false"}}'), '{{/html}}').replace('Agnease.Code.Lead.LeadClass_0_', 'acl-')
185 #end
186
187 #macro (displayFormFromSheetCode)
188 #set ($editing = true)
189 ## The object to display.
190 #set ($xobject = $doc.newObject('Agnease.Code.Lead.LeadClass'))
191 ## The class that describes the object properties.
192 #set ($xclass = $xwiki.getClass('Agnease.Code.Lead.LeadClass'))
193 ## Make sure the following display* method calls use the right object.
194 #set ($discard = $doc.use($xobject))
195 ## Using the xform vertical form layout.
196 <div class="xform">
197 <dl>
198 #foreach ($property in $xclass.properties)
199 #if ($property.name != 'status')
200 <dt #if (!$editing)
201 class="editableProperty"
202 #set ($xobjectPropertyReference = $xobject.getPropertyReference($property.name))
203 data-property="$escapetool.xml($services.model.serialize($xobjectPropertyReference))"
204 data-property-type="object"#end>
205 ## This must match the id generated by the $doc.display() method below.
206 #set ($propertyId = "acl-$property.name")
207 <label#if ($editing) for="$escapetool.xml($propertyId)"#end>
208 $escapetool.xml($property.translatedPrettyName)
209 </label>
210 ## Support for specifying a translation key as hint in the property definition.
211 <span class="xHint">$!escapetool.xml($services.localization.render($property.hint))</span>
212 </dt>
213 #set ($displayOutput = $doc.display($property.name, 'edit'))
214 <dd>#stripHTMLMacro($displayOutput)</dd>
215 #end
216 #end
217 #if (!$xclass.properties || $xclass.properties.size() == 0)
218 ## Keep the empty definition term in order to have valid HTML.
219 <dt></dt>
220 <dd>$escapetool.xml($services.localization.render('xclass.defaultObjectSheet.noProperties'))</dd>
221 #end
222 </dl>
223 </div>
224 #end
225 {{/velocity}}