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