0 Votes

Wiki source code of Public Web Site

Last modified by Alex Cotiugă on 2025/11/27 10:42

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">Professional XWiki solutions, from setup to long-term stability</h1>
9 <p class="lead">Need your XWiki upgraded, secured, or improved? Let’s make it happen.</p>
10 <div class="hero-cta">
11 <a href="mailto:alex@agnease.com">Contact Agnease</a>
12 #*<a class="btn btn-primary" href="#contact" aria-label="Request a consultation" data-toggle="modal" data-target="#requestConsultation">
13 Request a consultation
14 </a>
15 #requestConsultationModal()*#
16 ##data-toggle="modal" data-target="#requestConsultationModal"
17 </div>
18 <ul class="benefits">
19 <li>Smooth upgrades</li>
20 <li>Reliable support plans</li>
21 <li>Custom integrations</li>
22 <li>Secure, optimized platforms</li>
23 </ul>
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 'icon': 'refresh',
65 'content': 'Stay current with the latest XWiki LTS and keep your instance reliable.',
66 'items': [
67 'Audit setup, extensions, and configurations',
68 'Test upgrades with backups and validation',
69 'Safe production rollout with minimal downtime'
70 ]
71 },{
72 'title': 'Maintenance, Support & Recovery',
73 'icon': 'stethoscope',
74 'content': 'Ensure long-term stability and quick response when issues appear.',
75 'items': [
76 'Monitoring and performance checks',
77 'Security patching, log analysis, triage',
78 'Issue recovery, data repair, hardening'
79 ]
80 },{
81 'title': 'Development & Integrations',
82 'icon': 'cogs',
83 'content': 'Extend and connect XWiki to fit your workflow and systems.',
84 'items': [
85 'Custom apps, macros, automation',
86 'SSO, REST APIs, LDAP, CRM links',
87 'Maintainable extensions for long-term use'
88 ]
89 },{
90 'title': 'Hosting & Deployment',
91 'icon': 'cloud',
92 'content': 'Cloud-ready environments designed for reliability and performance.',
93 'items': [
94 'Containerized deployment and TLS',
95 'Backups, restore strategy, observability',
96 'Optimization and load tuning'
97 ]
98 },{
99 'title': 'Migrations to XWiki',
100 'icon': 'exchange',
101 'content': 'Move from Confluence, SharePoint, or MediaWiki to XWiki with full data integrity and structure.',
102 'items': [
103 'Preserve hierarchy, attachments, and permissions',
104 'Convert macros, categories, and metadata for XWiki',
105 'Redirect old URLs and maintain SEO consistency'
106 ]
107 }])
108 <section class="services" aria-labelledby="services-title">
109 <div class="container">
110 <h2 id="services-title">Services</h2>
111 <p class="lead">
112 All the XWiki services you need, delivered with precision and care
113 </p>
114
115 #set ($servicesSize = $servicesSectionData.size())
116 <div class="services-grid">
117 #foreach ($entry in $servicesSectionData)
118 #set ($classes = "service")
119 ## If this is the last item AND the total number is odd, center it
120 #if ($foreach.count == $servicesSize && ($servicesSize % 2) == 1)
121 #set ($classes = "service service-center")
122 #end
123
124 <article class="$classes">
125 <div class="service-icon">
126 <i class="fa fa-$entry.icon" aria-hidden="true"></i>
127 </div>
128 <div class="service-body">
129 <h4>$entry.title</h4>
130 <p>$entry.content</p>
131 <ul>
132 #foreach ($item in $entry.items)
133 <li>$item</li>
134 #end
135 </ul>
136 </div>
137 </article>
138 #end
139 </div>
140 </div>
141 </section>
142 ## CTA INLINE
143 <section id="contact" class="cta-section">
144 <div class="container">
145 <p class="text-center contact-inline">
146 Need help with your XWiki? <a href="mailto:alex@agnease.com">Contact Agnease</a>.
147 </p>
148 </div>
149 </section>
150 {{/html}}
151 #end
152
153 #macro(requestConsultationModal)
154 <div class="modal fade" id="requestConsultation" tabindex="-1" role="dialog">
155 <div class="modal-dialog">
156 <div class="modal-content">
157 <div class="modal-header">
158 <button type="button" class="close" data-dismiss="modal">&times;</button>
159 <h4 class="modal-title">Request a consultation</h4>
160 </div>
161 <div class="modal-body">
162 <div>
163 ##Need help with your XWiki? <a href="mailto:alex@agnease.com">Contact Agnease</a>
164 #displayFormFromSheetCode()
165 </div>
166 </div>
167 <div class="modal-footer">
168 ##<input id="continueCategorySelection" type="button" class="btn btn-default" data-dismiss="modal"
169 ## value="$escapetool.xml($services.localization.render('yesno_1'))">
170 </div>
171 </div>
172 </div>
173 </div>
174 #end
175
176 #macro (stripHTMLMacro $displayOutput)
177 $stringtool.removeEnd($stringtool.removeStart($displayOutput, '{{html clean="false" wiki="false"}}'), '{{/html}}').replace('Agnease.Code.Lead.LeadClass_0_', 'acl-')
178 #end
179
180 #macro (displayFormFromSheetCode)
181 #set ($editing = true)
182 ## The object to display.
183 #set ($xobject = $doc.newObject('Agnease.Code.Lead.LeadClass'))
184 ## The class that describes the object properties.
185 #set ($xclass = $xwiki.getClass('Agnease.Code.Lead.LeadClass'))
186 ## Make sure the following display* method calls use the right object.
187 #set ($discard = $doc.use($xobject))
188 ## Using the xform vertical form layout.
189 <div class="xform">
190 <dl>
191 #foreach ($property in $xclass.properties)
192 #if ($property.name != 'status')
193 <dt #if (!$editing)
194 class="editableProperty"
195 #set ($xobjectPropertyReference = $xobject.getPropertyReference($property.name))
196 data-property="$escapetool.xml($services.model.serialize($xobjectPropertyReference))"
197 data-property-type="object"#end>
198 ## This must match the id generated by the $doc.display() method below.
199 #set ($propertyId = "acl-$property.name")
200 <label#if ($editing) for="$escapetool.xml($propertyId)"#end>
201 $escapetool.xml($property.translatedPrettyName)
202 </label>
203 ## Support for specifying a translation key as hint in the property definition.
204 <span class="xHint">$!escapetool.xml($services.localization.render($property.hint))</span>
205 </dt>
206 #set ($displayOutput = $doc.display($property.name, 'edit'))
207 <dd>#stripHTMLMacro($displayOutput)</dd>
208 #end
209 #end
210 #if (!$xclass.properties || $xclass.properties.size() == 0)
211 ## Keep the empty definition term in order to have valid HTML.
212 <dt></dt>
213 <dd>$escapetool.xml($services.localization.render('xclass.defaultObjectSheet.noProperties'))</dd>
214 #end
215 </dl>
216 </div>
217 #end
218 {{/velocity}}