From e8f29660068d352abade92d4cc213ac57396953d Mon Sep 17 00:00:00 2001 From: Chad Wilson Date: Tue, 4 Apr 2023 21:52:17 +0800 Subject: [PATCH 1/6] Remove unnecessary prototypeJS-based word breaker --- .../javascripts/build_summary_observer.js | 3 +- .../assets/javascripts/word_break_inserter.js | 55 ------------------- .../app/assets/stylesheets/css/admin-tab.scss | 24 -------- .../admin/configuration/_heading.html.erb | 4 +- .../build_summary_observer_spec.js | 10 ---- .../javascripts/word_break_inserter_spec.js | 53 ------------------ 6 files changed, 3 insertions(+), 146 deletions(-) delete mode 100644 server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/word_break_inserter.js delete mode 100644 server/src/main/webapp/WEB-INF/rails/spec/javascripts/word_break_inserter_spec.js diff --git a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/build_summary_observer.js b/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/build_summary_observer.js index c7a5b5b1b14..94871af597f 100644 --- a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/build_summary_observer.js +++ b/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/build_summary_observer.js @@ -33,8 +33,7 @@ }, displayAnyErrorMessages: function displayErrorMessagesOnBuildDetails(json) { if (is_result_unknown(json)) { - var text = $$WordBreaker.break_text(json.building_info.name); - $('#trans_content').html("Failed to find log in
" + text); + $('#trans_content').html("Failed to find log in
" + json.building_info.name); new TransMessage('trans_message', $('#build_detail_summary_container')[0], { type: TransMessage.TYPE_ERROR, autoHide: false, diff --git a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/word_break_inserter.js b/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/word_break_inserter.js deleted file mode 100644 index 0fed76c53bb..00000000000 --- a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/word_break_inserter.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2023 Thoughtworks, Inc. - * - * Licensed 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. - */ -var WordBreaker = Class.create(); - -WordBreaker.prototype = { - initialize : function(unit) { - this.unit = unit; - _inserter = this; - }, - insert: function() { - $$('.wbrSensitive').each(this.word_break); - }, - word_break: function(element) { - var html_in_element = element.innerHTML ? element.innerHTML.toLowerCase() : ''; - if (html_in_element.indexOf(_inserter.word_break_element()) > -1) { - return; - } - element.update(_inserter.break_text(element.innerHTML)); - }, - break_text : function(text) { - var textArray = text.toArray(); - if (!textArray) return; - var content = ''; - for(var i = 0; i < textArray.length;i++) { - if ((i + 1) % _inserter.unit == 0) { - content += (textArray[i] + _inserter.word_break_element()); - } else { - content += textArray[i]; - } - } - return content; - }, - word_break_element: function() { - return Prototype.Browser.Gecko ? '' : '­'; - } -} -var $$WordBreaker = new WordBreaker(5); - -Event.observe(window, 'load', function() { - $$WordBreaker.insert(); -}); - diff --git a/server/src/main/webapp/WEB-INF/rails/app/assets/stylesheets/css/admin-tab.scss b/server/src/main/webapp/WEB-INF/rails/app/assets/stylesheets/css/admin-tab.scss index 609f57cddbf..2667193b896 100644 --- a/server/src/main/webapp/WEB-INF/rails/app/assets/stylesheets/css/admin-tab.scss +++ b/server/src/main/webapp/WEB-INF/rails/app/assets/stylesheets/css/admin-tab.scss @@ -40,26 +40,6 @@ a#add-new-pipeline-button { padding: 5px 0 0 5px; } -.admin_holder { - /* padding : 1em; */ - - /* margin: 0 1em 1em; */ - - /* background-color : #eae0ce; */ - - /* overflow: auto; */ - - /* color: #452f33; */ -} - -.admin_holder .wbrSensitive { - display: block; - font-size: 17px; - margin-left: 0.25em; - color: #000; - padding-top: 1em; -} - #tab-content-of-about { margin: 0.75em; } @@ -478,10 +458,6 @@ span.build-plan-operations a.link_as_button { float: left; } -#tab-content-of-source-xml h1 span.wbrSensitive { - display: block; -} - .buttons-group a.link_as_button { min-width: 100px; margin-left: 5px; diff --git a/server/src/main/webapp/WEB-INF/rails/app/views/admin/configuration/_heading.html.erb b/server/src/main/webapp/WEB-INF/rails/app/views/admin/configuration/_heading.html.erb index 64fc52d3aaa..f35fd05d195 100644 --- a/server/src/main/webapp/WEB-INF/rails/app/views/admin/configuration/_heading.html.erb +++ b/server/src/main/webapp/WEB-INF/rails/app/views/admin/configuration/_heading.html.erb @@ -4,6 +4,6 @@

Configuration File

- <%= go_config.location -%> - Configuration File Path: + <%= go_config.location -%> + Configuration File Path:
\ No newline at end of file diff --git a/server/src/main/webapp/WEB-INF/rails/spec/javascripts/build_summary_observer_spec.js b/server/src/main/webapp/WEB-INF/rails/spec/javascripts/build_summary_observer_spec.js index 3cc363cec78..ce983956fbd 100644 --- a/server/src/main/webapp/WEB-INF/rails/spec/javascripts/build_summary_observer_spec.js +++ b/server/src/main/webapp/WEB-INF/rails/spec/javascripts/build_summary_observer_spec.js @@ -15,8 +15,6 @@ */ describe("BuildSummaryObserverSpec", function BuildSummaryObserverSpec() { var orig_write_attribute = Element.writeAttribute; - var contextPath = "/dashboard"; - var observer; beforeEach(function () { setFixtures("
\n" + @@ -58,12 +56,4 @@ describe("BuildSummaryObserverSpec", function BuildSummaryObserverSpec() { observer.updateBuildResult(json); assertTrue(status.hasClass("failed")); }); - - it("test_should_invoke_word_break_to_break_text", function () { - $$WordBreaker.break_text = function () { - return "split text"; - }; - observer.displayAnyErrorMessages(inactive_json("project1")); - assertTrue(jQuery('#trans_content').text().indexOf("split text") > -1); - }); }); diff --git a/server/src/main/webapp/WEB-INF/rails/spec/javascripts/word_break_inserter_spec.js b/server/src/main/webapp/WEB-INF/rails/spec/javascripts/word_break_inserter_spec.js deleted file mode 100644 index 312b75fb241..00000000000 --- a/server/src/main/webapp/WEB-INF/rails/spec/javascripts/word_break_inserter_spec.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2023 Thoughtworks, Inc. - * - * Licensed 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. - */ -describe("word_break_inserter", function () { - beforeEach(function () { - setFixtures("
addpr
"); - }); - - it("test_should_insert_wbr_to_content_of_wbr_sensitive_element_in_firefox", function () { - Prototype.Browser.Gecko = true; - new WordBreaker(2).insert(); - var content = $('wbr1').innerHTML.toLowerCase(); - assertEquals('addpr', content); - }); - - it("test_should_insert_wbr_to_content_of_wbr_sensitive_every_3_char_in_firefox", function () { - Prototype.Browser.Gecko = true; - new WordBreaker(3).insert(); - var content = $('wbr1').innerHTML.toLowerCase(); - assertEquals('addpr', content); - }); - - it("test_should_insert_wbr_to_individual_element_in_firefox", function () { - Prototype.Browser.Gecko = true; - new WordBreaker(2).word_break($('wbr1')); - var content = $('wbr1').innerHTML.toLowerCase(); - assertEquals('addpr', content); - }); - - it("test_should_not_insert_wbr_when_wbr_already_exist", function () { - Prototype.Browser.Gecko = true; - var wbr = new WordBreaker(3); - var expected = 'addpr'; - $('wbr1').innerHTML = expected; - wbr.insert(); - var content = $('wbr1').innerHTML.toLowerCase(); - assertEquals(expected, content); - }); -}); - - From a3c1acd7335600810baccee898c0dcbaeba47700 Mon Sep 17 00:00:00 2001 From: Chad Wilson Date: Tue, 4 Apr 2023 22:26:57 +0800 Subject: [PATCH 2/6] Remove unnecessary prototypeJS references --- .../rails/spec/javascripts/build_summary_observer_spec.js | 2 +- .../WEB-INF/rails/spec/javascripts/helpers/test_helper.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/webapp/WEB-INF/rails/spec/javascripts/build_summary_observer_spec.js b/server/src/main/webapp/WEB-INF/rails/spec/javascripts/build_summary_observer_spec.js index ce983956fbd..1d0ae62b8b3 100644 --- a/server/src/main/webapp/WEB-INF/rails/spec/javascripts/build_summary_observer_spec.js +++ b/server/src/main/webapp/WEB-INF/rails/spec/javascripts/build_summary_observer_spec.js @@ -47,7 +47,7 @@ describe("BuildSummaryObserverSpec", function BuildSummaryObserverSpec() { jQuery('#container').addClass("building_passed"); jQuery('#trans_content').html(''); - TransMessage.prototype.initialize = Prototype.emptyFunction; + TransMessage.prototype.initialize = function() {}; }); it("test_ajax_periodical_refresh_active_build_should_update_css", function () { diff --git a/server/src/main/webapp/WEB-INF/rails/spec/javascripts/helpers/test_helper.js b/server/src/main/webapp/WEB-INF/rails/spec/javascripts/helpers/test_helper.js index c9ddeab0da1..7dd9cfc2eeb 100644 --- a/server/src/main/webapp/WEB-INF/rails/spec/javascripts/helpers/test_helper.js +++ b/server/src/main/webapp/WEB-INF/rails/spec/javascripts/helpers/test_helper.js @@ -17,7 +17,7 @@ var MockXHR = Class.create({ initialize: function(responseHeaders, responseText){ this.status = 0; this.readyState = 0; - this.onreadystatechange = Prototype.emptyFunction; + this.onreadystatechange = function() {}; this.headers = responseHeaders ? responseHeaders : {}; this.setResponseCode(); this.responseText = responseText ? responseText : ''; From 71e27567f3ee74a069e960775ec6dac8aa9b967f Mon Sep 17 00:00:00 2001 From: Chad Wilson Date: Tue, 4 Apr 2023 22:27:06 +0800 Subject: [PATCH 3/6] Minor generics fix --- .../models/JobStatusJsonPresentationModel.java | 2 +- .../models/JobStatusJsonPresentationModelTest.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/com/thoughtworks/go/server/presentation/models/JobStatusJsonPresentationModel.java b/server/src/main/java/com/thoughtworks/go/server/presentation/models/JobStatusJsonPresentationModel.java index 76b5d481408..a07f3db06b8 100644 --- a/server/src/main/java/com/thoughtworks/go/server/presentation/models/JobStatusJsonPresentationModel.java +++ b/server/src/main/java/com/thoughtworks/go/server/presentation/models/JobStatusJsonPresentationModel.java @@ -57,7 +57,7 @@ public JobStatusJsonPresentationModel(JobInstance instance) { this(instance, null, new DurationBean(instance.getId())); } - public Map toJsonHash() { + public Map toJsonHash() { Map jsonParams = new LinkedHashMap<>(); jsonParams.put("agent", agent.getHostnameForDisplay()); jsonParams.put("agent_ip", agent.getIpaddress()); diff --git a/server/src/test-fast/java/com/thoughtworks/go/server/presentation/models/JobStatusJsonPresentationModelTest.java b/server/src/test-fast/java/com/thoughtworks/go/server/presentation/models/JobStatusJsonPresentationModelTest.java index d9f962b4fec..b7cad19b641 100644 --- a/server/src/test-fast/java/com/thoughtworks/go/server/presentation/models/JobStatusJsonPresentationModelTest.java +++ b/server/src/test-fast/java/com/thoughtworks/go/server/presentation/models/JobStatusJsonPresentationModelTest.java @@ -45,7 +45,7 @@ public void shouldShowBuildStatus() { JobStatusJsonPresentationModel presenter = new JobStatusJsonPresentationModel(instance, agent, mock(DurationBean.class)); - Map json = presenter.toJsonHash(); + Map json = presenter.toJsonHash(); assertThatJson(new Gson().toJson(json)).when(IGNORING_EXTRA_FIELDS).isEqualTo("{\n" + " \"name\": \"test\",\n" + @@ -60,7 +60,7 @@ public void shouldShowBuildStatusForCompleted() { JobInstance instance = completed("test", Passed); JobStatusJsonPresentationModel presenter = new JobStatusJsonPresentationModel(instance); - Map json = presenter.toJsonHash(); + Map json = presenter.toJsonHash(); assertThatJson(new Gson().toJson(json)).when(IGNORING_EXTRA_FIELDS).isEqualTo("{\n" + " \"name\": \"test\",\n" + @@ -74,7 +74,7 @@ public void shouldShowElapsedAndRemainingTimeForIncompleteBuild() { JobStatusJsonPresentationModel presenter = new JobStatusJsonPresentationModel(instance, mock(Agent.class), new DurationBean(instance.getId(), 10L)); - Map json = presenter.toJsonHash(); + Map json = presenter.toJsonHash(); assertThatJson(new Gson().toJson(json)).when(IGNORING_EXTRA_FIELDS).isEqualTo("{\n" + " \"name\": \"test\",\n" + @@ -115,7 +115,7 @@ public void shouldEncodeBuildLocator() { instance.setIdentifier(new JobIdentifier("cruise-%", 1, "label-1", "dev-%", "1", "job-%", -1L)); JobStatusJsonPresentationModel presenter = new JobStatusJsonPresentationModel(instance); - Map json = presenter.toJsonHash(); + Map json = presenter.toJsonHash(); assertThatJson(json).node("buildLocator").isEqualTo("cruise-%25/1/dev-%25/1/job-%25"); } @@ -126,7 +126,7 @@ public void shouldIncludeBuildLocatorForDisplay() { instance.setIdentifier(new JobIdentifier("cruise-%", 1, "label-1", "dev-%", "1", "job-%", -1L)); JobStatusJsonPresentationModel presenter = new JobStatusJsonPresentationModel(instance); - Map json = presenter.toJsonHash(); + Map json = presenter.toJsonHash(); assertThatJson(json).node("buildLocatorForDisplay").isEqualTo("cruise-%/label-1/dev-%/1/job-%"); } From 0c07d8f8a392ef2040578f75309fd2b09b3e0e53 Mon Sep 17 00:00:00 2001 From: Chad Wilson Date: Tue, 4 Apr 2023 23:08:49 +0800 Subject: [PATCH 4/6] Remove script.aculo.us effects This is technically required by the Prototype.JS-based Modalbox however only when transitions are enabled. We don't enable that and it seems to work fine without it, so let's remove some confusing JS that seems unnecessary. --- .../license-for-javascript-not-in-yarn.json | 16 - .../app/assets/javascripts/application.js | 5 +- .../assets/javascripts/lib/effects-1.8.0.js | 1125 ----------------- 3 files changed, 1 insertion(+), 1145 deletions(-) delete mode 100644 server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/lib/effects-1.8.0.js diff --git a/buildSrc/src/main/resources/license-for-javascript-not-in-yarn.json b/buildSrc/src/main/resources/license-for-javascript-not-in-yarn.json index bd7705d5e61..ec4aa15ab4b 100644 --- a/buildSrc/src/main/resources/license-for-javascript-not-in-yarn.json +++ b/buildSrc/src/main/resources/license-for-javascript-not-in-yarn.json @@ -31,22 +31,6 @@ } ] }, - "script.aculo.us": { - "moduleName": "script.aculo.us", - "moduleVersion": "1.8.0", - "moduleUrls": [ - "https://github.com/madrobby/scriptaculous" - ], - "filenames": [ - "effects-1.8.0.js" - ], - "moduleLicenses": [ - { - "moduleLicense": "MIT", - "moduleLicenseUrl": "https://spdx.org/licenses/MIT.html" - } - ] - }, "d3": { "moduleName": "d3", "moduleVersion": "3.1.5", diff --git a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/application.js b/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/application.js index a7dc4220f46..14e8171f410 100644 --- a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/application.js +++ b/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/application.js @@ -32,12 +32,9 @@ // toJSON that need to be worked around with Json.parse(Json.stringify(jsonObject)) in various places //= require "lib/prototype-1.6.0.3.js" -// Used by Rails job history dropdown (at very least, via .dropdown-menu) and ModalBox claims it doe +// Used by Rails job history dropdown (at very least, via .dropdown-menu) //= require "lib/bootstrap-2.3.2.min.js" -// Used by Rails stage details / stage history (via ModalBox) at least -//= require "lib/effects-1.8.0.js" - // used by Rails value_stream_map_renderer //= require "lib/jquery-ui-1.7.3.custom.min.js" diff --git a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/lib/effects-1.8.0.js b/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/lib/effects-1.8.0.js deleted file mode 100644 index 13d8e07444b..00000000000 --- a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/lib/effects-1.8.0.js +++ /dev/null @@ -1,1125 +0,0 @@ -/*! -// script.aculo.us effects.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007 - -// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// Contributors: -// Justin Palmer (http://encytemedia.com/) -// Mark Pilgrim (http://diveintomark.org/) -// Martin Bialasinki -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// converts rgb() and #xxx to #xxxxxx format, -// returns self (or first argument) if not convertable -*/ - -String.prototype.parseColor = function() { - var color = '#'; - if (this.slice(0,4) == 'rgb(') { - var cols = this.slice(4,this.length-1).split(','); - var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); - } else { - if (this.slice(0,1) == '#') { - if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); - if (this.length==7) color = this.toLowerCase(); - } - } - return (color.length==7 ? color : (arguments[0] || this)); -}; - -/*--------------------------------------------------------------------------*/ - -Element.collectTextNodes = function(element) { - return $A($(element).childNodes).collect( function(node) { - return (node.nodeType==3 ? node.nodeValue : - (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); - }).flatten().join(''); -}; - -Element.collectTextNodesIgnoreClass = function(element, className) { - return $A($(element).childNodes).collect( function(node) { - return (node.nodeType==3 ? node.nodeValue : - ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? - Element.collectTextNodesIgnoreClass(node, className) : '')); - }).flatten().join(''); -}; - -Element.setContentZoom = function(element, percent) { - element = $(element); - element.setStyle({fontSize: (percent/100) + 'em'}); - if (Prototype.Browser.WebKit) window.scrollBy(0,0); - return element; -}; - -Element.getInlineOpacity = function(element){ - return $(element).style.opacity || ''; -}; - -Element.forceRerendering = function(element) { - try { - element = $(element); - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch(e) { } -}; - -/*--------------------------------------------------------------------------*/ - -var Effect = { - _elementDoesNotExistError: { - name: 'ElementDoesNotExistError', - message: 'The specified DOM element does not exist, but is required for this effect to operate' - }, - Transitions: { - linear: Prototype.K, - sinoidal: function(pos) { - return (-Math.cos(pos*Math.PI)/2) + 0.5; - }, - reverse: function(pos) { - return 1-pos; - }, - flicker: function(pos) { - var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; - return pos > 1 ? 1 : pos; - }, - wobble: function(pos) { - return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; - }, - pulse: function(pos, pulses) { - pulses = pulses || 5; - return ( - ((pos % (1/pulses)) * pulses).round() == 0 ? - ((pos * pulses * 2) - (pos * pulses * 2).floor()) : - 1 - ((pos * pulses * 2) - (pos * pulses * 2).floor()) - ); - }, - spring: function(pos) { - return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); - }, - none: function(pos) { - return 0; - }, - full: function(pos) { - return 1; - } - }, - DefaultOptions: { - duration: 1.0, // seconds - fps: 100, // 100= assume 66fps max. - sync: false, // true for combining - from: 0.0, - to: 1.0, - delay: 0.0, - queue: 'parallel' - }, - tagifyText: function(element) { - var tagifyStyle = 'position:relative'; - if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; - - element = $(element); - $A(element.childNodes).each( function(child) { - if (child.nodeType==3) { - child.nodeValue.toArray().each( function(character) { - element.insertBefore( - new Element('span', {style: tagifyStyle}).update( - character == ' ' ? String.fromCharCode(160) : character), - child); - }); - Element.remove(child); - } - }); - }, - multiple: function(element, effect) { - var elements; - if (((typeof element == 'object') || - Object.isFunction(element)) && - (element.length)) - elements = element; - else - elements = $(element).childNodes; - - var options = Object.extend({ - speed: 0.1, - delay: 0.0 - }, arguments[2] || { }); - var masterDelay = options.delay; - - $A(elements).each( function(element, index) { - new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); - }); - }, - PAIRS: { - 'slide': ['SlideDown','SlideUp'], - 'blind': ['BlindDown','BlindUp'], - 'appear': ['Appear','Fade'] - }, - toggle: function(element, effect) { - element = $(element); - effect = (effect || 'appear').toLowerCase(); - var options = Object.extend({ - queue: { position:'end', scope:(element.id || 'global'), limit: 1 } - }, arguments[2] || { }); - Effect[element.visible() ? - Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); - } -}; - -Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; - -/* ------------- core effects ------------- */ - -Effect.ScopedQueue = Class.create(Enumerable, { - initialize: function() { - this.effects = []; - this.interval = null; - }, - _each: function(iterator) { - this.effects._each(iterator); - }, - add: function(effect) { - var timestamp = new Date().getTime(); - - var position = Object.isString(effect.options.queue) ? - effect.options.queue : effect.options.queue.position; - - switch(position) { - case 'front': - // move unstarted effects after this effect - this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { - e.startOn += effect.finishOn; - e.finishOn += effect.finishOn; - }); - break; - case 'with-last': - timestamp = this.effects.pluck('startOn').max() || timestamp; - break; - case 'end': - // start effect after last queued effect has finished - timestamp = this.effects.pluck('finishOn').max() || timestamp; - break; - } - - effect.startOn += timestamp; - effect.finishOn += timestamp; - - if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) - this.effects.push(effect); - - if (!this.interval) - this.interval = setInterval(this.loop.bind(this), 15); - }, - remove: function(effect) { - this.effects = this.effects.reject(function(e) { return e==effect }); - if (this.effects.length == 0) { - clearInterval(this.interval); - this.interval = null; - } - }, - loop: function() { - var timePos = new Date().getTime(); - for(var i=0, len=this.effects.length;i= this.startOn) { - if (timePos >= this.finishOn) { - this.render(1.0); - this.cancel(); - this.event('beforeFinish'); - if (this.finish) this.finish(); - this.event('afterFinish'); - return; - } - var pos = (timePos - this.startOn) / this.totalTime, - frame = (pos * this.totalFrames).round(); - if (frame > this.currentFrame) { - this.render(pos); - this.currentFrame = frame; - } - } - }, - cancel: function() { - if (!this.options.sync) - Effect.Queues.get(Object.isString(this.options.queue) ? - 'global' : this.options.queue.scope).remove(this); - this.state = 'finished'; - }, - event: function(eventName) { - if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); - if (this.options[eventName]) this.options[eventName](this); - }, - inspect: function() { - var data = $H(); - for(property in this) - if (!Object.isFunction(this[property])) data.set(property, this[property]); - return '#'; - } -}); - -Effect.Parallel = Class.create(Effect.Base, { - initialize: function(effects) { - this.effects = effects || []; - this.start(arguments[1]); - }, - update: function(position) { - this.effects.invoke('render', position); - }, - finish: function(position) { - this.effects.each( function(effect) { - effect.render(1.0); - effect.cancel(); - effect.event('beforeFinish'); - if (effect.finish) effect.finish(position); - effect.event('afterFinish'); - }); - } -}); - -Effect.Tween = Class.create(Effect.Base, { - initialize: function(object, from, to) { - object = Object.isString(object) ? $(object) : object; - var args = $A(arguments), method = args.last(), - options = args.length == 5 ? args[3] : null; - this.method = Object.isFunction(method) ? method.bind(object) : - Object.isFunction(object[method]) ? object[method].bind(object) : - function(value) { object[method] = value }; - this.start(Object.extend({ from: from, to: to }, options || { })); - }, - update: function(position) { - this.method(position); - } -}); - -Effect.Event = Class.create(Effect.Base, { - initialize: function() { - this.start(Object.extend({ duration: 0 }, arguments[0] || { })); - }, - update: Prototype.emptyFunction -}); - -Effect.Opacity = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - // make this work on IE on elements without 'layout' - if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) - this.element.setStyle({zoom: 1}); - var options = Object.extend({ - from: this.element.getOpacity() || 0.0, - to: 1.0 - }, arguments[1] || { }); - this.start(options); - }, - update: function(position) { - this.element.setOpacity(position); - } -}); - -Effect.Move = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ - x: 0, - y: 0, - mode: 'relative' - }, arguments[1] || { }); - this.start(options); - }, - setup: function() { - this.element.makePositioned(); - this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); - this.originalTop = parseFloat(this.element.getStyle('top') || '0'); - if (this.options.mode == 'absolute') { - this.options.x = this.options.x - this.originalLeft; - this.options.y = this.options.y - this.originalTop; - } - }, - update: function(position) { - this.element.setStyle({ - left: (this.options.x * position + this.originalLeft).round() + 'px', - top: (this.options.y * position + this.originalTop).round() + 'px' - }); - } -}); - -// for backwards compatibility -Effect.MoveBy = function(element, toTop, toLeft) { - return new Effect.Move(element, - Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); -}; - -Effect.Scale = Class.create(Effect.Base, { - initialize: function(element, percent) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ - scaleX: true, - scaleY: true, - scaleContent: true, - scaleFromCenter: false, - scaleMode: 'box', // 'box' or 'contents' or { } with provided values - scaleFrom: 100.0, - scaleTo: percent - }, arguments[2] || { }); - this.start(options); - }, - setup: function() { - this.restoreAfterFinish = this.options.restoreAfterFinish || false; - this.elementPositioning = this.element.getStyle('position'); - - this.originalStyle = { }; - ['top','left','width','height','fontSize'].each( function(k) { - this.originalStyle[k] = this.element.style[k]; - }.bind(this)); - - this.originalTop = this.element.offsetTop; - this.originalLeft = this.element.offsetLeft; - - var fontSize = this.element.getStyle('font-size') || '100%'; - ['em','px','%','pt'].each( function(fontSizeType) { - if (fontSize.indexOf(fontSizeType)>0) { - this.fontSize = parseFloat(fontSize); - this.fontSizeType = fontSizeType; - } - }.bind(this)); - - this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; - - this.dims = null; - if (this.options.scaleMode=='box') - this.dims = [this.element.offsetHeight, this.element.offsetWidth]; - if (/^content/.test(this.options.scaleMode)) - this.dims = [this.element.scrollHeight, this.element.scrollWidth]; - if (!this.dims) - this.dims = [this.options.scaleMode.originalHeight, - this.options.scaleMode.originalWidth]; - }, - update: function(position) { - var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); - if (this.options.scaleContent && this.fontSize) - this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); - this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); - }, - finish: function(position) { - if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); - }, - setDimensions: function(height, width) { - var d = { }; - if (this.options.scaleX) d.width = width.round() + 'px'; - if (this.options.scaleY) d.height = height.round() + 'px'; - if (this.options.scaleFromCenter) { - var topd = (height - this.dims[0])/2; - var leftd = (width - this.dims[1])/2; - if (this.elementPositioning == 'absolute') { - if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; - if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; - } else { - if (this.options.scaleY) d.top = -topd + 'px'; - if (this.options.scaleX) d.left = -leftd + 'px'; - } - } - this.element.setStyle(d); - } -}); - -Effect.Highlight = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); - this.start(options); - }, - setup: function() { - // Prevent executing on elements not in the layout flow - if (this.element.getStyle('display')=='none') { this.cancel(); return; } - // Disable background image during the effect - this.oldStyle = { }; - if (!this.options.keepBackgroundImage) { - this.oldStyle.backgroundImage = this.element.getStyle('background-image'); - this.element.setStyle({backgroundImage: 'none'}); - } - if (!this.options.endcolor) - this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); - if (!this.options.restorecolor) - this.options.restorecolor = this.element.getStyle('background-color'); - // init color calculations - this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); - this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); - }, - update: function(position) { - this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ - return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); - }, - finish: function() { - this.element.setStyle(Object.extend(this.oldStyle, { - backgroundColor: this.options.restorecolor - })); - } -}); - -Effect.ScrollTo = function(element) { - var options = arguments[1] || { }, - scrollOffsets = document.viewport.getScrollOffsets(), - elementOffsets = $(element).cumulativeOffset(), - max = (window.height || document.body.scrollHeight) - document.viewport.getHeight(); - - if (options.offset) elementOffsets[1] += options.offset; - - return new Effect.Tween(null, - scrollOffsets.top, - elementOffsets[1] > max ? max : elementOffsets[1], - options, - function(p){ scrollTo(scrollOffsets.left, p.round()) } - ); -}; - -/* ------------- combination effects ------------- */ - -Effect.Fade = function(element) { - element = $(element); - var oldOpacity = element.getInlineOpacity(); - var options = Object.extend({ - from: element.getOpacity() || 1.0, - to: 0.0, - afterFinishInternal: function(effect) { - if (effect.options.to!=0) return; - effect.element.hide().setStyle({opacity: oldOpacity}); - } - }, arguments[1] || { }); - return new Effect.Opacity(element,options); -}; - -Effect.Appear = function(element) { - element = $(element); - var options = Object.extend({ - from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), - to: 1.0, - // force Safari to render floated elements properly - afterFinishInternal: function(effect) { - effect.element.forceRerendering(); - }, - beforeSetup: function(effect) { - effect.element.setOpacity(effect.options.from).show(); - }}, arguments[1] || { }); - return new Effect.Opacity(element,options); -}; - -Effect.Puff = function(element) { - element = $(element); - var oldStyle = { - opacity: element.getInlineOpacity(), - position: element.getStyle('position'), - top: element.style.top, - left: element.style.left, - width: element.style.width, - height: element.style.height - }; - return new Effect.Parallel( - [ new Effect.Scale(element, 200, - { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], - Object.extend({ duration: 1.0, - beforeSetupInternal: function(effect) { - Position.absolutize(effect.effects[0].element) - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide().setStyle(oldStyle); } - }, arguments[1] || { }) - ); -}; - -Effect.BlindUp = function(element) { - element = $(element); - element.makeClipping(); - return new Effect.Scale(element, 0, - Object.extend({ scaleContent: false, - scaleX: false, - restoreAfterFinish: true, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping(); - } - }, arguments[1] || { }) - ); -}; - -Effect.BlindDown = function(element) { - element = $(element); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, 100, Object.extend({ - scaleContent: false, - scaleX: false, - scaleFrom: 0, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makeClipping().setStyle({height: '0px'}).show(); - }, - afterFinishInternal: function(effect) { - effect.element.undoClipping(); - } - }, arguments[1] || { })); -}; - -Effect.SwitchOff = function(element) { - element = $(element); - var oldOpacity = element.getInlineOpacity(); - return new Effect.Appear(element, Object.extend({ - duration: 0.4, - from: 0, - transition: Effect.Transitions.flicker, - afterFinishInternal: function(effect) { - new Effect.Scale(effect.element, 1, { - duration: 0.3, scaleFromCenter: true, - scaleX: false, scaleContent: false, restoreAfterFinish: true, - beforeSetup: function(effect) { - effect.element.makePositioned().makeClipping(); - }, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); - } - }) - } - }, arguments[1] || { })); -}; - -Effect.DropOut = function(element) { - element = $(element); - var oldStyle = { - top: element.getStyle('top'), - left: element.getStyle('left'), - opacity: element.getInlineOpacity() }; - return new Effect.Parallel( - [ new Effect.Move(element, {x: 0, y: 100, sync: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 }) ], - Object.extend( - { duration: 0.5, - beforeSetup: function(effect) { - effect.effects[0].element.makePositioned(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); - } - }, arguments[1] || { })); -}; - -Effect.Shake = function(element) { - element = $(element); - var options = Object.extend({ - distance: 20, - duration: 0.5 - }, arguments[1] || {}); - var distance = parseFloat(options.distance); - var split = parseFloat(options.duration) / 10.0; - var oldStyle = { - top: element.getStyle('top'), - left: element.getStyle('left') }; - return new Effect.Move(element, - { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) { - effect.element.undoPositioned().setStyle(oldStyle); - }}) }}) }}) }}) }}) }}); -}; - -Effect.SlideDown = function(element) { - element = $(element).cleanWhitespace(); - // SlideDown need to have the content of the element wrapped in a container element with fixed height! - var oldInnerBottom = element.down().getStyle('bottom'); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, 100, Object.extend({ - scaleContent: false, - scaleX: false, - scaleFrom: window.opera ? 0 : 1, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makePositioned(); - effect.element.down().makePositioned(); - if (window.opera) effect.element.setStyle({top: ''}); - effect.element.makeClipping().setStyle({height: '0px'}).show(); - }, - afterUpdateInternal: function(effect) { - effect.element.down().setStyle({bottom: - (effect.dims[0] - effect.element.clientHeight) + 'px' }); - }, - afterFinishInternal: function(effect) { - effect.element.undoClipping().undoPositioned(); - effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } - }, arguments[1] || { }) - ); -}; - -Effect.SlideUp = function(element) { - element = $(element).cleanWhitespace(); - var oldInnerBottom = element.down().getStyle('bottom'); - var elementDimensions = element.getDimensions(); - return new Effect.Scale(element, window.opera ? 0 : 1, - Object.extend({ scaleContent: false, - scaleX: false, - scaleMode: 'box', - scaleFrom: 100, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { - effect.element.makePositioned(); - effect.element.down().makePositioned(); - if (window.opera) effect.element.setStyle({top: ''}); - effect.element.makeClipping().show(); - }, - afterUpdateInternal: function(effect) { - effect.element.down().setStyle({bottom: - (effect.dims[0] - effect.element.clientHeight) + 'px' }); - }, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping().undoPositioned(); - effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); - } - }, arguments[1] || { }) - ); -}; - -// Bug in opera makes the TD containing this element expand for a instance after finish -Effect.Squish = function(element) { - return new Effect.Scale(element, window.opera ? 1 : 0, { - restoreAfterFinish: true, - beforeSetup: function(effect) { - effect.element.makeClipping(); - }, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping(); - } - }); -}; - -Effect.Grow = function(element) { - element = $(element); - var options = Object.extend({ - direction: 'center', - moveTransition: Effect.Transitions.sinoidal, - scaleTransition: Effect.Transitions.sinoidal, - opacityTransition: Effect.Transitions.full - }, arguments[1] || { }); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: element.getInlineOpacity() }; - - var dims = element.getDimensions(); - var initialMoveX, initialMoveY; - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - initialMoveX = initialMoveY = moveX = moveY = 0; - break; - case 'top-right': - initialMoveX = dims.width; - initialMoveY = moveY = 0; - moveX = -dims.width; - break; - case 'bottom-left': - initialMoveX = moveX = 0; - initialMoveY = dims.height; - moveY = -dims.height; - break; - case 'bottom-right': - initialMoveX = dims.width; - initialMoveY = dims.height; - moveX = -dims.width; - moveY = -dims.height; - break; - case 'center': - initialMoveX = dims.width / 2; - initialMoveY = dims.height / 2; - moveX = -dims.width / 2; - moveY = -dims.height / 2; - break; - } - - return new Effect.Move(element, { - x: initialMoveX, - y: initialMoveY, - duration: 0.01, - beforeSetup: function(effect) { - effect.element.hide().makeClipping().makePositioned(); - }, - afterFinishInternal: function(effect) { - new Effect.Parallel( - [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), - new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), - new Effect.Scale(effect.element, 100, { - scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, - sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) - ], Object.extend({ - beforeSetup: function(effect) { - effect.effects[0].element.setStyle({height: '0px'}).show(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); - } - }, options) - ) - } - }); -}; - -Effect.Shrink = function(element) { - element = $(element); - var options = Object.extend({ - direction: 'center', - moveTransition: Effect.Transitions.sinoidal, - scaleTransition: Effect.Transitions.sinoidal, - opacityTransition: Effect.Transitions.none - }, arguments[1] || { }); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: element.getInlineOpacity() }; - - var dims = element.getDimensions(); - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - moveX = moveY = 0; - break; - case 'top-right': - moveX = dims.width; - moveY = 0; - break; - case 'bottom-left': - moveX = 0; - moveY = dims.height; - break; - case 'bottom-right': - moveX = dims.width; - moveY = dims.height; - break; - case 'center': - moveX = dims.width / 2; - moveY = dims.height / 2; - break; - } - - return new Effect.Parallel( - [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), - new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), - new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) - ], Object.extend({ - beforeStartInternal: function(effect) { - effect.effects[0].element.makePositioned().makeClipping(); - }, - afterFinishInternal: function(effect) { - effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } - }, options) - ); -}; - -Effect.Pulsate = function(element) { - element = $(element); - var options = arguments[1] || { }; - var oldOpacity = element.getInlineOpacity(); - var transition = options.transition || Effect.Transitions.sinoidal; - var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; - reverser.bind(transition); - return new Effect.Opacity(element, - Object.extend(Object.extend({ duration: 2.0, from: 0, - afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } - }, options), {transition: reverser})); -}; - -Effect.Fold = function(element) { - element = $(element); - var oldStyle = { - top: element.style.top, - left: element.style.left, - width: element.style.width, - height: element.style.height }; - element.makeClipping(); - return new Effect.Scale(element, 5, Object.extend({ - scaleContent: false, - scaleX: false, - afterFinishInternal: function(effect) { - new Effect.Scale(element, 1, { - scaleContent: false, - scaleY: false, - afterFinishInternal: function(effect) { - effect.element.hide().undoClipping().setStyle(oldStyle); - } }); - }}, arguments[1] || { })); -}; - -Effect.Morph = Class.create(Effect.Base, { - initialize: function(element) { - this.element = $(element); - if (!this.element) throw(Effect._elementDoesNotExistError); - var options = Object.extend({ - style: { } - }, arguments[1] || { }); - - if (!Object.isString(options.style)) this.style = $H(options.style); - else { - if (options.style.include(':')) - this.style = options.style.parseStyle(); - else { - this.element.addClassName(options.style); - this.style = $H(this.element.getStyles()); - this.element.removeClassName(options.style); - var css = this.element.getStyles(); - this.style = this.style.reject(function(style) { - return style.value == css[style.key]; - }); - options.afterFinishInternal = function(effect) { - effect.element.addClassName(effect.options.style); - effect.transforms.each(function(transform) { - effect.element.style[transform.style] = ''; - }); - } - } - } - this.start(options); - }, - - setup: function(){ - function parseColor(color){ - if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; - color = color.parseColor(); - return $R(0,2).map(function(i){ - return parseInt( color.slice(i*2+1,i*2+3), 16 ) - }); - } - this.transforms = this.style.map(function(pair){ - var property = pair[0], value = pair[1], unit = null; - - if (value.parseColor('#zzzzzz') != '#zzzzzz') { - value = value.parseColor(); - unit = 'color'; - } else if (property == 'opacity') { - value = parseFloat(value); - if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) - this.element.setStyle({zoom: 1}); - } else if (Element.CSS_LENGTH.test(value)) { - var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); - value = parseFloat(components[1]); - unit = (components.length == 3) ? components[2] : null; - } - - var originalValue = this.element.getStyle(property); - return { - style: property.camelize(), - originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), - targetValue: unit=='color' ? parseColor(value) : value, - unit: unit - }; - }.bind(this)).reject(function(transform){ - return ( - (transform.originalValue == transform.targetValue) || - ( - transform.unit != 'color' && - (isNaN(transform.originalValue) || isNaN(transform.targetValue)) - ) - ) - }); - }, - update: function(position) { - var style = { }, transform, i = this.transforms.length; - while(i--) - style[(transform = this.transforms[i]).style] = - transform.unit=='color' ? '#'+ - (Math.round(transform.originalValue[0]+ - (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + - (Math.round(transform.originalValue[1]+ - (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + - (Math.round(transform.originalValue[2]+ - (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : - (transform.originalValue + - (transform.targetValue - transform.originalValue) * position).toFixed(3) + - (transform.unit === null ? '' : transform.unit); - this.element.setStyle(style, true); - } -}); - -Effect.Transform = Class.create({ - initialize: function(tracks){ - this.tracks = []; - this.options = arguments[1] || { }; - this.addTracks(tracks); - }, - addTracks: function(tracks){ - tracks.each(function(track){ - track = $H(track); - var data = track.values().first(); - this.tracks.push($H({ - ids: track.keys().first(), - effect: Effect.Morph, - options: { style: data } - })); - }.bind(this)); - return this; - }, - play: function(){ - return new Effect.Parallel( - this.tracks.map(function(track){ - var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options'); - var elements = [$(ids) || $$(ids)].flatten(); - return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) }); - }).flatten(), - this.options - ); - } -}); - -Element.CSS_PROPERTIES = $w( - 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + - 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + - 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + - 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + - 'fontSize fontWeight height left letterSpacing lineHeight ' + - 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ - 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + - 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + - 'right textIndent top width wordSpacing zIndex'); - -Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; - -String.__parseStyleElement = document.createElement('div'); -String.prototype.parseStyle = function(){ - var style, styleRules = $H(); - if (Prototype.Browser.WebKit) - style = new Element('div',{style:this}).style; - else { - String.__parseStyleElement.innerHTML = '
'; - style = String.__parseStyleElement.childNodes[0].style; - } - - Element.CSS_PROPERTIES.each(function(property){ - if (style[property]) styleRules.set(property, style[property]); - }); - - if (Prototype.Browser.IE && this.include('opacity')) - styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); - - return styleRules; -}; - -if (document.defaultView && document.defaultView.getComputedStyle) { - Element.getStyles = function(element) { - var css = document.defaultView.getComputedStyle($(element), null); - return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { - styles[property] = css[property]; - return styles; - }); - }; -} else { - Element.getStyles = function(element) { - element = $(element); - var css = element.currentStyle, styles; - styles = Element.CSS_PROPERTIES.inject({ }, function(hash, property) { - hash.set(property, css[property]); - return hash; - }); - if (!styles.opacity) styles.set('opacity', element.getOpacity()); - return styles; - }; -}; - -Effect.Methods = { - morph: function(element, style) { - element = $(element); - new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); - return element; - }, - visualEffect: function(element, effect, options) { - element = $(element) - var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); - new Effect[klass](element, options); - return element; - }, - highlight: function(element, options) { - element = $(element); - new Effect.Highlight(element, options); - return element; - } -}; - -$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ - 'pulsate shake puff squish switchOff dropOut').each( - function(effect) { - Effect.Methods[effect] = function(element, options){ - element = $(element); - Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); - return element; - } - } -); - -$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( - function(f) { Effect.Methods[f] = Element[f]; } -); - -Element.addMethods(Effect.Methods); From 1e1b981d1f746763cc29f2acbcd74d68748cfe07 Mon Sep 17 00:00:00 2001 From: Chad Wilson Date: Tue, 4 Apr 2023 23:25:18 +0800 Subject: [PATCH 5/6] Remove unnecessary ElementAligner This seemed to only have affect on some ancient Rails pages long since removed. Only the stage details overview job breakdown uses css_toggling right now and the element aligner seems to not do anything. --- .../app/assets/javascripts/css_toggling.js | 1 - .../app/assets/javascripts/element_aligner.js | 134 ------------------ 2 files changed, 135 deletions(-) delete mode 100644 server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/element_aligner.js diff --git a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/css_toggling.js b/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/css_toggling.js index b1ce344ae91..6d156811ee5 100644 --- a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/css_toggling.js +++ b/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/css_toggling.js @@ -17,7 +17,6 @@ function make_collapsable(container_id) { var container_id_selector = "#" + container_id.replace(/\./g,"\\."); jQuery(container_id_selector + " .hidereveal_expander").click(function (event) { jQuery(container_id_selector).toggleClass("hidereveal_collapsed"); - new ElementAligner().alignAll(); event.stopPropagation(); }); } diff --git a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/element_aligner.js b/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/element_aligner.js deleted file mode 100644 index 3c8a9535e57..00000000000 --- a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/element_aligner.js +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2023 Thoughtworks, Inc. - * - * Licensed 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. - */ -var ElementAligner = function() { - - var RowsIterator = function() { - var remainingPipelines; - - function nextRow() { - if (remainingPipelines.length == 0) { - return null; - } - - var zeroth_pipeline = remainingPipelines[0]; - var nextRows = [zeroth_pipeline]; - var remaining = []; - var zeroth_offset = zeroth_pipeline.offset(); - var minTopSeen = zeroth_offset.top; - var maxBottomSeen = minTopSeen + zeroth_pipeline.height(); - - for(var i = 1; i < remainingPipelines.length; i++) { - var thisPipeline = remainingPipelines[i]; - var thisTop = thisPipeline.offset().top; - if (minTopSeen > thisTop) { - minTopSeen = thisTop; - maxBottomSeen = minTopSeen + thisPipeline.height(); - remaining = remaining.concat(nextRows); - nextRows = [thisPipeline]; - } else if(minTopSeen === thisTop) { - nextRows.push(thisPipeline); - var potentialMaxBottom = minTopSeen + thisPipeline.height(); - if (maxBottomSeen < potentialMaxBottom) { - maxBottomSeen = potentialMaxBottom; - } - } else { - remaining.push(thisPipeline); - } - } - - remainingPipelines = remaining; - - return {rows: nextRows, maxBottom: maxBottomSeen, top: minTopSeen}; - } - - function init(pipelines) { - remainingPipelines = []; - for(var i = 0; i < pipelines.length; i++) { - var pipeline = jQuery(pipelines[i]); - remainingPipelines.push(pipeline); - } - } - - init.prototype.nextRow = nextRow; - - return init; - }(); - - - function makeSameHeight(row) { - var max_height = row.maxBottom - row.top; - for(var i = 0; i < row.rows.length; i++) { - var ele = row.rows[i]; - ele.css('padding-bottom',max_height - ele.height() + ((i == row.rows.length-1)?16:15)); - } - } - - - function reduce(elements, fn, seed) { - elements.each(function() { - seed = fn(this, seed); - }); - return seed; - } - - function init() {} - - init.prototype.alignAll = alignAll; - - function alignAll() { - var groups = document.getElementsByClassName('pipelines'); - for(var i = 0; i < groups.length; i++) { - var group = groups[i]; - if (group.tagName != "BODY") { - if (ViewportPredicate.dom_visible(group)) { - alignSection(group); - } - } - } - } - - var cooldown = null; - - function alignAllOnCooldown() { - if (cooldown) { - clearTimeout(cooldown); - } - cooldown = setTimeout(alignAll, 150); - } - - function alignSection(section) { - align(section.getElementsByClassName('pipeline')); - } - - function align(elements) { - var iterator = new RowsIterator(elements); - var row; - while (row = iterator.nextRow()) { - if (ViewportPredicate.in_y(row.top, row.maxBottom)) { - makeSameHeight(row); - } - } - } - - init.hookupAlignEvents = function() { - Util.on_load(alignAll); - $j(window).resize(alignAll); - $j(window).scroll(alignAllOnCooldown); - }; - - return init; -}(); - From 144dd729a6b692ad657ddd5edd97638789029020 Mon Sep 17 00:00:00 2001 From: Chad Wilson Date: Tue, 4 Apr 2023 23:27:58 +0800 Subject: [PATCH 6/6] Remove unused cookie_utils Last usage seemed to disappear this legacy sidebar removal earlier in 7662c6d86247bd1b803b03728eb31bc1094a0378 --- .../app/assets/javascripts/cookie_utils.js | 70 ------------------- 1 file changed, 70 deletions(-) delete mode 100644 server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/cookie_utils.js diff --git a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/cookie_utils.js b/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/cookie_utils.js deleted file mode 100644 index 989ac5995e0..00000000000 --- a/server/src/main/webapp/WEB-INF/rails/app/assets/javascripts/cookie_utils.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2023 Thoughtworks, Inc. - * - * Licensed 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. - */ -/* utf-8 encoding */ -var caution = true; - -var default_cookie_expires = new Date(); -//default expires = 1 year -default_cookie_expires.setTime(default_cookie_expires.getTime() + 12 * 30 * 24 * 60 * 60 * 1000); - -/* name - name of the cookie - * value - value of the cookie - * [expires] - expiration date of the cookie - * (defaults to end of current session) - * [path] - path for which the cookie is valid - * (defaults to path of calling document) - * [domain] - domain for which the cookie is valid - * (defaults to domain of calling document) - * [secure] - Boolean value indicating if - * the cookie transmission requires a secure transmission - * an argument defaults when it is assigned null as a placeholder - * a null placeholder is not required for trailing omitted arguments - */ -function setCookie(name, value, expires, path, domain, secure) { - var curCookie = name + "=" + escape(value) + - ((expires) ? "; expires=" + expires.toGMTString() : "; expires=" + default_cookie_expires.toGMTString()) + - ((path) ? "; path=" + path : "") + - ((domain) ? "; domain=" + domain : ";") + - ((secure) ? "; secure" : ""); - if (!caution || (name + "=" + escape(value)).length <= 4000) { - document.cookie = curCookie; - } - else { - if (confirm("Cookie size exceed 4KB,please empty your cookie.")){ - document.cookie = curCookie; - } - } -} - -/*s name - name of the cookie - * return string containing value - * of specified cookie or null if cookie - * does not exist - */ -function getCookie(name) { - var prefix = name + "="; - var cookieStartIndex = document.cookie.indexOf(prefix); - if (cookieStartIndex == -1){ - return null; - } - var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + - prefix.length); - if (cookieEndIndex == -1){ - cookieEndIndex = document.cookie.length; - } - return unescape(document.cookie.substring(cookieStartIndex + - prefix.length,cookieEndIndex)); -}