blob: c8cc6cba19ee5430293ac77d1670621d04ba9f60 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {Listener, Phase} from "./tobago-listener";
import {Tobago4Utils} from "./tobago-utils";
class Stars {
static init(elements) {
elements = elements.jQuery ? elements : jQuery(elements); // fixme jQuery -> ES5
var starComponents = Tobago4Utils.selectWithJQuery(elements, ".tobago-stars");
starComponents.each(function () {
var $starComponent = jQuery(this);
var $hiddenInput = $starComponent.find("input[type=hidden]");
var $container = $starComponent.find(".tobago-stars-container");
var $tooltip = $container.find(".tobago-stars-tooltip");
var $selected = $container.find(".tobago-stars-selected");
var $unselected = $container.find(".tobago-stars-unselected");
var $preselected = $container.find(".tobago-stars-preselected");
var $slider = $container.find(".tobago-stars-slider");
var readonly = $slider.prop("readonly");
var disabled = $slider.prop("disabled");
var required = $slider.prop("required");
var max = $slider.prop("max");
var placeholder = $slider.prop("placeholder");
if ($slider.prop("min") === "0") {
$slider.css("left", "-" + (100 / max) + "%");
$slider.css("width", 100 + (100 / max) + "%");
}
if ($hiddenInput.val() > 0) {
var percentValue = 100 * ($hiddenInput.val() as number) / max;
$selected.css("width", percentValue + "%");
$unselected.css("left", percentValue + "%");
$unselected.css("width", 100 - percentValue + "%");
} else if (placeholder) {
$selected.addClass("tobago-placeholder");
var placeholderValue = 100 * placeholder / max;
$selected.css("width", placeholderValue + "%");
$unselected.css("left", placeholderValue + "%");
$unselected.css("width", 100 - placeholderValue + "%");
}
if (!readonly && !disabled) {
/* preselectMode is a Workaround for IE11: fires change event instead of input event */
var preselectMode = false;
$slider.on('mousedown', function (event) {
preselectMode = true;
});
$slider.on('mouseup', function (event) {
preselectMode = false;
selectStars();
});
$slider.on('input', function (event) {
preselectStars();
});
$slider.on('touchend', function (event) {
/* Workaround for mobile devices. TODO: fire AJAX request for 'touchend' */
$slider.trigger("change");
});
$slider.on('change', function (event) {
if (preselectMode) {
preselectStars();
} else {
selectStars();
}
});
$slider.on('touchstart touchmove', function (event) {
/* Workaround for Safari browser on iPhone */
var sliderValue = (event.target.max / event.target.offsetWidth)
// @ts-ignore
* (event.originalEvent.touches[0].pageX - $slider.offset().left);
if (sliderValue > event.target.max) {
$slider.val(event.target.max);
} else if (sliderValue < event.target.min) {
$slider.val(event.target.min);
} else {
$slider.val(sliderValue);
}
preselectStars();
});
}
function preselectStars() {
$tooltip.addClass("show");
if ($slider.val() > 0) {
$tooltip.removeClass("trash");
$tooltip.text(Number((5 * ($slider.val() as number) / max).toFixed(2)));
$preselected.addClass("show");
$preselected.css("width", (100 * ($slider.val() as number) / max) + "%");
} else {
$tooltip.text("");
$tooltip.addClass("trash");
if (placeholder) {
$preselected.addClass("show");
$preselected.css("width", (100 * placeholder / max) + "%");
} else {
$preselected.removeClass("show");
}
}
}
function selectStars() {
$tooltip.removeClass("show");
$preselected.removeClass("show");
if ($slider.val() > 0) {
$selected.removeClass("tobago-placeholder");
var percentValue = 100 * ($slider.val() as number) / max;
$selected.css("width", percentValue + "%");
$unselected.css("left", percentValue + "%");
$unselected.css("width", 100 - percentValue + "%");
$hiddenInput.val($slider.val());
} else {
if (placeholder) {
$selected.addClass("tobago-placeholder");
var placeholderValue = 100 * placeholder / max;
$selected.css("width", placeholderValue + "%");
$unselected.css("left", placeholderValue + "%");
$unselected.css("width", 100 - placeholderValue + "%");
} else {
$selected.removeClass("tobago-placeholder");
$selected.css("width", "");
$unselected.css("left", "");
$unselected.css("width", "");
}
$hiddenInput.val(required ? "" : $slider.val());
}
}
});
};
}
Listener.register(Stars.init, Phase.DOCUMENT_READY);
Listener.register(Stars.init, Phase.AFTER_UPDATE);