From 2f1a26b6069d6d75729a971be20d45f0fc5fefcc Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Sun, 11 Mar 2018 16:57:22 +0100 Subject: [website] added supporters infrastructure. --- build.xml | 6 ++ buildScripts/ivy.xml | 4 +- buildScripts/supporters.ant.xml | 4 +- website/extra/htaccess | 6 ++ website/resources/W8BEN_lombok.pdf | Bin 0 -> 60743 bytes website/resources/css/custom.css | 71 +++++++++++++-- website/resources/js/order-license.js | 139 ++++++++++++++++++++++++++++-- website/resources/js/supporters.js | 13 ++- website/templates/_scaffold.html | 15 ++-- website/templates/contributing.html | 5 ++ website/templates/main.html | 16 ++-- website/templates/order-license-info.html | 25 ++++-- website/templates/order-license.html | 118 ++++++++++++++++++++----- 13 files changed, 357 insertions(+), 65 deletions(-) create mode 100644 website/resources/W8BEN_lombok.pdf diff --git a/build.xml b/build.xml index 629db4a6..645114a7 100644 --- a/build.xml +++ b/build.xml @@ -898,6 +898,12 @@ You can also create your own by writing a 'testenvironment.properties' file. The + + + + + + diff --git a/buildScripts/ivy.xml b/buildScripts/ivy.xml index cf62377e..a27c909e 100644 --- a/buildScripts/ivy.xml +++ b/buildScripts/ivy.xml @@ -58,8 +58,8 @@ - - + + diff --git a/buildScripts/supporters.ant.xml b/buildScripts/supporters.ant.xml index d19e0bb6..d1d3fedc 100644 --- a/buildScripts/supporters.ant.xml +++ b/buildScripts/supporters.ant.xml @@ -39,11 +39,11 @@ containing the status of lombok's supporters. - + - + diff --git a/website/extra/htaccess b/website/extra/htaccess index ea53d49c..db3393af 100644 --- a/website/extra/htaccess +++ b/website/extra/htaccess @@ -24,6 +24,12 @@ RewriteRule ^disable-checked-exceptions$ /disable-checked-exceptions.html [L,END RewriteRule ^disable-checked-exceptions(\.html)?$ /disable-checked-exceptions [NC,R=301] RewriteRule ^contributing$ /contributing.html [L,END] RewriteRule ^contributing(\.html)?$ /contributing [NC,R=301] +RewriteRule ^supporters$ /supporters.html [L,END] +RewriteRule ^supporters(.html)?$ /supporters [NC,R=301] +RewriteRule ^order-license-info$ /order-license-info.html [L,END] +RewriteRule ^order-?license-?info(.html)?$ /order-license-info [NC,R=301] +RewriteRule ^order-license$ /order-license.html [L,END] +RewriteRule ^order-?license(.html)?$ /order-license [NC,R=301] <#list setupPages as pg> RewriteRule ^setup/${pg?no_esc}$ /setup/${pg?no_esc}.html [L,END] diff --git a/website/resources/W8BEN_lombok.pdf b/website/resources/W8BEN_lombok.pdf new file mode 100644 index 00000000..b87bded8 Binary files /dev/null and b/website/resources/W8BEN_lombok.pdf differ diff --git a/website/resources/css/custom.css b/website/resources/css/custom.css index e5bb720e..674d341c 100644 --- a/website/resources/css/custom.css +++ b/website/resources/css/custom.css @@ -7,6 +7,68 @@ margin-bottom: 40px; } +.buttonLike { + cursor: pointer; + background: -webkit-linear-gradient(top, #FFFEF7, #CFCEC7); + background: -moz-linear-gradient(top, #FFFEF7, #CFCEC7); + background: -o-linear-gradient(#FFFEF7, #CFCEC7); + background: -ms-linear-gradient(#FFFEF7, #CFCEC7); + background: linear-gradient(top, #FFFEF7, #CFCEC7); + line-height: 1; + padding: 3px 10px; + border: 1px solid black; + position: relative; + overflow: visible; + color: black; + margin: 2px; + border-radius: 5px; + display: inline-block; + text-align: center; +} + +.orderButton { + width: 280px; +} + +.formErr { + color: #FF7777; +} + +.order-license #deleteCompanyLogo { + margin-top: 12px; +} + +.formSubmitFail { + color: #FF6666; + font-size: 1.2em; + font-style: italic; +} + +.order-license .btn-primary { + float: left; + margin-right: 20px; + background: -webkit-linear-gradient(#1725e0, #0923df 6%, #0b21ce); + background: -o-linear-gradient(#1725e0, #0923df 6%, #0b21ce); + background: -webkit-gradient(linear, left top, left bottom, from(#1725e0), color-stop(6%, #0923df), to(#0b21ce)); + background: linear-gradient(#1725e0, #0923df 6%, #0b21ce); + background-repeat: no-repeat; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1725e0', endColorstr='#ff0b21ce', GradientType=0); + -webkit-filter: none; + filter: none; + border: 1px solid #091bac; +} + +#onlyYearlyWarning { + font-size: 0.8em; + padding-left: 16px; +} + +.deemphasize { + color: #AAAAAA; + font-size: 0.8em; + font-style: italic; +} + .supporterBar .introText { margin-top: 16px; } @@ -24,6 +86,10 @@ display: inline-block; } +.supporters .supportItem { + margin: 6px 10px; +} + .supporterBar { width: 100%; margin-left: auto; @@ -53,11 +119,6 @@ height: 16px; } -.legalese { - font-style: italic; - font-size: 0.8em; -} - #companyLogo { margin-right: 8px; } diff --git a/website/resources/js/order-license.js b/website/resources/js/order-license.js index 82627f2b..4a3edca0 100644 --- a/website/resources/js/order-license.js +++ b/website/resources/js/order-license.js @@ -1,21 +1,140 @@ "use strict"; (function() { + if (!String.prototype.trim) { + String.prototype.trim = function () { + return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + }; + } + var imgDataUrl = null; + + function updateLocationInfo() { + var locationType = $("input:radio[name='locationType']:checked").val(); + $("#locationType_usa").toggle(locationType === "usa"); + $("#locationType_eu").toggle(locationType === "eu"); + $("#locationType_other").toggle(locationType === "other"); + $("#paymentMethod_iban").toggle(locationType === "eu"); + if ($("#paymentMethod_iban input").is(":checked") && locationType !== "eu") $("#paymentMethod_payoneer input").prop("checked", true); + if ($("#paymentMethod_intl input").is(":checked") && locationType === "eu") $("#paymentMethod_iban input").prop("checked", true); + $("#paymentMethod_intl").toggle(locationType !== "eu"); + } + + function updatePriceIndication() { + $("#onlyYearlyWarning").hide(); + var x = getPriceIndication(); + if (x === "") { + $("#costIndicator").text("").hide(); + } else { + $("#costIndicator").text(x).show(); + } + } + + function getPriceIndication() { + try { + var seats = parseInt($("#seats").val()); + if (isNaN(seats)) return ""; + var licenseType = $("input:radio[name='licenseType']:checked").val(); + var costPer; + if (licenseType === "enterprise") costPer = 5; + else if (licenseType === "professional") costPer = 2; + else return ""; + var periodRaw = $("input:radio[name='paymentType']:checked").val(); + if (periodRaw === "monthly") { + if (costPer*seats < 50) { + $("#onlyYearlyWarning").show(); + return "Your license will cost €" + (costPer*seats*12) + ",- per year."; + } + return "Your license will cost €" + (costPer*seats) + ",- per month."; + } + return "Your license will cost €" + (costPer*seats*12) + ",- per year."; + } catch (e) { + return ""; + } + } + + function showError(elemName) { + var elem = $("#" + elemName + "Err"); + elem.fadeIn(); + $("#" + elemName).on("change keyup", function() { + elem.hide(); + }); + } + function applyLicense() { - $("#submit").on("click", function(evt) { + var submitButton = $("#submit"); + var spinner = $("").attr("src", "/img/spinner.gif").attr("alt", "submitting").css("float", "left").css("margin-right", "20px"); + + submitButton.on("click", function(evt) { evt.preventDefault(); var onSuccess = function() { - alert("Form submitted!"); + $("#orderHelp").hide(); + var okMsg = $("
").addClass("formSubmitOk").html("Thank you for ordering a Project Lombok license! We'll send your bill via email. If you have any further questions please contact us at orders@projectlombok.org."); + spinner.replaceWith(okMsg); }; var onFailure = function() { - alert("Whoops"); + $("#orderHelp").hide(); + var errMsg = $("
").addClass("formSubmitFail").html("Our order form appears to be broken. Could you do us a favour and contact us at orders@projectlombok.org? Thank you!"); + spinner.replaceWith(errMsg); }; var data = {}; - data.name = $("#name").val(); + data.name = $("#companyName").val(); + data.email = $("#email").val(); + data.licenseType = $("input:radio[name='licenseType']:checked").val(); + data.seats = parseInt($("#seats").val()); + data.paymentType = $("input:radio[name='paymentType']:checked").val(); + data.mentionMe = $("#mentionMe").prop("checked"); + data.companyUrl = $("#companyUrl").val(); + data.locationType = $("input:radio[name='locationType']:checked").val(); + data.euVat = $("#euVat").val(); + data.paymentMethod = $("input:radio[name='paymentMethod']:checked").val(); + + var formFail = false; + + if (!data.paymentMethod) { + showError("paymentMethod"); + formFail = true; + } + + if (!data.euVat && data.locationType === 'eu') { + $("#euVat").focus(); + showError("euVat"); + formFail = true; + } + + if (!data.locationType) { + showError("locationType"); + formFail = true; + } + + if (!data.seats || isNaN(data.seats)) { + $("#seats").focus(); + showError("seats"); + formFail = true; + } + + if (!data.paymentType) { + showError("paymentType"); + formFail = true; + } + + if (data.email.indexOf('@') === -1) { + $("#email").focus(); + showError("email"); + formFail = true; + } + + if (data.name.trim().length < 1) { + $("#companyName").focus(); + showError("companyName"); + formFail = true; + } + + if (formFail) return; + var rnd = generateRandom(); var err = processImageUpload(); if (err) { @@ -24,6 +143,9 @@ return; } if (imgDataUrl) data.logo = imgDataUrl; + + submitButton.replaceWith(spinner); + $.ajax({ url: "/license-submit/" + rnd, method: "PUT", @@ -31,7 +153,7 @@ data: JSON.stringify(data), processData: false, success: onSuccess, - failure: onFailure + error: onFailure }); }); @@ -58,6 +180,13 @@ $("#deleteCompanyLogo").show(); } }); + + $("#seats,.paymentType,.licenseType").on("change keyup", function() { + updatePriceIndication(); + }); + $(".locationType").on("change", function() { + updateLocationInfo(); + }); } function generateRandom() { diff --git a/website/resources/js/supporters.js b/website/resources/js/supporters.js index 5ec1b057..5f21c79c 100644 --- a/website/resources/js/supporters.js +++ b/website/resources/js/supporters.js @@ -3,7 +3,7 @@ (function($) { var supporters = {}; var weights = {}; - var types = ["patron", "professional", "enterprise"]; + var types = ["enterprise", "professional", "patron"]; function shuffle(array) { var i = 0, j = 0, temp = null; @@ -49,7 +49,7 @@ var d = $("
").addClass("supportItem").addClass(this.type); var a = d; if (this.url) { - a = $("").attr("href", this.url).attr("rel", "noopener"); + a = $("").attr("href", this.url).attr("rel", "noopener").attr("target", "_blank"); d.append(a); } var n = $("").text(this.name); @@ -69,8 +69,13 @@ var ht = Math.round(h / f); i.width = wt; i.height = ht; + var ji = $(i); if (!showName) a.empty(); - a.prepend(i); + ji.css("width", wt + "px"); + ji.css("height", ht + "px"); + ji.attr("alt", n); + ji.attr("title", n); + a.prepend(ji); }; i.src = 'files/' + this.logo; } @@ -129,6 +134,8 @@ var s = $(".supporterBar"); s.find(".introText").show(); s.append($("
").addClass("sbCnt")); + var sf = s.find(".supporterFooter").show(); + s.append(sf); s = s.find(".sbCnt"); var now = new Date(); var list = []; diff --git a/website/templates/_scaffold.html b/website/templates/_scaffold.html index c461423f..767f28e5 100644 --- a/website/templates/_scaffold.html +++ b/website/templates/_scaffold.html @@ -92,14 +92,17 @@ ga('send', 'pageview');
  • Experimental
  • -
  • - - Discuss/Help - +
  • - - Contribute + + Order / Donate
  • <@main.h2 title="Upcoming presentations" />

    - Roel and Reinier will be talking about (near) future java features; a preview of what Java10 and Java11 will probably look like, across germany:

    + Roel and Reinier will be talking about (near) future java features:
    JavaLand March 14th 2018, 12:00, room: Schauspielhaus. +

    See you there! (We'll have stickers!)

    +
    diff --git a/website/templates/order-license-info.html b/website/templates/order-license-info.html index b465eaf0..a58ef913 100644 --- a/website/templates/order-license-info.html +++ b/website/templates/order-license-info.html @@ -9,15 +9,22 @@

    Lombok is open source. We offer three licenses for using lombok. The standard license is free. Here you can order a professional or enterprise license.

    - As part of being a professional or enterprise licensee, we normally offer to put your name, a logo, and possibly a link on our ‘supporters and licensees’ page. From time to time we’ll put a supporter or licensee on our front page. You may of course opt out of this offer. We may, at our discretion, opt not to list you. If we elect not to do so, you will be notified at the email address you fill in on our form, and you are as always free to cancel your license at any time. -

    - The license fee is based on the number of developers that work for you or your company using Project Lombok, per month. The fee is charged in advance. You may choose to pay either monthly or yearly (for sufficiently small licensees, only a yearly option is available). -

    - Project Lombok is provided by the copyright holders and contributors “as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed, even for professional and enterprise license holders. In no event shall the copyright holder or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage. -

    - Instead of a professional or enterprise license, if you’d like to support the efforts of Project Lombok, you can also support us via Patreon. -

    - Order a professional or enterprise license now. + Order a professional or enterprise license
    + For individuals: Become a patreon +

    +
    +

    Benefits of becoming a licensee

    +
    +

    + Lombok is and will remain a free, open source product. However, we ask you to consider becoming a licensee. Licensees will be listed on the projectlombok.org website, we'll send you some stickers, and an official license. You'll be supporting the development of Project Lombok. +

    +
    +

    Small print

    +
    +

    + As part of being a professional or enterprise licensee, we will put your name, a logo, and possibly a link on our ‘supporters and licensees’ page. We'll also put (at random) some supporters and licensees on our front page. You may of course opt out of this offer. We may, at our discretion, opt not to list you. If we elect not to do so, you will be notified at the email address you fill in on our form, and you are as always free to cancel your license at any time. +

    + Project Lombok is provided by the copyright holders and contributors “as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed, even for professional and enterprise license holders. In no event shall the copyright holder or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.

    diff --git a/website/templates/order-license.html b/website/templates/order-license.html index 4d52d93a..91693c0a 100644 --- a/website/templates/order-license.html +++ b/website/templates/order-license.html @@ -1,7 +1,7 @@ <#import "/_scaffold.html" as main> <@main.scaffold load=["/js/order-license.js"]> - -
    -Form fields: - -* EU / US / Elders -* Naam bedrijf -* Do you want to be mentioned? -* Link to logo -* Link to website -* Professional of enterprise -* # of developers -* Email of contact.sta -* In EU: VAT Number -* In EU: How would you like to pay? IBAN or Payoneer -* In US: How would you like to pay? International wire transfer, or Payoneer (default = payoneer). -* Elders: We’ll get back to you.. -
    -- cgit