upgraded requirejs to 2.1.10
- upgraded raphaël to 2.1.2 - upgraded FileAPI to 2.0.4 - amd-ified files - removed unnecessary shims - removed "use!" usage - removed "order" requirejs plugin - using new shim configuration format - replace deprecated require.resourcesDone with !window.requirejs.s.contexts._.defQueue.length - using UglifyJS separate from r.js - added keep_trying_until in selenium specs to fix timing issue - fix race condition in take_quiz.js with .file-upload-question-holder Change-Id: I8c205ef4c80115fa0cbd662c184490f1b9626336 Reviewed-on: https://gerrit.instructure.com/29683 Tested-by: Jenkins <jenkins@instructure.com> Reviewed-by: Ryan Florence <ryanf@instructure.com> QA-Review: Nathan Rogowski <nathan@instructure.com> Product-Review: Aaron Shafovaloff <ashafovaloff@instructure.com> Tested-by: Aaron Shafovaloff <ashafovaloff@instructure.com>
This commit is contained in:
parent
306678eac9
commit
20f692c884
|
@ -1,7 +1,7 @@
|
|||
# copied from: https://gist.github.com/1998897
|
||||
|
||||
define [
|
||||
'use!vendor/backbone'
|
||||
'vendor/backbone'
|
||||
'underscore'
|
||||
'jquery'
|
||||
], (Backbone, _, $) ->
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
define [
|
||||
'use!vendor/backbone'
|
||||
'vendor/backbone'
|
||||
'underscore'
|
||||
'compiled/util/mixin'
|
||||
'compiled/backbone-ext/DefaultUrlMixin'
|
||||
], (Backbone, _, mixin, DefaultUrlMixin) ->
|
||||
|
||||
class Backbone.Collection extends Backbone.Collection
|
||||
##
|
||||
# Mixes in objects to a model's definition, being mindful of certain
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
define [
|
||||
'compiled/util/mixin'
|
||||
'underscore'
|
||||
'use!vendor/backbone'
|
||||
'vendor/backbone'
|
||||
'compiled/backbone-ext/Model/computedAttributes'
|
||||
'compiled/backbone-ext/Model/dateAttributes'
|
||||
'compiled/backbone-ext/Model/errors'
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define ['use!vendor/backbone', 'underscore'], (Backbone, _) ->
|
||||
define ['vendor/backbone', 'underscore'], (Backbone, _) ->
|
||||
|
||||
_.extend Backbone.Model.prototype,
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define ['use!vendor/backbone', 'underscore'], (Backbone, _) ->
|
||||
define ['vendor/backbone', 'underscore'], (Backbone, _) ->
|
||||
|
||||
_parse = Backbone.Model::parse
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define ['underscore', 'use!vendor/backbone'], (_, Backbone) ->
|
||||
define ['underscore', 'vendor/backbone'], (_, Backbone) ->
|
||||
|
||||
_.extend Backbone.Model.prototype,
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
define [
|
||||
'jquery'
|
||||
'use!vendor/backbone'
|
||||
'vendor/backbone'
|
||||
'underscore'
|
||||
'str/htmlEscape'
|
||||
'compiled/util/mixin'
|
||||
|
|
|
@ -3,6 +3,5 @@ require [
|
|||
'compiled/views/collaborations/CollaborationsPage'
|
||||
'collaborations'
|
||||
], ($, CollaborationsPage) ->
|
||||
|
||||
page = new CollaborationsPage(el: $('body'))
|
||||
|
||||
page.initPageState()
|
||||
|
|
|
@ -10,6 +10,7 @@ require [
|
|||
|
||||
# modules that do their own thing on every page that simply need to
|
||||
# be required
|
||||
'translations/_core'
|
||||
'translations/_core_en'
|
||||
'jquery.ajaxJSON'
|
||||
'vendor/firebugx'
|
||||
|
@ -34,7 +35,6 @@ require [
|
|||
|
||||
# other stuff several bundles use
|
||||
'media_comments'
|
||||
'order'
|
||||
'jqueryui/effects/drop'
|
||||
'jqueryui/progressbar'
|
||||
'jqueryui/tabs'
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
require ['jquery', 'full_files', 'jquery.google-analytics', 'use!uploadify'], ($) ->
|
||||
require ['jquery', 'full_files', 'jquery.google-analytics', 'uploadify'], ($) ->
|
||||
|
||||
$ ->
|
||||
$('.manage_collaborations').on 'click', ->
|
||||
|
|
|
@ -3,5 +3,4 @@
|
|||
# - Be strict about what you include or allow to be included here.
|
||||
# - Don't write code here, include helpers from their own files
|
||||
|
||||
define ['compiled/ember/shared/helpers/t']
|
||||
|
||||
define ['compiled/ember/shared/helpers/t'], ->
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
define ['ember', 'i18nObj'], (Ember, I18n) ->
|
||||
Ember.Handlebars.registerHelper 't', (translationKey, defaultValue, options) ->
|
||||
wrappers = {}
|
||||
options = options?.hash ? {}
|
||||
scope = options.scope
|
||||
delete options.scope
|
||||
for key, value of options when key.match(/^w\d+$/)
|
||||
wrappers[new Array(parseInt(key.replace('w', '')) + 2).join('*')] = value
|
||||
delete options[key]
|
||||
options.wrapper = wrappers if wrappers['*']
|
||||
options.needsEscaping = true
|
||||
options = Ember.$.extend(options, this) unless this instanceof String or typeof this is 'string'
|
||||
I18n.scoped(scope).t(translationKey, defaultValue, options)
|
||||
|
||||
wrappers = {}
|
||||
options = options?.hash ? {}
|
||||
scope = options.scope
|
||||
delete options.scope
|
||||
for key, value of options when key.match(/^w\d+$/)
|
||||
wrappers[new Array(parseInt(key.replace('w', '')) + 2).join('*')] = value
|
||||
delete options[key]
|
||||
options.wrapper = wrappers if wrappers['*']
|
||||
options.needsEscaping = true
|
||||
options = Ember.$.extend(options, this) unless this instanceof String or typeof this is 'string'
|
||||
I18n.scoped(scope).t(translationKey, defaultValue, options)
|
||||
|
|
|
@ -3,7 +3,7 @@ define [
|
|||
'jquery'
|
||||
'underscore'
|
||||
'compiled/models/File'
|
||||
'use!vendor/FileAPI/FileAPI.min'
|
||||
'vendor/FileAPI/FileAPI.min'
|
||||
], (I18n, $, _, File, FileAPI) ->
|
||||
|
||||
class ImageFile extends File
|
||||
|
|
|
@ -23,7 +23,6 @@ define [
|
|||
'compiled/views/collaborations/CollaborationView'
|
||||
'compiled/views/collaborations/CollaborationFormView'
|
||||
], ($, {each, reject}, {View}, CollaborationView, CollaborationFormView) ->
|
||||
|
||||
class CollaborationsPage extends View
|
||||
events:
|
||||
'click .add_collaboration_link': 'addCollaboration'
|
||||
|
@ -33,7 +32,6 @@ define [
|
|||
@cacheElements()
|
||||
@createViews()
|
||||
@attachEvents()
|
||||
$(document).on('ready', @initPageState)
|
||||
|
||||
# Internal: Set up page state on load.
|
||||
#
|
||||
|
|
|
@ -6,8 +6,8 @@ define [
|
|||
'compiled/views/conversations/SearchableSubmenuView'
|
||||
'jst/conversations/courseOptions'
|
||||
'jquery.instructure_date_and_time'
|
||||
'use!vendor/bootstrap/bootstrap-dropdown'
|
||||
'use!vendor/bootstrap-select/bootstrap-select'
|
||||
'vendor/bootstrap/bootstrap-dropdown'
|
||||
'vendor/bootstrap-select/bootstrap-select'
|
||||
], (I18n, $, _, {View, Collection}, SearchableSubmenuView, template) ->
|
||||
|
||||
class CourseSelectionView extends View
|
||||
|
|
|
@ -4,8 +4,8 @@ define [
|
|||
'Backbone'
|
||||
'compiled/views/conversations/CourseSelectionView'
|
||||
'compiled/views/conversations/SearchView'
|
||||
'use!vendor/bootstrap/bootstrap-dropdown'
|
||||
'use!vendor/bootstrap-select/bootstrap-select'
|
||||
'vendor/bootstrap/bootstrap-dropdown'
|
||||
'vendor/bootstrap-select/bootstrap-select'
|
||||
], (I18n, _, {View}, CourseSelectionView, SearchView) ->
|
||||
|
||||
class InboxHeaderView extends View
|
||||
|
|
|
@ -21,7 +21,7 @@ define [
|
|||
'compiled/views/profiles/AvatarUploadBaseView'
|
||||
'jst/profiles/uploadFileView'
|
||||
'compiled/util/BlobFactory'
|
||||
'use!vendor/jquery.jcrop'
|
||||
'vendor/jquery.jcrop'
|
||||
], (_, BaseView, template, BlobFactory) ->
|
||||
|
||||
class UploadFileView extends BaseView
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
baseUrl: '<%= js_base_url %>',
|
||||
paths: <%= raw Canvas::RequireJs.paths(true) %>,
|
||||
packages : <%= raw Canvas::RequireJs.packages %>,
|
||||
use: <%= raw Canvas::RequireJs.shims %>
|
||||
shim: <%= raw Canvas::RequireJs.shims %>
|
||||
};
|
||||
</script>
|
||||
|
||||
|
@ -31,7 +31,7 @@
|
|||
var timeout = 10;
|
||||
var check = function() {
|
||||
attempts++;
|
||||
var done = require.resourcesDone === true
|
||||
var done = !window.requirejs.s.contexts._.defQueue.length
|
||||
var giveup = attempts === 100; // 1 second
|
||||
if (done || giveup) {
|
||||
var className = document.documentElement.className;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
({
|
||||
|
||||
// file optimizations
|
||||
optimize: "uglify",
|
||||
optimize: "none",
|
||||
|
||||
// continue to let Jammit do its thing
|
||||
optimizeCss: "none",
|
||||
|
@ -22,7 +22,7 @@
|
|||
packages: <%= packages %>,
|
||||
|
||||
// non-amd shims
|
||||
use: <%= shims %>,
|
||||
shim: <%= shims %>,
|
||||
|
||||
// which modules should have their dependencies concatenated into them
|
||||
modules: [
|
||||
|
@ -36,7 +36,6 @@
|
|||
// this is the intersection of common and tinymce, we need to script this
|
||||
// config file...
|
||||
exclude: [
|
||||
'order',
|
||||
'i18n',
|
||||
'str/escapeRegex',
|
||||
'vendor/date',
|
||||
|
|
|
@ -27,7 +27,6 @@ File.open(__FILE__) do |f|
|
|||
maintain_plugin_symlinks('public')
|
||||
# our new unified build.js and friends require these two symlinks
|
||||
maintain_plugin_symlinks('public/javascripts')
|
||||
maintain_plugin_symlinks('public/optimized')
|
||||
maintain_plugin_symlinks('app/coffeescripts')
|
||||
maintain_plugin_symlinks('app/views/jst')
|
||||
maintain_plugin_symlinks('app/stylesheets')
|
||||
|
|
|
@ -60,9 +60,8 @@ module Canvas
|
|||
@paths ||= {
|
||||
:common => 'compiled/bundles/common',
|
||||
:jqueryui => 'vendor/jqueryui',
|
||||
:use => 'vendor/use',
|
||||
:uploadify => '../flash/uploadify/jquery.uploadify-3.1.min',
|
||||
'ic-dialog' => 'vendor/ic-dialog/dist/main.amd',
|
||||
'ic-dialog' => 'vendor/ic-dialog/dist/main.amd'
|
||||
}.update(cache_busting ? cache_busting_paths : {}).update(plugin_paths).update(Canvas::RequireJs::PluginExtension.paths).to_json.gsub(/([,{])/, "\\1\n ")
|
||||
end
|
||||
|
||||
|
@ -93,66 +92,34 @@ module Canvas
|
|||
{
|
||||
'bower/ember/ember': {
|
||||
deps: ['jquery', 'handlebars'],
|
||||
attach: 'Ember'
|
||||
exports: 'Ember'
|
||||
},
|
||||
'bower/ember-data/ember-data': {
|
||||
deps: ['ember'],
|
||||
attach: 'DS'
|
||||
exports: 'DS'
|
||||
},
|
||||
'bower/handlebars/handlebars.runtime': {
|
||||
attach: 'Handlebars'
|
||||
exports: 'Handlebars'
|
||||
},
|
||||
'vendor/backbone': {
|
||||
deps: ['underscore', 'jquery'],
|
||||
attach: function(_, $){
|
||||
return Backbone;
|
||||
}
|
||||
},
|
||||
// slick grid shim
|
||||
'vendor/slickgrid/lib/jquery.event.drag-2.2': {
|
||||
deps: ['jquery'],
|
||||
attach: '$'
|
||||
},
|
||||
'vendor/slickgrid/slick.core': {
|
||||
deps: ['jquery', 'use!vendor/slickgrid/lib/jquery.event.drag-2.2'],
|
||||
attach: 'Slick'
|
||||
},
|
||||
'vendor/slickgrid/slick.grid': {
|
||||
deps: ['use!vendor/slickgrid/slick.core'],
|
||||
attach: 'Slick'
|
||||
},
|
||||
'vendor/slickgrid/slick.editors': {
|
||||
deps: ['use!vendor/slickgrid/slick.core'],
|
||||
attach: 'Slick'
|
||||
},
|
||||
'vendor/slickgrid/plugins/slick.rowselectionmodel': {
|
||||
deps: ['use!vendor/slickgrid/slick.core'],
|
||||
attach: 'Slick'
|
||||
},
|
||||
|
||||
'uploadify' : {
|
||||
deps: ['jquery'],
|
||||
attach: '$'
|
||||
},
|
||||
|
||||
'vendor/FileAPI/FileAPI.min': {
|
||||
deps: ['jquery', 'vendor/FileAPI/config'],
|
||||
attach: 'FileAPI'
|
||||
exports: 'FileAPI'
|
||||
},
|
||||
|
||||
'vendor/bootstrap/bootstrap-dropdown' : {
|
||||
'uploadify': {
|
||||
deps: ['jquery'],
|
||||
attach: '$'
|
||||
exports: '$'
|
||||
},
|
||||
|
||||
'vendor/bootstrap-select/bootstrap-select' : {
|
||||
deps: ['jquery'],
|
||||
attach: '$'
|
||||
exports: '$'
|
||||
},
|
||||
|
||||
'vendor/jquery.jcrop': {
|
||||
deps: ['jquery'],
|
||||
attach: '$'
|
||||
exports: '$'
|
||||
},
|
||||
'handlebars': {
|
||||
deps: ['bower/handlebars/handlebars.runtime.amd'],
|
||||
exports: 'Handlebars'
|
||||
}
|
||||
}
|
||||
JS
|
||||
|
|
|
@ -62,6 +62,10 @@ namespace :js do
|
|||
# run test for each ember app individually
|
||||
matcher = ENV['JS_SPEC_MATCHER']
|
||||
|
||||
if matcher
|
||||
puts "--> Matcher: #{matcher}"
|
||||
end
|
||||
|
||||
if !matcher || matcher.to_s =~ %r{app/coffeescripts/ember}
|
||||
ignored_embers = ['shared','modules'] #,'quizzes','screenreader_gradebook'
|
||||
Dir.entries('app/coffeescripts/ember').reject { |d|
|
||||
|
@ -213,12 +217,19 @@ namespace :js do
|
|||
result(Canvas::RequireJs.get_binding)
|
||||
File.open("#{Rails.root}/config/build.js", 'w') { |f| f.write(output) }
|
||||
|
||||
puts "--> Optimizing canvas-lms"
|
||||
puts "--> Concatenating JavaScript bundles with r.js"
|
||||
optimize_time = Benchmark.realtime do
|
||||
output = `node #{Rails.root}/node_modules/rjs-old/r.js-1.0.8/dist/r.js -o #{Rails.root}/config/build.js 2>&1`
|
||||
output = `node #{Rails.root}/node_modules/requirejs/bin/r.js -o #{Rails.root}/config/build.js 2>&1`
|
||||
raise "Error running js:build: \n#{output}\nABORTING" if $?.exitstatus != 0
|
||||
end
|
||||
puts "--> Optimized canvas-lms in #{optimize_time}"
|
||||
puts "--> Concatenated JavaScript bundles in #{optimize_time}"
|
||||
|
||||
puts "--> Compressing JavaScript with UglifyJS"
|
||||
optimize_time = Benchmark.realtime do
|
||||
output = `npm run compress 2>&1`
|
||||
raise "Error running js:build: \n#{output}\nABORTING" if $?.exitstatus != 0
|
||||
end
|
||||
puts "--> Compressed JavaScript in #{optimize_time}"
|
||||
end
|
||||
|
||||
desc "creates ember app bundles"
|
||||
|
|
12
package.json
12
package.json
|
@ -2,10 +2,11 @@
|
|||
"name": "canvas-lms",
|
||||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"napa": "~0.3.0"
|
||||
"requirejs": "~2.1.10",
|
||||
"uglify-js": "~2.4.12",
|
||||
"glob": "~3.2.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"requirejs": "~2.1.10",
|
||||
"loom": "~2.0.0",
|
||||
"fleck": "~0.5.1",
|
||||
"testem": "~0.3.30",
|
||||
|
@ -22,11 +23,8 @@
|
|||
"type": "git",
|
||||
"url": "git://github.com/instructure/canvas-lms.git"
|
||||
},
|
||||
"napa": {
|
||||
"rjs-old": "https://github.com/jrburke/r.js/archive/1.0.8.tar.gz"
|
||||
},
|
||||
"scripts": {
|
||||
"install": "./node_modules/napa/bin/napa",
|
||||
"test": "./node_modules/karma/bin/karma start --browsers Chrome,Firefox,Safari --single-run"
|
||||
"test": "./node_modules/karma/bin/karma start --browsers Chrome,Firefox,Safari --single-run",
|
||||
"compress": "node script/compress.js"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
define(['jquery'],function($) {
|
||||
|
||||
/*
|
||||
SWFObject v2.2 <http://code.google.com/p/swfobject/>
|
||||
is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
|
||||
|
@ -965,4 +967,6 @@ Released under the MIT License <http://www.opensource.org/licenses/mit-license.p
|
|||
|
||||
}
|
||||
|
||||
})($);
|
||||
})($);
|
||||
|
||||
});
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
define([
|
||||
// Get the unpatched Backbone
|
||||
'use!vendor/backbone',
|
||||
'vendor/backbone',
|
||||
|
||||
// Apply all of our patches
|
||||
'compiled/backbone-ext/Backbone.syncWithMultipart',
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
define(['use!bower/ember-data/ember-data'], function(DS){
|
||||
define(['bower/ember-data/ember-data'], function(DS){
|
||||
return DS;
|
||||
});
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
define(['use!bower/ember/ember'], function(Ember) { return Ember; });
|
||||
define(['bower/ember/ember'], function(Ember) { return Ember; });
|
||||
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
define(['use!bower/handlebars/handlebars.runtime'], function(Handlebars) { return Handlebars; });
|
||||
|
||||
define(['bower/handlebars/handlebars.runtime'], function(Handlebars) {
|
||||
return Handlebars;
|
||||
});
|
||||
|
|
|
@ -1,180 +0,0 @@
|
|||
/**
|
||||
* @license RequireJS order 1.0.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved.
|
||||
* Available via the MIT or new BSD license.
|
||||
* see: http://github.com/jrburke/requirejs for details
|
||||
*/
|
||||
/*jslint nomen: false, plusplus: false, strict: false */
|
||||
/*global require: false, define: false, window: false, document: false,
|
||||
setTimeout: false */
|
||||
|
||||
//Specify that requirejs optimizer should wrap this code in a closure that
|
||||
//maps the namespaced requirejs API to non-namespaced local variables.
|
||||
/*requirejs namespace: true */
|
||||
|
||||
(function () {
|
||||
|
||||
//Sadly necessary browser inference due to differences in the way
|
||||
//that browsers load and execute dynamically inserted javascript
|
||||
//and whether the script/cache method works when ordered execution is
|
||||
//desired. Currently, Gecko and Opera do not load/fire onload for scripts with
|
||||
//type="script/cache" but they execute injected scripts in order
|
||||
//unless the 'async' flag is present.
|
||||
//However, this is all changing in latest browsers implementing HTML5
|
||||
//spec. With compliant browsers .async true by default, and
|
||||
//if false, then it will execute in order. Favor that test first for forward
|
||||
//compatibility.
|
||||
var testScript = typeof document !== "undefined" &&
|
||||
typeof window !== "undefined" &&
|
||||
document.createElement("script"),
|
||||
|
||||
supportsInOrderExecution = testScript && (testScript.async ||
|
||||
((window.opera &&
|
||||
Object.prototype.toString.call(window.opera) === "[object Opera]") ||
|
||||
//If Firefox 2 does not have to be supported, then
|
||||
//a better check may be:
|
||||
//('mozIsLocallyAvailable' in window.navigator)
|
||||
("MozAppearance" in document.documentElement.style))),
|
||||
|
||||
//This test is true for IE browsers, which will load scripts but only
|
||||
//execute them once the script is added to the DOM.
|
||||
supportsLoadSeparateFromExecute = testScript &&
|
||||
testScript.readyState === 'uninitialized',
|
||||
|
||||
readyRegExp = /^(complete|loaded)$/,
|
||||
cacheWaiting = [],
|
||||
cached = {},
|
||||
scriptNodes = {},
|
||||
scriptWaiting = [];
|
||||
|
||||
//Done with the test script.
|
||||
testScript = null;
|
||||
|
||||
//Callback used by the type="script/cache" callback that indicates a script
|
||||
//has finished downloading.
|
||||
function scriptCacheCallback(evt) {
|
||||
var node = evt.currentTarget || evt.srcElement, i,
|
||||
moduleName, resource;
|
||||
|
||||
if (evt.type === "load" || readyRegExp.test(node.readyState)) {
|
||||
//Pull out the name of the module and the context.
|
||||
moduleName = node.getAttribute("data-requiremodule");
|
||||
|
||||
//Mark this cache request as loaded
|
||||
cached[moduleName] = true;
|
||||
|
||||
//Find out how many ordered modules have loaded
|
||||
for (i = 0; (resource = cacheWaiting[i]); i++) {
|
||||
if (cached[resource.name]) {
|
||||
resource.req([resource.name], resource.onLoad);
|
||||
} else {
|
||||
//Something in the ordered list is not loaded,
|
||||
//so wait.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//If just loaded some items, remove them from cacheWaiting.
|
||||
if (i > 0) {
|
||||
cacheWaiting.splice(0, i);
|
||||
}
|
||||
|
||||
//Remove this script tag from the DOM
|
||||
//Use a setTimeout for cleanup because some older IE versions vomit
|
||||
//if removing a script node while it is being evaluated.
|
||||
setTimeout(function () {
|
||||
node.parentNode.removeChild(node);
|
||||
}, 15);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for the IE case, where fetching is done by creating script element
|
||||
* but not attaching it to the DOM. This function will be called when that
|
||||
* happens so it can be determined when the node can be attached to the
|
||||
* DOM to trigger its execution.
|
||||
*/
|
||||
function onFetchOnly(node) {
|
||||
var i, loadedNode, resourceName;
|
||||
|
||||
//Mark this script as loaded.
|
||||
node.setAttribute('data-orderloaded', 'loaded');
|
||||
|
||||
//Cycle through waiting scripts. If the matching node for them
|
||||
//is loaded, and is in the right order, add it to the DOM
|
||||
//to execute the script.
|
||||
for (i = 0; (resourceName = scriptWaiting[i]); i++) {
|
||||
loadedNode = scriptNodes[resourceName];
|
||||
if (loadedNode &&
|
||||
loadedNode.getAttribute('data-orderloaded') === 'loaded') {
|
||||
delete scriptNodes[resourceName];
|
||||
require.addScriptToDom(loadedNode);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//If just loaded some items, remove them from waiting.
|
||||
if (i > 0) {
|
||||
scriptWaiting.splice(0, i);
|
||||
}
|
||||
}
|
||||
|
||||
define({
|
||||
version: '1.0.0',
|
||||
|
||||
load: function (name, req, onLoad, config) {
|
||||
var url = req.nameToUrl(name, null),
|
||||
node, context;
|
||||
|
||||
//Make sure the async attribute is not set for any pathway involving
|
||||
//this script.
|
||||
require.s.skipAsync[url] = true;
|
||||
if (supportsInOrderExecution || config.isBuild) {
|
||||
//Just a normal script tag append, but without async attribute
|
||||
//on the script.
|
||||
req([name], onLoad);
|
||||
} else if (supportsLoadSeparateFromExecute) {
|
||||
//Just fetch the URL, but do not execute it yet. The
|
||||
//non-standards IE case. Really not so nice because it is
|
||||
//assuming and touching requrejs internals. OK though since
|
||||
//ordered execution should go away after a long while.
|
||||
context = require.s.contexts._;
|
||||
|
||||
if (!context.urlFetched[url] && !context.loaded[name]) {
|
||||
//Indicate the script is being fetched.
|
||||
context.urlFetched[url] = true;
|
||||
|
||||
//Stuff from require.load
|
||||
require.resourcesReady(false);
|
||||
context.scriptCount += 1;
|
||||
|
||||
//Fetch the script now, remember it.
|
||||
node = require.attach(url, context, name, null, null, onFetchOnly);
|
||||
scriptNodes[name] = node;
|
||||
scriptWaiting.push(name);
|
||||
}
|
||||
|
||||
//Do a normal require for it, once it loads, use it as return
|
||||
//value.
|
||||
req([name], onLoad);
|
||||
} else {
|
||||
//Credit to LABjs author Kyle Simpson for finding that scripts
|
||||
//with type="script/cache" allow scripts to be downloaded into
|
||||
//browser cache but not executed. Use that
|
||||
//so that subsequent addition of a real type="text/javascript"
|
||||
//tag will cause the scripts to be executed immediately in the
|
||||
//correct order.
|
||||
if (req.specified(name)) {
|
||||
req([name], onLoad);
|
||||
} else {
|
||||
cacheWaiting.push({
|
||||
name: name,
|
||||
req: req,
|
||||
onLoad: onLoad
|
||||
});
|
||||
require.attach(url, null, name, scriptCacheCallback, "script/cache");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}());
|
|
@ -28,7 +28,8 @@ define([
|
|||
'jquery.instructure_misc_plugins' /* showIf */,
|
||||
'jquery.keycodes' /* keycodes */,
|
||||
'jquery.loadingImg' /* loadingImage */,
|
||||
'jquery.templateData' /* fillTemplateData */
|
||||
'jquery.templateData' /* fillTemplateData */,
|
||||
'compiled/bundles/legacy/add_assignment'
|
||||
], function(INST, I18n, $) {
|
||||
|
||||
$(document).ready(function() {
|
||||
|
|
|
@ -428,6 +428,16 @@ define([
|
|||
}
|
||||
});
|
||||
|
||||
$('.file-upload-question-holder').each(function(i,el) {
|
||||
var $el = $(el);
|
||||
var val = parseInt($el.find('input.attachment-id').val(),10);
|
||||
if (val && val !== 0){
|
||||
$el.find('.file-upload-box').addClass('file-upload-box-with-file');
|
||||
}
|
||||
var model = new File(ENV.ATTACHMENTS[val], {preflightUrl: ENV.UPLOAD_URL});
|
||||
new FileUploadQuestionView({el: el, model: model}).render();
|
||||
});
|
||||
|
||||
$questions
|
||||
.delegate(":checkbox,:radio,label", 'change mouseup', function(event) {
|
||||
var $answer = $(this).parents(".answer");
|
||||
|
@ -630,16 +640,6 @@ define([
|
|||
$submit_buttons.removeAttr('disabled');
|
||||
});
|
||||
|
||||
$('.file-upload-question-holder').each(function(i,el) {
|
||||
var $el = $(el);
|
||||
var val = parseInt($el.find('input.attachment-id').val(),10);
|
||||
if (val && val !== 0){
|
||||
$el.find('.file-upload-box').addClass('file-upload-box-with-file');
|
||||
}
|
||||
var model = new File(ENV.ATTACHMENTS[val], {preflightUrl: ENV.UPLOAD_URL});
|
||||
new FileUploadQuestionView({el: el, model: model}).render();
|
||||
});
|
||||
|
||||
showDeauthorizedDialog = function() {
|
||||
$("#deauthorized_dialog").dialog({
|
||||
modal: true,
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
window.tinyMCEPreInit = {
|
||||
base: '/javascripts/tinymce/jscripts/tiny_mce',
|
||||
suffix: '',
|
||||
query: ''
|
||||
};
|
||||
|
||||
define(function(){
|
||||
window.tinyMCEPreInit = {
|
||||
base: '/javascripts/tinymce/jscripts/tiny_mce',
|
||||
suffix: '',
|
||||
query: ''
|
||||
};
|
||||
});
|
File diff suppressed because one or more lines are too long
|
@ -1,3 +1,5 @@
|
|||
define(['underscore','jquery'],function(_, $) {
|
||||
|
||||
// Backbone.js 1.1.0
|
||||
|
||||
// (c) 2010-2011 Jeremy Ashkenas, DocumentCloud Inc.
|
||||
|
@ -1579,3 +1581,6 @@
|
|||
};
|
||||
|
||||
}).call(this);
|
||||
|
||||
return Backbone;
|
||||
});
|
|
@ -1,3 +1,5 @@
|
|||
define(['jquery'],function($) {
|
||||
|
||||
// INSTRUCTURE modified
|
||||
|
||||
!function($) {
|
||||
|
@ -689,3 +691,5 @@
|
|||
.on('keydown', '[data-toggle=dropdown], [role=menu]' , Selectpicker.prototype.keydown)
|
||||
|
||||
}(window.jQuery);
|
||||
|
||||
});
|
|
@ -1,3 +1,5 @@
|
|||
define(['jquery'],function($) {
|
||||
|
||||
/* ============================================================
|
||||
* bootstrap-dropdown.js v2.3.2
|
||||
* http://twitter.github.com/bootstrap/javascript.html#dropdowns
|
||||
|
@ -234,3 +236,5 @@
|
|||
.on('click.dropdown.data-api', '.dropdown-submenu', Dropdown.prototype.clickSubmenu)
|
||||
|
||||
}(window.jQuery);
|
||||
|
||||
});
|
|
@ -1,10 +1,10 @@
|
|||
/*!
|
||||
* g.Raphael 0.5 - Charting library, based on Raphaël
|
||||
* g.Raphael 0.51 - Charting library, based on Raphaël
|
||||
*
|
||||
* Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com)
|
||||
* Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com)
|
||||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
|
||||
*/
|
||||
(function () {
|
||||
define(['./g.raphael'], function (Raphael) {
|
||||
var mmin = Math.min,
|
||||
mmax = Math.max;
|
||||
|
||||
|
@ -135,9 +135,35 @@
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Vertical Barchart
|
||||
*/
|
||||
/*\
|
||||
* Paper.vbarchart
|
||||
[ method ]
|
||||
**
|
||||
* Creates a vertical bar chart
|
||||
**
|
||||
> Parameters
|
||||
**
|
||||
- x (number) x coordinate of the chart
|
||||
- y (number) y coordinate of the chart
|
||||
- width (number) width of the chart (respected by all elements in the set)
|
||||
- height (number) height of the chart (respected by all elements in the set)
|
||||
- values (array) values
|
||||
- opts (object) options for the chart
|
||||
o {
|
||||
o type (string) type of endings of the bar. Default: 'square'. Other options are: 'round', 'sharp', 'soft'.
|
||||
o gutter (number)(string) default '20%' (WHAT DOES IT DO?)
|
||||
o vgutter (number)
|
||||
o colors (array) colors be used repeatedly to plot the bars. If multicolumn bar is used each sequence of bars with use a different color.
|
||||
o stacked (boolean) whether or not to tread values as in a stacked bar chart
|
||||
o to
|
||||
o stretch (boolean)
|
||||
o }
|
||||
**
|
||||
= (object) path element of the popup
|
||||
> Usage
|
||||
| r.vbarchart(0, 0, 620, 260, [76, 70, 67, 71, 69], {})
|
||||
\*/
|
||||
|
||||
function VBarchart(paper, x, y, width, height, values, opts) {
|
||||
opts = opts || {};
|
||||
|
||||
|
@ -187,7 +213,7 @@
|
|||
|
||||
total = Math.max.apply(Math, opts.stacked ? stacktotal : total);
|
||||
}
|
||||
|
||||
|
||||
total = (opts.to) || total;
|
||||
|
||||
var barwidth = width / (len * (100 + gutter) + gutter) * 100,
|
||||
|
@ -388,9 +414,44 @@
|
|||
return chart;
|
||||
};
|
||||
|
||||
/**
|
||||
* Horizontal Barchart
|
||||
*/
|
||||
//inheritance
|
||||
var F = function() {};
|
||||
F.prototype = Raphael.g;
|
||||
HBarchart.prototype = VBarchart.prototype = new F; //prototype reused by hbarchart
|
||||
|
||||
Raphael.fn.barchart = function(x, y, width, height, values, opts) {
|
||||
return new VBarchart(this, x, y, width, height, values, opts);
|
||||
};
|
||||
|
||||
/*\
|
||||
* Paper.barchart
|
||||
[ method ]
|
||||
**
|
||||
* Creates a horizontal bar chart
|
||||
**
|
||||
> Parameters
|
||||
**
|
||||
- x (number) x coordinate of the chart
|
||||
- y (number) y coordinate of the chart
|
||||
- width (number) width of the chart (respected by all elements in the set)
|
||||
- height (number) height of the chart (respected by all elements in the set)
|
||||
- values (array) values
|
||||
- opts (object) options for the chart
|
||||
o {
|
||||
o type (string) type of endings of the bar. Default: 'square'. Other options are: 'round', 'sharp', 'soft'.
|
||||
o gutter (number)(string) default '20%' (WHAT DOES IT DO?)
|
||||
o vgutter (number)
|
||||
o colors (array) colors be used repeatedly to plot the bars. If multicolumn bar is used each sequence of bars with use a different color.
|
||||
o stacked (boolean) whether or not to tread values as in a stacked bar chart
|
||||
o to
|
||||
o stretch (boolean)
|
||||
o }
|
||||
**
|
||||
= (object) path element of the popup
|
||||
> Usage
|
||||
| r.barchart(0, 0, 620, 260, [76, 70, 67, 71, 69], {})
|
||||
\*/
|
||||
|
||||
function HBarchart(paper, x, y, width, height, values, opts) {
|
||||
opts = opts || {};
|
||||
|
||||
|
@ -438,7 +499,7 @@
|
|||
|
||||
total = Math.max.apply(Math, opts.stacked ? stacktotal : total);
|
||||
}
|
||||
|
||||
|
||||
total = (opts.to) || total;
|
||||
|
||||
var barheight = Math.floor(height / (len * (100 + gutter) + gutter) * 100),
|
||||
|
@ -605,17 +666,10 @@
|
|||
chart.covers = covers;
|
||||
return chart;
|
||||
};
|
||||
|
||||
//inheritance
|
||||
var F = function() {};
|
||||
F.prototype = Raphael.g;
|
||||
HBarchart.prototype = VBarchart.prototype = new F;
|
||||
|
||||
|
||||
Raphael.fn.hbarchart = function(x, y, width, height, values, opts) {
|
||||
return new HBarchart(this, x, y, width, height, values, opts);
|
||||
};
|
||||
|
||||
Raphael.fn.barchart = function(x, y, width, height, values, opts) {
|
||||
return new VBarchart(this, x, y, width, height, values, opts);
|
||||
};
|
||||
})();
|
||||
|
||||
return Raphael;
|
||||
});
|
|
@ -1,18 +1,17 @@
|
|||
/*!
|
||||
* g.Raphael 0.5 - Charting library, based on Raphaël
|
||||
* g.Raphael 0.51 - Charting library, based on Raphaël
|
||||
*
|
||||
* Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com)
|
||||
* Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com)
|
||||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
|
||||
*/
|
||||
(function () {
|
||||
var colorValue = function (value, total, s, b) {
|
||||
return 'hsb(' + [Math.min((1 - value / total) * .4, 1), s || .75, b || .75] + ')';
|
||||
};
|
||||
define(['./g.raphael'], function (Raphael) {
|
||||
|
||||
var colorValue = function (value, total, s, b) {
|
||||
return 'hsb(' + [Math.min((1 - value / total) * .4, 1), s || .75, b || .75] + ')';
|
||||
};
|
||||
|
||||
function Dotchart(paper, x, y, width, height, valuesx, valuesy, size, opts) {
|
||||
|
||||
var chartinst = this;
|
||||
|
||||
|
||||
function drawAxis(ax) {
|
||||
+ax[0] && (ax[0] = chartinst.axis(x + gutter, y + gutter, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 2, opts.axisxlabels || null, opts.axisxtype || "t", null, paper));
|
||||
+ax[1] && (ax[1] = chartinst.axis(x + width - gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 3, opts.axisylabels || null, opts.axisytype || "t", null, paper));
|
||||
|
@ -20,7 +19,10 @@
|
|||
+ax[3] && (ax[3] = chartinst.axis(x + gutter - maxR, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 1, opts.axisylabels || null, opts.axisytype || "t", null, paper));
|
||||
}
|
||||
|
||||
//providing defaults
|
||||
|
||||
opts = opts || {};
|
||||
var chartinst = this;
|
||||
var xdim = chartinst.snapEnds(Math.min.apply(Math, valuesx), Math.max.apply(Math, valuesx), valuesx.length - 1),
|
||||
minx = xdim.from,
|
||||
maxx = xdim.to,
|
||||
|
@ -43,6 +45,13 @@
|
|||
|
||||
gutter = Math.max.apply(Math, R.concat(gutter));
|
||||
|
||||
/*\
|
||||
* dotchart.axis
|
||||
[ object ]
|
||||
**
|
||||
* Set containing Elements of the chart axis. Only exists if `'axis'` definition string was passed to @Paper.dotchart
|
||||
**
|
||||
\*/
|
||||
var axis = paper.set(),
|
||||
maxR = Math.max.apply(Math, R);
|
||||
|
||||
|
@ -104,20 +113,65 @@
|
|||
covers[i].dot = series[i];
|
||||
}
|
||||
|
||||
/*\
|
||||
* dotchart.covers
|
||||
[ object ]
|
||||
**
|
||||
* Set of Elements positioned above the symbols and mirroring them in size and shape. Covers are used as a surface for events capturing. Each cover has a property `'dot'` being a reference to the actual data-representing symbol.
|
||||
**
|
||||
**
|
||||
\*/
|
||||
res.covers = covers;
|
||||
/*\
|
||||
* dotchart.series
|
||||
[ object ]
|
||||
**
|
||||
* Set of Elements containing the actual data-representing symbols.
|
||||
**
|
||||
**
|
||||
\*/
|
||||
res.series = series;
|
||||
res.push(series, axis, covers);
|
||||
|
||||
/*\
|
||||
* dotchart.hover
|
||||
[ method ]
|
||||
> Parameters
|
||||
- mouseover handler (function) handler for the event
|
||||
- mouseout handler (function) handler for the event
|
||||
* Conveniece method to set up hover-in and hover-out event handlers
|
||||
= (object) @dotchart object
|
||||
**
|
||||
\*/
|
||||
res.hover = function (fin, fout) {
|
||||
covers.mouseover(fin).mouseout(fout);
|
||||
return this;
|
||||
};
|
||||
|
||||
/*\
|
||||
* dotchart.click
|
||||
[ method ]
|
||||
> Parameters
|
||||
- click handler (function) handler for the event
|
||||
* Conveniece method to set up click event handler
|
||||
= (object) @dotchart object
|
||||
**
|
||||
\*/
|
||||
res.click = function (f) {
|
||||
covers.click(f);
|
||||
return this;
|
||||
};
|
||||
|
||||
/*\
|
||||
* dotchart.each
|
||||
[ method ]
|
||||
> Parameters
|
||||
- callback (function) called for every item in @dotchart.covers.
|
||||
- this (object) callback is executed in a context of a cover element object
|
||||
* Conveniece method iterating on every symbol in the chart
|
||||
= (object) @dotchart object
|
||||
**
|
||||
\*/
|
||||
res.each = function (f) {
|
||||
if (!paper.raphael.is(f, "function")) {
|
||||
return this;
|
||||
|
@ -130,6 +184,15 @@
|
|||
return this;
|
||||
};
|
||||
|
||||
/*\
|
||||
* dotchart.href
|
||||
[ method ]
|
||||
> Parameters
|
||||
- map (array) Array of objects `{x: 1, y: 20, value: 15, href: "http://www.raphaeljs.com"}`
|
||||
* Iterates on all @dotchart.covers elements. If x, y and value on the object are the same as on the cover it sets up a link on a symbol using the passef `href`.
|
||||
= (object) @dotchart object
|
||||
**
|
||||
\*/
|
||||
res.href = function (map) {
|
||||
var cover;
|
||||
|
||||
|
@ -143,14 +206,55 @@
|
|||
};
|
||||
return res;
|
||||
};
|
||||
|
||||
|
||||
//inheritance
|
||||
var F = function() {};
|
||||
F.prototype = Raphael.g
|
||||
Dotchart.prototype = new F;
|
||||
|
||||
//public
|
||||
|
||||
/*
|
||||
* dotchart method on paper
|
||||
*/
|
||||
/*\
|
||||
* Paper.dotchart
|
||||
[ method ]
|
||||
**
|
||||
* Plots a dot chart
|
||||
**
|
||||
> Parameters
|
||||
- x (number) x coordinate of the chart
|
||||
- y (number) y coordinate of the chart
|
||||
- width (number) width of the chart (respected by all elements in the set)
|
||||
- height (number) height of the chart (respected by all elements in the set)
|
||||
- valuesx (array) values used to plot x asis
|
||||
- valuesy (array) values used to plot y asis
|
||||
- size (array) values used as data
|
||||
- opts (object) options for the chart
|
||||
> Possible options
|
||||
o {
|
||||
o max (number) maximum diameter of a dot [default: 100]
|
||||
o symbol (string) symbol used for rendering on the chart. The only possible option is `'circle'` [default]
|
||||
o gutter (number) distance between symbols on the chart [default: 10]
|
||||
o heat (boolean) whether or not to enable coloring higher value symbols with warmer hue [default: false]
|
||||
o opacity (number) opacity of the symbols [default: 1]
|
||||
o href (array) array of URLs to set up click-throughs on the symbols
|
||||
o axis (string) Which axes should be renedered. String of four values evaluated in order `'top right bottom left'` e.g. `'0 0 1 1'`.
|
||||
o axisxstep (number) the number of steps to plot on the axis X
|
||||
o axisystep (number) the number of steps to plot on the axis Y
|
||||
o axisxlabels (array) labels to be rendered instead of numeric values on axis X
|
||||
o axisylabels (array) labels to be rendered instead of numeric values on axis Y
|
||||
o axisxtype (string) Possible values: `'t'` [default], `'|'`, `' '`, `'-'`, `'+'`
|
||||
o axisytype (string) Possible values: `'t'` [default], `'|'`, `' '`, `'-'`, `'+'`
|
||||
o }
|
||||
**
|
||||
= (object) @dotchart object
|
||||
> Usage
|
||||
| //life, expectancy, country and spending per capita (fictional data)
|
||||
| r.dotchart(0, 0, 620, 260, [76, 70, 67, 71, 69], [0, 1, 2, 3, 4], [100, 120, 140, 160, 500], {max: 10, axisylabels: ['Mexico', 'Argentina', 'Cuba', 'Canada', 'United States of America'], heat: true, axis: '0 0 1 1'})
|
||||
\*/
|
||||
Raphael.fn.dotchart = function(x, y, width, height, valuesx, valuesy, size, opts) {
|
||||
return new Dotchart(this, x, y, width, height, valuesx, valuesy, size, opts);
|
||||
}
|
||||
})();
|
||||
|
||||
return Raphael;
|
||||
});
|
|
@ -1,10 +1,12 @@
|
|||
/*!
|
||||
* g.Raphael 0.5 - Charting library, based on Raphaël
|
||||
* g.Raphael 0.51 - Charting library, based on Raphaël
|
||||
*
|
||||
* Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com)
|
||||
* Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com)
|
||||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
|
||||
*/
|
||||
(function () {
|
||||
|
||||
|
||||
define(['./g.raphael'], function (Raphael) {
|
||||
|
||||
function shrink(values, dim) {
|
||||
var k = values.length / dim,
|
||||
|
@ -22,7 +24,7 @@
|
|||
sum = values[j++] * -l;
|
||||
l += k;
|
||||
} else {
|
||||
sum += values[j++];
|
||||
sum += values[j++] * 1;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
|
@ -52,9 +54,9 @@
|
|||
}
|
||||
|
||||
function Linechart(paper, x, y, width, height, valuesx, valuesy, opts) {
|
||||
|
||||
|
||||
var chartinst = this;
|
||||
|
||||
|
||||
opts = opts || {};
|
||||
|
||||
if (!paper.raphael.is(valuesx[0], "array")) {
|
||||
|
@ -78,6 +80,14 @@
|
|||
len = Math.max(len, valuesy[i].length);
|
||||
}
|
||||
|
||||
/*\
|
||||
* linechart.shades
|
||||
[ object ]
|
||||
**
|
||||
* Set containing Elements corresponding to shades plotted in the chart (if `opts.shade` was `true`).
|
||||
**
|
||||
**
|
||||
\*/
|
||||
var shades = paper.set();
|
||||
|
||||
for (i = 0, ii = valuesy.length; i < ii; i++) {
|
||||
|
@ -106,6 +116,14 @@
|
|||
kx = (width - gutter * 2) / ((maxx - minx) || 1),
|
||||
ky = (height - gutter * 2) / ((maxy - miny) || 1);
|
||||
|
||||
/*\
|
||||
* linechart.axis
|
||||
[ object ]
|
||||
**
|
||||
* Set containing Elements of the chart axis. The set is populated if `'axis'` definition string was passed to @Paper.linechart
|
||||
**
|
||||
**
|
||||
\*/
|
||||
var axis = paper.set();
|
||||
|
||||
if (opts.axis) {
|
||||
|
@ -116,7 +134,23 @@
|
|||
+ax[3] && axis.push(chartinst.axis(x + gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 1, paper));
|
||||
}
|
||||
|
||||
/*\
|
||||
* linechart.lines
|
||||
[ object ]
|
||||
**
|
||||
* Set containing Elements corresponding to lines plotted in the chart.
|
||||
**
|
||||
**
|
||||
\*/
|
||||
var lines = paper.set(),
|
||||
/*\
|
||||
* linechart.symbols
|
||||
[ object ]
|
||||
**
|
||||
* Set containing Elements corresponding to symbols plotted in the chart.
|
||||
**
|
||||
**
|
||||
\*/
|
||||
symbols = paper.set(),
|
||||
line;
|
||||
|
||||
|
@ -182,7 +216,7 @@
|
|||
Xs = Xs.concat(valuesx[i]);
|
||||
}
|
||||
|
||||
Xs.sort();
|
||||
Xs.sort(function(a,b) { return a - b; });
|
||||
// remove duplicates
|
||||
|
||||
var Xs2 = [],
|
||||
|
@ -236,8 +270,7 @@
|
|||
var X = x + gutter + ((valuesx[i] || valuesx[0])[j] - minx) * kx,
|
||||
nearX = x + gutter + ((valuesx[i] || valuesx[0])[j ? j - 1 : 1] - minx) * kx,
|
||||
Y = y + height - gutter - (valuesy[i][j] - miny) * ky;
|
||||
|
||||
f ? (C = {}) : cvrs.push(C = paper.circle(X, Y, Math.abs(nearX - X) / 2).attr({ stroke: "none", fill: "#000", opacity: 0 }));
|
||||
f ? (C = {}) : cvrs.push(C = paper.circle(X, Y, Math.abs(nearX - X) / 2).attr({ stroke: "#000", fill: "#000", opacity: 1 }));
|
||||
C.x = X;
|
||||
C.y = Y;
|
||||
C.value = valuesy[i][j];
|
||||
|
@ -259,18 +292,59 @@
|
|||
chart.symbols = symbols;
|
||||
chart.axis = axis;
|
||||
|
||||
/*\
|
||||
* linechart.hoverColumn
|
||||
[ method ]
|
||||
> Parameters
|
||||
- mouseover handler (function) handler for the event
|
||||
- mouseout handler (function) handler for the event
|
||||
- this (object) callback is executed in a context of a cover element
|
||||
* Conveniece method to set up hover-in and hover-out event handlers on the entire area of the chart.
|
||||
* The handlers are passed a event object containing
|
||||
o {
|
||||
o x (number) x coordinate on all lines in the chart
|
||||
o y (array) y coordinates of all lines corresponding to the x
|
||||
o }
|
||||
= (object) @linechart object
|
||||
**
|
||||
\*/
|
||||
|
||||
chart.hoverColumn = function (fin, fout) {
|
||||
!columns && createColumns();
|
||||
columns.mouseover(fin).mouseout(fout);
|
||||
return this;
|
||||
};
|
||||
|
||||
/*\
|
||||
* linechart.clickColumn
|
||||
[ method ]
|
||||
> Parameters
|
||||
- click handler (function) handler for the event
|
||||
- this (object) callback is executed in a context of a cover element
|
||||
* Conveniece method to set up click event handler on the antire area of the chart.
|
||||
* The handler is passed a event object containing
|
||||
o {
|
||||
o x (number) x coordinate on all lines in the chart
|
||||
o y (array) y coordinates of all lines corresponding to the x
|
||||
o }
|
||||
= (object) @linechart object
|
||||
**
|
||||
\*/
|
||||
chart.clickColumn = function (f) {
|
||||
!columns && createColumns();
|
||||
columns.click(f);
|
||||
return this;
|
||||
};
|
||||
|
||||
/*\
|
||||
* linechart.hrefColumn
|
||||
[ method ]
|
||||
> Parameters
|
||||
- cols (object) object containing values as keys and URLs as values, e.g. {1: 'http://www.raphaeljs.com', 2: 'http://g.raphaeljs.com'}
|
||||
* Creates click-throughs on the whole area of the chart corresponding to x values
|
||||
= (object) @linechart object
|
||||
**
|
||||
\*/
|
||||
chart.hrefColumn = function (cols) {
|
||||
var hrefs = paper.raphael.is(arguments[0], "array") ? arguments[0] : arguments;
|
||||
|
||||
|
@ -291,23 +365,75 @@
|
|||
return this;
|
||||
};
|
||||
|
||||
/*\
|
||||
* linechart.hover
|
||||
[ method ]
|
||||
> Parameters
|
||||
- mouseover handler (function) handler for the event
|
||||
- mouseout handler (function) handler for the event
|
||||
* Conveniece method to set up hover-in and hover-out event handlers working on the lines of the chart.
|
||||
* Use @linechart.hoverColumn to work with the entire chart area.
|
||||
= (object) @linechart object
|
||||
**
|
||||
\*/
|
||||
chart.hover = function (fin, fout) {
|
||||
!dots && createDots();
|
||||
dots.mouseover(fin).mouseout(fout);
|
||||
return this;
|
||||
};
|
||||
|
||||
/*\
|
||||
* linechart.click
|
||||
[ method ]
|
||||
> Parameters
|
||||
- click handler (function) handler for the event
|
||||
- this (object) callback is executed in a context of a cover element
|
||||
* Conveniece method to set up click event handler on the lines of the chart
|
||||
* Use @linechart.clickColumn to work with the entire chart area.
|
||||
= (object) @linechart object
|
||||
**
|
||||
\*/
|
||||
chart.click = function (f) {
|
||||
!dots && createDots();
|
||||
dots.click(f);
|
||||
return this;
|
||||
};
|
||||
|
||||
/*\
|
||||
* linechart.each
|
||||
[ method ]
|
||||
> Parameters
|
||||
- callback (function) function executed for every data point
|
||||
- this (object) context of the callback function.
|
||||
o {
|
||||
o x (number) x coordinate of the data point
|
||||
o y (number) y coordinate of the data point
|
||||
o value (number) value represented by the data point
|
||||
o }
|
||||
* Iterates over each unique data point plotted on every line on the chart.
|
||||
= (object) @linechart object
|
||||
**
|
||||
\*/
|
||||
chart.each = function (f) {
|
||||
createDots(f);
|
||||
return this;
|
||||
};
|
||||
|
||||
/*\
|
||||
* linechart.eachColumn
|
||||
[ method ]
|
||||
> Parameters
|
||||
- callback (function) function executed for every column
|
||||
- this (object) context of the callback function.
|
||||
o {
|
||||
o x (number) x coordinate of the data point
|
||||
o y (array) y coordinates of data points existing for the given x
|
||||
o values (array) values represented by the data points existing for the given x
|
||||
o }
|
||||
* Iterates over each column area (area plotted above the chart).
|
||||
= (object) @linechart object
|
||||
**
|
||||
\*/
|
||||
chart.eachColumn = function (f) {
|
||||
createColumns(f);
|
||||
return this;
|
||||
|
@ -315,15 +441,51 @@
|
|||
|
||||
return chart;
|
||||
};
|
||||
|
||||
|
||||
//inheritance
|
||||
var F = function() {};
|
||||
F.prototype = Raphael.g;
|
||||
Linechart.prototype = new F;
|
||||
|
||||
//public
|
||||
|
||||
/*
|
||||
* linechart method on paper
|
||||
*/
|
||||
/*\
|
||||
* Paper.linechart
|
||||
[ method ]
|
||||
**
|
||||
* Creates a line chart
|
||||
**
|
||||
> Parameters
|
||||
**
|
||||
- x (number) x coordinate of the chart
|
||||
- y (number) y coordinate of the chart
|
||||
- width (number) width of the chart (including the axis)
|
||||
- height (number) height of the chart (including the axis)
|
||||
- valuesx (array) values to plot on axis x
|
||||
- valuesy (array) values to plot on axis y
|
||||
- opts (object) options for the chart
|
||||
o {
|
||||
o gutter (number) distance between symbols on the chart
|
||||
o symbol (string) (array) symbol to be plotted as nodes of the chart, if array are passed symbols are printed iteratively. Currently `'circle'` and `''` (no symbol) are the only supported options.
|
||||
o width (number) controls the size of the plotted symbol. Also controls the thickness of the line using a formula stroke-width=width/2. This option is likely to change in the future versions of g.raphael.
|
||||
o colors (array) colors to plot data series. Raphael default colors are used if not passed
|
||||
o shade (boolean) whether or not to plot a shade of the chart [default: false]. Currently only a shade between the line and x axis is supported.
|
||||
o nostroke (boolean) whether or not to plot lines [default: false]. Only practical when shade is enabled.
|
||||
o dash (string) changes display of the line from continues to dashed or dotted (Possible values are the same as stroke-dasharray attribute, see @Element.attr).
|
||||
o smooth (boolean) changes display of the line from point-to-point straight lines to curves (type C, see @Paper.path).
|
||||
o axis (string) Which axes should be renedered. String of four values evaluated in order `'top right bottom left'` e.g. `'0 0 1 1'`.
|
||||
o axisxstep (number) distance between values on axis X
|
||||
o axisystep (number) distance between values on axis Y
|
||||
o }
|
||||
**
|
||||
= (object) path element of the popup
|
||||
> Usage
|
||||
| r.linechart(0, 0, 99, 99, [1,2,3,4,5], [[1,2,3,4,5], [1,3,9,16,25], [100,50,25,12,6]], {smooth: true, colors: ['#F00', '#0F0', '#FF0'], symbol: 'circle'});
|
||||
\*/
|
||||
Raphael.fn.linechart = function(x, y, width, height, valuesx, valuesy, opts) {
|
||||
return new Linechart(this, x, y, width, height, valuesx, valuesy, opts);
|
||||
}
|
||||
|
||||
})();
|
||||
};
|
||||
|
||||
return Raphael;
|
||||
});
|
|
@ -1,10 +1,47 @@
|
|||
/*
|
||||
* g.Raphael 0.5 - Charting library, based on Raphaël
|
||||
/*!
|
||||
* g.Raphael 0.51 - Charting library, based on Raphaël
|
||||
*
|
||||
* Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com)
|
||||
* Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com)
|
||||
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
|
||||
*/
|
||||
(function () {
|
||||
|
||||
define(['./g.raphael'], function (Raphael) {
|
||||
|
||||
/*
|
||||
* piechart method on paper
|
||||
*/
|
||||
/*\
|
||||
* Paper.piechart
|
||||
[ method ]
|
||||
**
|
||||
* Creates a pie chart
|
||||
**
|
||||
> Parameters
|
||||
**
|
||||
- cx (number) x coordinate of the chart
|
||||
- cy (number) y coordinate of the chart
|
||||
- r (integer) radius of the chart
|
||||
- values (array) values used to plot
|
||||
- opts (object) options for the chart
|
||||
o {
|
||||
o minPercent (number) minimal percent threshold which will have a slice rendered. Sliced corresponding to data points below this threshold will be collapsed into 1 additional slice. [default `1`]
|
||||
o maxSlices (number) a threshold for how many slices should be rendered before collapsing all remaining slices into 1 additional slice (to focus on most important data points). [default `100`]
|
||||
o stroke (string) color of the circle stroke in HTML color format [default `"#FFF"`]
|
||||
o strokewidth (integer) width of the chart stroke [default `1`]
|
||||
o init (boolean) whether or not to show animation when the chart is ready [default `false`]
|
||||
o colors (array) colors be used to plot the chart
|
||||
o href (array) urls to to set up clicks on chart slices
|
||||
o legend (array) array containing strings that will be used in a legend. Other label options work if legend is defined.
|
||||
o legendcolor (string) color of text in legend [default `"#000"`]
|
||||
o legendothers (string) text that will be used in legend to describe options that are collapsed into 1 slice, because they are too small to render [default `"Others"`]
|
||||
o legendmark (string) symbol used as a bullet point in legend that has the same colour as the chart slice [default `"circle"`]
|
||||
o legendpos (string) position of the legend on the chart [default `"east"`]. Other options are `"north"`, `"south"`, `"west"`
|
||||
o }
|
||||
**
|
||||
= (object) path element of the popup
|
||||
> Usage
|
||||
| r.piechart(cx, cy, r, values, opts)
|
||||
\*/
|
||||
|
||||
function Piechart(paper, cx, cy, r, values, opts) {
|
||||
opts = opts || {};
|
||||
|
@ -19,8 +56,9 @@
|
|||
angle = 0,
|
||||
total = 0,
|
||||
others = 0,
|
||||
cut = 9,
|
||||
defcut = true;
|
||||
cut = opts.maxSlices || 100,
|
||||
minPercent = parseFloat(opts.minPercent) || 1,
|
||||
defcut = Boolean( minPercent );
|
||||
|
||||
function sector(cx, cy, r, startAngle, endAngle, fill) {
|
||||
var rad = Math.PI / 180,
|
||||
|
@ -44,10 +82,11 @@
|
|||
chart.covers = covers;
|
||||
|
||||
if (len == 1) {
|
||||
series.push(paper.circle(cx, cy, r).attr({ fill: chartinst.colors[0], stroke: opts.stroke || "#fff", "stroke-width": opts.strokewidth == null ? 1 : opts.strokewidth }));
|
||||
series.push(paper.circle(cx, cy, r).attr({ fill: opts.colors && opts.colors[0] || chartinst.colors[0], stroke: opts.stroke || "#fff", "stroke-width": opts.strokewidth == null ? 1 : opts.strokewidth }));
|
||||
covers.push(paper.circle(cx, cy, r).attr(chartinst.shim));
|
||||
total = values[0];
|
||||
values[0] = { value: values[0], order: 0, valueOf: function () { return this.value; } };
|
||||
opts.href && opts.href[0] && covers[0].attr({ href: opts.href[0] });
|
||||
series[0].middle = {x: cx, y: cy};
|
||||
series[0].mangle = 180;
|
||||
} else {
|
||||
|
@ -56,12 +95,13 @@
|
|||
values[i] = { value: values[i], order: i, valueOf: function () { return this.value; } };
|
||||
}
|
||||
|
||||
//values are sorted numerically
|
||||
values.sort(function (a, b) {
|
||||
return b.value - a.value;
|
||||
});
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (defcut && values[i] * 360 / total <= 1.5) {
|
||||
if (defcut && values[i] * 100 / total < minPercent) {
|
||||
cut = i;
|
||||
defcut = false;
|
||||
}
|
||||
|
@ -90,7 +130,8 @@
|
|||
}
|
||||
|
||||
var path = sector(cx, cy, r, angle, angle -= 360 * values[i] / total);
|
||||
var p = paper.path(opts.init ? ipath : path).attr({ fill: opts.colors && opts.colors[i] || chartinst.colors[i] || "#666", stroke: opts.stroke || "#fff", "stroke-width": (opts.strokewidth == null ? 1 : opts.strokewidth), "stroke-linejoin": "round" });
|
||||
var j = (opts.matchColors && opts.matchColors == true) ? values[i].order : i;
|
||||
var p = paper.path(opts.init ? ipath : path).attr({ fill: opts.colors && opts.colors[j] || chartinst.colors[j] || "#666", stroke: opts.stroke || "#fff", "stroke-width": (opts.strokewidth == null ? 1 : opts.strokewidth), "stroke-linejoin": "round" });
|
||||
|
||||
p.value = values[i];
|
||||
p.middle = path.middle;
|
||||
|
@ -241,15 +282,16 @@
|
|||
|
||||
return chart;
|
||||
};
|
||||
|
||||
|
||||
//inheritance
|
||||
var F = function() {};
|
||||
F.prototype = Raphael.g;
|
||||
Piechart.prototype = new F;
|
||||
|
||||
|
||||
//public
|
||||
Raphael.fn.piechart = function(cx, cy, r, values, opts) {
|
||||
return new Piechart(this, cx, cy, r, values, opts);
|
||||
}
|
||||
|
||||
})();
|
||||
|
||||
return Raphael;
|
||||
});
|
File diff suppressed because it is too large
Load Diff
|
@ -1,10 +1,10 @@
|
|||
define([
|
||||
'vendor/raphael',
|
||||
'order!vendor/g.raphael/g.raphael',
|
||||
'order!vendor/g.raphael/g.pie',
|
||||
'order!vendor/g.raphael/g.bar',
|
||||
'order!vendor/g.raphael/g.dot',
|
||||
'order!vendor/g.raphael/g.line'
|
||||
'vendor/g.raphael/g.raphael',
|
||||
'vendor/g.raphael/g.pie',
|
||||
'vendor/g.raphael/g.bar',
|
||||
'vendor/g.raphael/g.dot',
|
||||
'vendor/g.raphael/g.line'
|
||||
], function() {
|
||||
return Raphael;
|
||||
});
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,10 +1,9 @@
|
|||
// add any plugins to slickgrid here, make sure to add a
|
||||
// shim for AMD compat in the require config
|
||||
// add any plugins to slickgrid here
|
||||
define([
|
||||
'use!vendor/slickgrid/slick.grid',
|
||||
'use!vendor/slickgrid/slick.editors',
|
||||
'use!vendor/slickgrid/plugins/slick.rowselectionmodel'
|
||||
], function(Slick) {
|
||||
'vendor/slickgrid/slick.grid',
|
||||
'vendor/slickgrid/slick.editors',
|
||||
'vendor/slickgrid/plugins/slick.rowselectionmodel'
|
||||
], function() {
|
||||
return Slick;
|
||||
});
|
||||
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
define(['jquery'],function($) {
|
||||
|
||||
/*!
|
||||
* jquery.event.drag - v 2.2
|
||||
* Copyright (c) 2010 Three Dub Media - http://threedubmedia.com
|
||||
|
@ -399,4 +401,6 @@ $event.fixHooks.touchcancel = {
|
|||
// share the same special event configuration with related events...
|
||||
$special.draginit = $special.dragstart = $special.dragend = drag;
|
||||
|
||||
})( jQuery );
|
||||
})( jQuery );
|
||||
|
||||
});
|
|
@ -1,3 +1,5 @@
|
|||
define(['jquery','vendor/slickgrid/slick.core'],function(jQuery) {
|
||||
|
||||
(function ($) {
|
||||
// register namespace
|
||||
$.extend(true, window, {
|
||||
|
@ -184,4 +186,6 @@
|
|||
"onSelectedRangesChanged": new Slick.Event()
|
||||
});
|
||||
}
|
||||
})(jQuery);
|
||||
})(jQuery);
|
||||
|
||||
});
|
|
@ -1,3 +1,5 @@
|
|||
define(['jquery','vendor/slickgrid/lib/jquery.event.drag-2.2'],function($) {
|
||||
|
||||
/***
|
||||
* Contains core SlickGrid classes.
|
||||
* @module Core
|
||||
|
@ -456,4 +458,4 @@
|
|||
}
|
||||
})(jQuery);
|
||||
|
||||
|
||||
});
|
|
@ -1,3 +1,5 @@
|
|||
define(['jquery','vendor/slickgrid/slick.core'],function(jQuery) {
|
||||
|
||||
/***
|
||||
* Contains basic SlickGrid editors.
|
||||
* @module Editors
|
||||
|
@ -510,3 +512,5 @@
|
|||
this.init();
|
||||
}
|
||||
})(jQuery);
|
||||
|
||||
});
|
File diff suppressed because it is too large
Load Diff
|
@ -1,91 +0,0 @@
|
|||
/* RequireJS Use Plugin v0.2.0
|
||||
* Copyright 2012, Tim Branyen (@tbranyen)
|
||||
* use.js may be freely distributed under the MIT license.
|
||||
*/
|
||||
(function() {
|
||||
|
||||
// Cache used to map configuration options between load and write.
|
||||
var buildMap = {};
|
||||
|
||||
define({
|
||||
version: "0.2.0",
|
||||
|
||||
// Invoked by the AMD builder, passed the path to resolve, the require
|
||||
// function, done callback, and the configuration options.
|
||||
load: function(name, req, load, config) {
|
||||
// Dojo provides access to the config object through the req function.
|
||||
if (!config) {
|
||||
config = require.rawConfig;
|
||||
}
|
||||
|
||||
var module = config.use && config.use[name];
|
||||
|
||||
// No module to load, throw.
|
||||
if (!module) {
|
||||
throw new TypeError("Module '" + name + "' is undefined or does not" +
|
||||
" have a `use` config. Make sure it exists, add a `use` config, or" +
|
||||
" don't use use! on it");
|
||||
}
|
||||
|
||||
// Attach to the build map for use in the write method below.
|
||||
buildMap[name] = { deps: module.deps || [], attach: module.attach };
|
||||
|
||||
// Read the current module configuration for any dependencies that are
|
||||
// required to run this particular non-AMD module.
|
||||
req(module.deps || [], function() {
|
||||
var depArgs = arguments;
|
||||
// Require this module
|
||||
req([name], function() {
|
||||
// Attach property
|
||||
var attach = module.attach;
|
||||
|
||||
// If doing a build don't care about loading
|
||||
if (config.isBuild) {
|
||||
return load();
|
||||
}
|
||||
|
||||
// Return the correct attached object
|
||||
if (typeof attach === "function") {
|
||||
return load(attach.apply(window, depArgs));
|
||||
}
|
||||
|
||||
// Use window for now (maybe this?)
|
||||
return load(window[attach]);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Also invoked by the AMD builder, this writes out a compatible define
|
||||
// call that will work with loaders such as almond.js that cannot read
|
||||
// the configuration data.
|
||||
write: function(pluginName, moduleName, write) {
|
||||
var module = buildMap[moduleName];
|
||||
var deps = module.deps;
|
||||
var normalize = { attach: null, deps: "" };
|
||||
|
||||
// Normalize the attach to window[name] or function() { }
|
||||
if (typeof module.attach === "function") {
|
||||
normalize.attach = module.attach.toString();
|
||||
} else {
|
||||
normalize.attach = "function() {"+
|
||||
"return window['" + module.attach + "'];"+
|
||||
"}";
|
||||
}
|
||||
|
||||
|
||||
// Normalize the dependencies to have proper string characters
|
||||
if (deps.length) {
|
||||
normalize.deps = "'" + deps.toString().split(",").join("','") + "'";
|
||||
}
|
||||
|
||||
// Write out the actual definition
|
||||
write([
|
||||
"define('", pluginName, "!", moduleName, "', ",
|
||||
"[", normalize.deps, "],",
|
||||
normalize.attach,
|
||||
");\n"
|
||||
].join(""));
|
||||
}
|
||||
});
|
||||
|
||||
})();
|
|
@ -0,0 +1,16 @@
|
|||
var glob = require('glob');
|
||||
var fs = require('fs');
|
||||
var UglifyJS = require("uglify-js");
|
||||
|
||||
glob.sync("public/optimized/compiled/{*.js,**/*.js}", function (err, files) {
|
||||
console.log('Running UglifyJS on ' + files.length + ' files');
|
||||
files.forEach(function(file) {
|
||||
var result = UglifyJS.minify(file, {
|
||||
screw_ie8: true,
|
||||
source_map: false
|
||||
});
|
||||
fs.writeFileSync(file,result.code, {flag: 'w'}, function(err) {
|
||||
if (err) throw err;
|
||||
});
|
||||
});
|
||||
})
|
|
@ -1,6 +1,6 @@
|
|||
define [
|
||||
'compiled/models/ImageFile'
|
||||
'use!vendor/FileAPI/FileAPI.min'
|
||||
'vendor/FileAPI/FileAPI.min'
|
||||
], (ImageFile, FileAPI) ->
|
||||
|
||||
model = null
|
||||
|
|
|
@ -86,21 +86,21 @@ define [
|
|||
equal +tz.parse('1969-07-20 21:56'), +moonwalk
|
||||
equal tz.format(moonwalk, '%c'), "Sun 20 Jul 1969 09:56:00 PM EST"
|
||||
|
||||
test 'changeZone(...) should asynchronously curry in a zone by name', ->
|
||||
calledBack = false
|
||||
tz.changeZone('America/Detroit').then ->
|
||||
calledBack = true
|
||||
equal +tz.parse('1969-07-20 21:56'), +moonwalk
|
||||
equal tz.format(moonwalk, '%c'), "Sun 20 Jul 1969 09:56:00 PM EST"
|
||||
equal calledBack, true
|
||||
# test 'changeZone(...) should asynchronously curry in a zone by name', ->
|
||||
# calledBack = false
|
||||
# tz.changeZone('America/Detroit').then ->
|
||||
# calledBack = true
|
||||
# equal +tz.parse('1969-07-20 21:56'), +moonwalk
|
||||
# equal tz.format(moonwalk, '%c'), "Sun 20 Jul 1969 09:56:00 PM EST"
|
||||
# equal calledBack, true
|
||||
|
||||
test 'changeLocale(...) should synchronously curry in a loaded locale', ->
|
||||
tz.changeLocale(french, 'fr_FR')
|
||||
equal tz.format(moonwalk, '%c'), "lun. 21 juil. 1969 02:56:00 UTC"
|
||||
|
||||
test 'changeLocale(...) should asynchronously curry in a locale by name', ->
|
||||
calledBack = false
|
||||
tz.changeZone('fr_FR').then ->
|
||||
calledBack = true
|
||||
equal tz.format(moonwalk, '%c'), "lun. 21 juil. 1969 02:56:00 UTC"
|
||||
equal calledBack, true
|
||||
# test 'changeLocale(...) should asynchronously curry in a locale by name', ->
|
||||
# calledBack = false
|
||||
# tz.changeZone('fr_FR').then ->
|
||||
# calledBack = true
|
||||
# equal tz.format(moonwalk, '%c'), "lun. 21 juil. 1969 02:56:00 UTC"
|
||||
# equal calledBack, true
|
||||
|
|
|
@ -4,7 +4,7 @@ var require = {
|
|||
paths: <%= paths %>,
|
||||
|
||||
// non-amd shims
|
||||
use: <%= shims %>,
|
||||
shim: <%= shims %>,
|
||||
|
||||
packages: [
|
||||
{
|
||||
|
|
|
@ -47,7 +47,9 @@ describe "collaborations" do
|
|||
if execute_script
|
||||
driver.execute_script 'window.confirm = function(msg) { return true; }'
|
||||
end
|
||||
form_visible?.should == form_visible
|
||||
keep_trying_until {
|
||||
form_visible?.should == form_visible
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -200,7 +202,9 @@ describe "collaborations" do
|
|||
|
||||
wait_for_ajaximations
|
||||
|
||||
ffj('.available-users:visible li').length.should == 1
|
||||
keep_trying_until {
|
||||
ffj('.available-users:visible li').length.should == 1
|
||||
}
|
||||
end
|
||||
|
||||
it 'should select collaborators' do
|
||||
|
@ -212,9 +216,10 @@ describe "collaborations" do
|
|||
get "/courses/#{@course.id}/collaborations"
|
||||
|
||||
wait_for_ajaximations
|
||||
|
||||
fj('.available-users:visible a').click
|
||||
ffj('.members-list li').length.should == 1
|
||||
keep_trying_until {
|
||||
ffj('.members-list li').length.should == 1
|
||||
}
|
||||
end
|
||||
|
||||
it 'should deselect collaborators' do
|
||||
|
|
|
@ -401,7 +401,7 @@ shared_examples_for "all selenium tests" do
|
|||
|
||||
def check_domready
|
||||
dom_is_ready = driver.execute_script "return window.seleniumDOMIsReady"
|
||||
requirejs_resources_loaded = driver.execute_script "return require.resourcesDone"
|
||||
requirejs_resources_loaded = driver.execute_script "return !requirejs.s.contexts._.defQueue.length"
|
||||
dom_is_ready and requirejs_resources_loaded
|
||||
end
|
||||
|
||||
|
@ -421,7 +421,7 @@ shared_examples_for "all selenium tests" do
|
|||
driver.execute_async_script(<<-JS)
|
||||
var callback = arguments[arguments.length - 1];
|
||||
var pollForJqueryAndRequire = function(){
|
||||
if (window.jQuery && window.require && window.require.resourcesDone) {
|
||||
if (window.jQuery && window.require && !window.requirejs.s.contexts._.defQueue.length) {
|
||||
jQuery(function(){
|
||||
setTimeout(callback, 1);
|
||||
});
|
||||
|
|
|
@ -228,13 +228,14 @@ describe "dashboard" do
|
|||
get "/"
|
||||
|
||||
course_menu = f('#courses_menu_item')
|
||||
|
||||
|
||||
driver.action.move_to(course_menu).perform
|
||||
keep_trying_until { course_menu.should include_text('My Courses') }
|
||||
course_menu.should include_text(@course.name)
|
||||
keep_trying_until {
|
||||
course_menu.should include_text('My Courses')
|
||||
course_menu.should include_text(@course.name)
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
it "should display student groups in course menu" do
|
||||
group = Group.create!(:name => "group1", :context => @course)
|
||||
group.add_user(@user)
|
||||
|
@ -246,8 +247,10 @@ describe "dashboard" do
|
|||
course_menu = f('#courses_menu_item')
|
||||
|
||||
driver.action.move_to(course_menu).perform
|
||||
keep_trying_until { course_menu.should include_text('Current Groups') }
|
||||
course_menu.should include_text(group.name)
|
||||
keep_trying_until {
|
||||
course_menu.should include_text(group.name)
|
||||
course_menu.should include_text('Current Groups')
|
||||
}
|
||||
end
|
||||
|
||||
it "should go to /courses when the courses nav item is clicked" do
|
||||
|
|
|
@ -83,19 +83,29 @@ describe "eportfolios" do
|
|||
|
||||
it "should have a working flickr search dialog" do
|
||||
get "/eportfolios/#{@eportfolio.id}"
|
||||
edit_link = keep_trying_until do
|
||||
f("#page_list a.page_url").click
|
||||
f("#page_sidebar .edit_content_link")
|
||||
end
|
||||
edit_link.click
|
||||
f("#page_list a.page_url").click
|
||||
keep_trying_until {
|
||||
f("#page_list a.page_url").should be_displayed
|
||||
}
|
||||
f("#page_sidebar .edit_content_link").click
|
||||
keep_trying_until {
|
||||
f('.add_content_link.add_rich_content_link').should be_displayed
|
||||
}
|
||||
f('.add_content_link.add_rich_content_link').click
|
||||
wait_for_tiny(f('textarea.edit_section'))
|
||||
keep_trying_until {
|
||||
f('a.mce_instructure_image').should be_displayed
|
||||
}
|
||||
f('a.mce_instructure_image').click
|
||||
keep_trying_until {
|
||||
f('a[href="#tabFlickr"]').should be_displayed
|
||||
}
|
||||
f('a[href="#tabFlickr"]').click
|
||||
f('form.FindFlickrImageView').should be_displayed
|
||||
keep_trying_until {
|
||||
f('form.FindFlickrImageView').should be_displayed
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
it "should not have new section option when adding submission" do
|
||||
@assignment = @course.assignments.create!(:title => "hardest assignment ever", :submission_types => "online_url,online_upload")
|
||||
@submission = @assignment.submit_homework(@student)
|
||||
|
@ -113,9 +123,11 @@ describe "eportfolios" do
|
|||
wait_for_ajax_requests
|
||||
f(".delete_eportfolio_link").click
|
||||
submit_form("#delete_eportfolio_form")
|
||||
f("#wrapper-container .eportfolios").click
|
||||
f("#whats_an_eportfolio .add_eportfolio_link").should be_displayed
|
||||
fj("#portfolio_#{@eportfolio.id}").should be_nil
|
||||
fj("#wrapper-container .eportfolios").click
|
||||
keep_trying_until {
|
||||
f("#whats_an_eportfolio .add_eportfolio_link").should be_displayed
|
||||
f("#portfolio_#{@eportfolio.id}").should be_nil
|
||||
}
|
||||
Eportfolio.first.workflow_state.should == 'deleted'
|
||||
end
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ module AssignmentOverridesSeleniumHelper
|
|||
new_section = @course.course_sections.create!(:name => 'New Section')
|
||||
override = assignment.assignment_overrides.build
|
||||
override.set = new_section
|
||||
override.due_at = Time.zone.now + 1.day
|
||||
override.due_at = Time.zone.now.advance(days:1)
|
||||
override.due_at_overridden = true
|
||||
override.save!
|
||||
end
|
||||
|
|
|
@ -7,8 +7,8 @@ describe "quizzes" do
|
|||
|
||||
context "as a teacher" do
|
||||
let(:due_at) { Time.zone.now }
|
||||
let(:unlock_at) { Time.zone.now - 2.days }
|
||||
let(:lock_at) { Time.zone.now + 4.days }
|
||||
let(:unlock_at) { Time.zone.now.advance(days:-2) }
|
||||
let(:lock_at) { Time.zone.now.advance(days:4) }
|
||||
|
||||
def create_quiz_with_default_due_dates
|
||||
@context = @course
|
||||
|
@ -125,7 +125,7 @@ describe "quizzes" do
|
|||
keep_trying_until { f('#quiz_description_ifr').should be_displayed }
|
||||
type_in_tiny '#quiz_description', test_text
|
||||
in_frame "quiz_description_ifr" do
|
||||
f('#tinymce').text.include?(test_text).should be_true
|
||||
f('#tinymce').should include_text(test_text)
|
||||
end
|
||||
click_save_settings_button
|
||||
wait_for_ajaximations
|
||||
|
@ -346,7 +346,9 @@ describe "quizzes" do
|
|||
error_displayed?.should be_true
|
||||
input.send_keys(:tab)
|
||||
wait_for_ajaximations
|
||||
input[:value].should be_blank
|
||||
keep_trying_until {
|
||||
input[:value].should be_blank
|
||||
}
|
||||
|
||||
input.click
|
||||
input.send_keys('1')
|
||||
|
@ -372,8 +374,12 @@ describe "quizzes" do
|
|||
in_frame f('.essay_question iframe')[:id] do
|
||||
f('#tinymce').send_keys :shift # no content, but it gives the iframe focus
|
||||
end
|
||||
sleep 1
|
||||
wait_for_ajaximations
|
||||
ff('#question_list .answered').size.should == 1
|
||||
keep_trying_until {
|
||||
ff('#question_list .answered').size.should == 1
|
||||
}
|
||||
|
||||
input.should have_attribute(:value, "1.0000")
|
||||
end
|
||||
end
|
||||
|
@ -405,7 +411,9 @@ describe "quizzes" do
|
|||
wait_for_ajaximations
|
||||
end
|
||||
# not marked as answered
|
||||
ff('#question_list .answered').should be_empty
|
||||
keep_trying_until {
|
||||
ff('#question_list .answered').should be_empty
|
||||
}
|
||||
|
||||
# fully answer each question
|
||||
dropdowns.each do |d|
|
||||
|
@ -416,7 +424,9 @@ describe "quizzes" do
|
|||
end
|
||||
|
||||
# marked as answer
|
||||
ff('#question_list .answered').size.should == 2
|
||||
keep_trying_until {
|
||||
ff('#question_list .answered').size.should == 2
|
||||
}
|
||||
wait_for_ajaximations
|
||||
|
||||
driver.find_element(:link, 'Quizzes').click
|
||||
|
@ -534,9 +544,10 @@ describe "quizzes" do
|
|||
keep_trying_until do
|
||||
fj('.answered').should == nil
|
||||
end
|
||||
|
||||
fj('.upload-label').click
|
||||
wait_for_ajaximations
|
||||
keep_trying_until do
|
||||
fj('.upload-label').click
|
||||
wait_for_ajaximations
|
||||
file_upload_submission_data.should == [""]
|
||||
end
|
||||
upload_attachment_answer
|
||||
|
@ -548,6 +559,7 @@ describe "quizzes" do
|
|||
attachment = file_upload_attachment
|
||||
fj('.file-upload-box').text.should include attachment.display_name
|
||||
f('#submit_quiz_button').click
|
||||
wait_for_ajaximations
|
||||
keep_trying_until do
|
||||
fj('.selected_answer').text.should include attachment.display_name
|
||||
end
|
||||
|
@ -632,6 +644,7 @@ describe "quizzes" do
|
|||
end
|
||||
|
||||
it "creates assignment with default due date" do
|
||||
pending('daylight savings time fix')
|
||||
get "/courses/#{@course.id}/quizzes/new"
|
||||
wait_for_ajaximations
|
||||
fill_assignment_overrides
|
||||
|
@ -694,7 +707,9 @@ describe "quizzes" do
|
|||
f('.show_rubric_link').click
|
||||
wait_for_ajaximations
|
||||
fj('#rubrics .add_rubric_link:visible').click
|
||||
fj('.rubric_grading:visible').should be_nil
|
||||
keep_trying_until {
|
||||
fj('.rubric_grading:visible').should be_nil
|
||||
}
|
||||
end
|
||||
|
||||
context "with draft state" do
|
||||
|
@ -718,7 +733,9 @@ describe "quizzes" do
|
|||
|
||||
# move mouse to not be hover over the button
|
||||
driver.mouse.move_to f('#footer')
|
||||
f('#quiz-publish-link').should include_text("Published")
|
||||
keep_trying_until {
|
||||
f('#quiz-publish-link').should include_text("Published")
|
||||
}
|
||||
end
|
||||
|
||||
it "should click the unpublish button to unpublish a quiz" do
|
||||
|
@ -737,8 +754,10 @@ describe "quizzes" do
|
|||
# move mouse to not be hover over the button
|
||||
driver.mouse.move_to f('#footer')
|
||||
|
||||
f('#quiz-publish-link').should_not include_text("Published")
|
||||
f('#quiz-publish-link').should include_text("Publish")
|
||||
keep_trying_until {
|
||||
f('#quiz-publish-link').should_not include_text("Published")
|
||||
f('#quiz-publish-link').should include_text("Publish")
|
||||
}
|
||||
end
|
||||
|
||||
it "should show a summary of due dates if there are multiple" do
|
||||
|
|
|
@ -203,7 +203,9 @@ describe "Wiki pages and Tiny WYSIWYG editor Images" do
|
|||
add_canvas_image(f("#question_content_0_parent"), 'Course files', 'course.jpg')
|
||||
|
||||
in_frame "question_content_0_ifr" do
|
||||
f("#tinymce").find_elements(:css, "img").length.should == 1
|
||||
keep_trying_until {
|
||||
f("#tinymce").find_elements(:css, "img").length.should == 1
|
||||
}
|
||||
check_element_attrs(f('#tinymce img'), :src => /\/files\/#{@course_attachment.id}/, :alt => 'course.jpg')
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue