Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

fuelux

Package Overview
Dependencies
Maintainers
3
Versions
37
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

fuelux - npm Package Compare versions

Comparing version 3.11.4 to 3.11.5

.jshintrc

56

DETAILS.md

@@ -5,5 +5,2 @@ Additional details to supplement the brief nature of the README file.

* [Using Fuel UX](#using-fuel-ux)
* [Downloading code](#downloading-code)
* [AMD support](#amd-support)
* [Compiling code](#compiling-code)

@@ -13,24 +10,3 @@ * [Running docs locally](#running-docs-locally)

* [Travis CI](#travis-ci)
## Using Fuel UX
Fuel UX can be applied to a section of your your HTML or the entire page by adding the `fuelux` wrapper class (eg. [checkbox](http://getfuelux.com/javascript.html#checkbox)):
```html
<body class="fuelux">
<!-- .... -->
<div class="checkbox">
<label class="checkbox-custom" data-initialize="checkbox" id="myCustomCheckbox">
<input class="sr-only" type="checkbox" value="">
<span class="checkbox-label">Custom checkbox unchecked on page load</span>
</label>
</div>
<!-- .... -->
</body>
```
## Downloading code
Fuel UX can be obtained in any of the following ways:
* Request files from [the Fuel UX CDN](http://www.fuelcdn.com/fuelux/3.11.3/)
* [Edge Servers](#edge-servers)
* Using [Bower](https://github.com/bower/bower) (ensures you get all the [dependencies](#dependencies)):

@@ -58,3 +34,3 @@

* Download a .zip archive of the [latest release](http://www.fuelcdn.com/fuelux/3.11.3/fuelux.zip).
* Download a .zip archive of the [latest release](http://www.fuelcdn.com/fuelux/3.11.4/fuelux.zip).

@@ -69,3 +45,3 @@ ## AMD support

paths: {
'fuelux': 'http://www.fuelcdn.com/fuelux/3.11.3/'
'fuelux': 'http://www.fuelcdn.com/fuelux/3.11.4/'
//...

@@ -94,8 +70,8 @@ }

1. Install `grunt-cli` globally with `npm install -g grunt-cli`.
2. Make sure you're in the root of the fuel directory, then run `npm install`. npm will look at [package.json](https://github.com/exacttarget/fuelux/blob/master/package.json) and automatically install the necessary local dependencies listed there. Finally, run `bower install` to install front-end dependencies.
### Install Dependencies
When completed, you'll be able to run the various Grunt commands provided from the command line.
In terminal from root directory of fuelux repo:
**Unfamiliar with npm? Don't have node installed?** npm stands for [node packaged modules](http://npmjs.org/) and is a way to manage development dependencies through node.js. [Download and install node.js](http://nodejs.org/download/) before proceeding.
1. `npm install`
2. `bower install`

@@ -106,13 +82,15 @@ ### Grunt tasks

#### Serving - `grunt serve`
Starts a watch server for automated javascript validation and basic tests (JSHint, simplified QUnit) allowing for prototyping at [http://localhost:8000/](http://localhost:8000/) (not good for unit testing because server catastrophically fails if unit test fails).
#### Serving - `grunt servefast`
Starts a watch server allowing for prototyping at [http://localhost:8000/](http://localhost:8000/) visual review of tests at [http://localhost:8000/test/](http://localhost:8000/test/).
#### Testing - `grunt`
Runs JSHint and full suite of QUnit tests.
#### Serving - `grunt serve`
Starts a watch server for automated javascript validation and basic tests (JSHint, simplified QUnit) allowing for visual review of tests at http://localhost:8000/test/.
#### Building dist - `grunt dist`
This builds the dist directory (compiling your CSS and JS). If you are going to issue a pull request, you should not include changes to the dist directory that are generated from this grunt task.
#### Compiling - `grunt release`
_If you have forked the repo for personal use, you will also find this task useful._
This builds the dist directory (compiling your CSS and JS). If you are going to issue a pull request, you should not include changes to the dist directory that are generated from this grunt task.
### Troubleshooting dependencies

@@ -130,4 +108,2 @@

Learn more about using Jekyll by reading its [documentation](http://jekyllrb.com/docs/home/).
## Contributors

@@ -155,3 +131,3 @@

Periodically pull requests may fail Travis CI build integration testing with a false negative. If you suspect this is the case you can restart the test via the command line.
Periodically pull requests may fail Travis CI build integration testing with a false negative. If you suspect this is the case you can restart the test via the command line (see below).

@@ -158,0 +134,0 @@ [Travis](https://travis-ci.org/) downloads the `node_modules` folder from the "[Edge](https://fuelux-dev.herokuapp.com)" server (["fuelux-dev"](https://fuelux-dev.herokuapp.com)) hosted on [Heroku](https://www.heroku.com). If you add or update a dependency in `package.json`, you will need to also update `package.json` in `master` locally and push it to [Heroku](https://www.heroku.com) for the dependency errors to be resolved in [Travis](https://travis-ci.org/).

module.exports = {
options: {
boss: true,
browser: true,
curly: false,
eqeqeq: true,
eqnull: true,
globals: {
jQuery: true,
define: true,
require: true,
module: true
},
immed: true,
latedef: true,
newcap: true,
noarg: true,
sub: true,
undef: true,
unused: false
jshintrc: '.jshintrc' // use project defined jshint settings which can be shared with IDEs etc
},
sourceAndDist: ['Gruntfile.js', 'js/*.js', 'dist/fuelux.js'],
tests: {
options: {
latedef: false,
undef: false,
unused: false
},
files: {
src: ['test/**/*.js', '!test/commonjs-bundle.js']
}
}
tests: ['test/**/*.js', '!test/commonjs-bundle.js']
};
module.exports = function (grunt) {
var semver = require('semver');
function getPackageVersion() {
function getPackageVersion () {
return grunt.file.readJSON('./package.json').version;

@@ -14,5 +14,5 @@ }

config: 'release.remoteRepository',
default : '<%= release.remoteRepository %>',
default: '<%= release.remoteRepository %>',
type: 'input',
message: function() {
message: function () {
return 'What repository would like to base your local release branch from?';

@@ -28,6 +28,6 @@ }

type: 'input',
default : '<%= release.remoteBaseBranch %>',
message: function() {
default: '<%= release.remoteBaseBranch %>',
message: function () {
return 'What remote branch from ' + grunt.config('release.remoteRepository') +
' would like to build your release based on?';
' would like to build your release based on?';
}

@@ -121,5 +121,5 @@ }

type: 'input',
message: function() {
message: function () {
return 'What upstream branch would you like to push ' + grunt.config('release.localBranch') +
' to (probably ' + grunt.config('release.remoteDestinationBranch') + ')? (leave blank to skip)';
' to (probably ' + grunt.config('release.remoteDestinationBranch') + ')? (leave blank to skip)';
}

@@ -129,3 +129,3 @@ }

then: function (answers, done) {
if (answers['release.remoteDestinationBranch'] !== '' && answers['release.remoteDestinationBranch'] !== 'n' ) {
if (answers['release.remoteDestinationBranch'] !== '' && answers['release.remoteDestinationBranch'] !== 'n') {
grunt.task.run(['shell:pushLocalBranchToUpstream']);

@@ -177,3 +177,3 @@ }

type: 'confirm',
message: 'Would you like to push your local release branch to upstream\'s master branch?'
message: "Would you like to push your local release branch to upstream's master branch?"
}

@@ -195,3 +195,3 @@ ],

type: 'confirm',
message: function() {
message: function () {
return 'Would you like to delete your local release branch' + '?';

@@ -237,3 +237,3 @@ }

if (answers['release.createmilestone'] === false) {
grunt.fail.fatal("Please follow the wiki https://github.com/ExactTarget/fuelux/wiki/How-to-release-a-new-version#how-to-release", 1);
grunt.fail.fatal('Please follow the wiki https://github.com/ExactTarget/fuelux/wiki/How-to-release-a-new-version#how-to-release', 1);
}

@@ -254,3 +254,3 @@ }

if (answers['release.bumpmilestones'] === false) {
grunt.fail.fatal("Please follow the wiki https://github.com/ExactTarget/fuelux/wiki/How-to-release-a-new-version#how-to-release", 1);
grunt.fail.fatal('Please follow the wiki https://github.com/ExactTarget/fuelux/wiki/How-to-release-a-new-version#how-to-release', 1);
}

@@ -271,3 +271,3 @@ }

if (answers['release.closemilestone'] === false) {
grunt.fail.fatal("Please follow the wiki https://github.com/ExactTarget/fuelux/wiki/How-to-release-a-new-version#how-to-release", 1);
grunt.fail.fatal('Please follow the wiki https://github.com/ExactTarget/fuelux/wiki/How-to-release-a-new-version#how-to-release', 1);
}

@@ -288,3 +288,3 @@ }

if (answers['release.startrelease'] === false) {
grunt.fail.fatal("Please follow the wiki https://github.com/ExactTarget/fuelux/wiki/How-to-release-a-new-version#how-to-release", 1);
grunt.fail.fatal('Please follow the wiki https://github.com/ExactTarget/fuelux/wiki/How-to-release-a-new-version#how-to-release', 1);
}

@@ -304,3 +304,3 @@ }

then: function (answers, done) {
if (answers['release.startrelease'] === true) {
if (answers['release.generatelogs'] === true) {
grunt.task.run(['shell:notes']);

@@ -311,4 +311,38 @@ }

}
},
'generatelogsmanually': {
options: {
questions: [
{
config: 'release.generatelogsmanuallystart',
type: 'input',
message: 'Which releases would you like to start diff for changelogs from? (eg. 3.11.4)',
},
{
config: 'release.generatelogsmanuallyend',
type: 'input',
message: 'Which releases would you like to end diff for changelogs from? (eg. 3.11.5)',
},
{
config: 'release.generatelogsmanually',
type: 'confirm',
message: 'Would you like to generate change logs now?'
}
],
then: function (answers, done) {
if (answers['release.generatelogsmanually'] === true && answers['release.generatelogsmanuallystart'] !== '' && answers['release.generatelogsmanuallyend'] !== '') {
grunt.log.writeln('About to generate changelogs between ' + answers['release.generatelogsmanuallystart'] + ' and ' + answers['release.generatelogsmanuallyend'] + '.');
grunt.log.writeln('There will be no more output for possibly several minutes.');
grunt.log.writeln('Thank you for your patience, have an ohana mahalo kilikilikiwana day.');
grunt.log.writeln('//TODO: Insert tiki dancing nyan cat here. --jschmidt');
grunt.task.run(['shell:manualnotes']);
} else {
grunt.log.writeln('You have failed us all. You are no longer ohana.');
}
return false;
}
}
}
}
}
};
};

@@ -5,3 +5,3 @@ module.exports = function (grunt) {

}
return {

@@ -18,3 +18,3 @@ trickyBrowsers: {

testname: process.env.TRAVIS_JOB_ID || Math.floor((new Date()).getTime() / 1000 - 1230768000).toString(),
urls: ['http://localhost:<%= connect.testServer.options.port %>/test/?testdist=true']
urls: ['http://localhost:<%= connect.testServer.options.port %>/test/?testdist=true&hidepassed']
}

@@ -32,3 +32,3 @@ },

testname: process.env.TRAVIS_JOB_ID || getPackage().version + '-<%= grunt.template.today("dddd, mmmm dS, yyyy, h:MM:ss TT") %>',
urls: ['http://localhost:<%= connect.testServer.options.port %>/test/?testdist=true'],
urls: ['http://localhost:<%= connect.testServer.options.port %>/test/?testdist=true&hidepassed'],
maxPollRetries: 4,

@@ -35,0 +35,0 @@ throttled: 3,

@@ -5,7 +5,7 @@ module.exports = function (grunt) {

function getPackage() {
function getPackage () {
return grunt.file.readJSON('./package.json');
}
function getGithubToken() {
function getGithubToken () {
return grunt.file.exists('./GITHUB_TOKEN.json') ? grunt.file.readJSON('./GITHUB_TOKEN.json').token : '';

@@ -16,10 +16,14 @@ }

// Install with: gem install github_changelog_generator
// 'github_changelog_generator --no-author --between-tags 3.11.4,3.11.5 --compare-link -t '
notes: {
command: 'github_changelog_generator --no-author --between-tags ' + originalVersion + ',' + getPackage().version + ' --compare-link -t ' + getGithubToken()
},
manualnotes: {
command: 'github_changelog_generator --no-author --between-tags ' + grunt.config('release.generatelogsmanuallystart') + ',' + grunt.config('release.generatelogsmanuallyend') + ' --compare-link -t ' + getGithubToken()
},
checkoutRemoteReleaseBranch: {
// this makes a local branch based on the prior prompt, such as release_{TIMESTAMP}
// then update tags from remote in order to prevent duplicate tags
command: function() {
grunt.config('release.localBranch', 'release_' + new Date().getTime() );
command: function () {
grunt.config('release.localBranch', 'release_' + new Date().getTime());
var command = [

@@ -36,3 +40,3 @@ 'git fetch --tags ' + grunt.config('release.remoteRepository'),

addReleaseFiles: {
command: function() {
command: function () {
var command = 'git add ' + grunt.config('release.files').join(' ');

@@ -44,3 +48,3 @@ grunt.log.write('Staging: ' + command);

commit: {
command: function() {
command: function () {
var command = 'git commit -m "release ' + getPackage().version + '"';

@@ -52,3 +56,3 @@ grunt.log.write('Committing: ' + command);

tag: {
command: function() {
command: function () {
var command = 'git tag -a "' + getPackage().version + '" -m "' + getPackage().version + '"';

@@ -60,3 +64,3 @@ grunt.log.write('Tagging: ' + command);

pushLocalBranchToUpstream: {
command: function() {
command: function () {
var command = 'git push ' + grunt.config('release.remoteRepository') + ' ' +

@@ -69,3 +73,3 @@ grunt.config('release.localBranch') + ':' + grunt.config('release.remoteDestinationBranch');

pushTagToUpstream: {
command: function() {
command: function () {
var command = 'git push ' + grunt.config('release.remoteRepository') + ' ' + getPackage().version;

@@ -77,5 +81,5 @@ grunt.log.write('Publishing tag: ' + command);

pushLocalBranchToUpstreamMaster: {
command: function() {
var command = 'git push ' + grunt.config('release.remoteRepository') + ' ' +
grunt.config('release.localBranch') + ':master';
command: function () {
var command = 'git push ' + grunt.config('release.remoteRepository') + ' ' +
grunt.config('release.localBranch') + ':master';
grunt.log.write(command);

@@ -86,16 +90,15 @@ return command;

uploadToCDN: {
command: function() {
function createUploadCommand(version) {
command: function () {
function createUploadCommand (version) {
return ['mv dist ' + version,
'scp -i ~/.ssh/fuelcdn -r "' + version + '"/ ' +
'<%= cdnLoginFile.user %>' + '@' + '<%= cdnLoginFile.server %>' + ':' + '<%= cdnLoginFile.folder %>',
'mv "' + version + '" dist',
'echo "Done uploading files."'].join(' && ');
'scp -i ~/.ssh/fuelcdn -r "' + version + '"/ ' +
'<%= cdnLoginFile.user %>' + '@' + '<%= cdnLoginFile.server %>' + ':' + '<%= cdnLoginFile.folder %>',
'mv "' + version + '" dist',
'echo "Done uploading files."'].join(' && ');
}
var command = [
getPackage().version,
semver.major(getPackage().version) + '.' + semver.minor(getPackage().version),
semver.major(getPackage().version)
].map(createUploadCommand).join(' && ');
getPackage().version,
semver.major(getPackage().version) + '.' + semver.minor(getPackage().version),
semver.major(getPackage().version)
].map(createUploadCommand).join(' && ');
grunt.log.write('Uploading: ' + command);

@@ -107,3 +110,3 @@ grunt.log.writeln('');

publishToNPM: {
command: function() {
command: function () {
var command = 'npm publish';

@@ -114,4 +117,4 @@ grunt.log.write(command);

}
}
};
};
}

@@ -1,2 +0,2 @@

module.exports = function(grunt) {
module.exports = function (grunt) {
var packageVersion = require('../../package.json').version;

@@ -7,3 +7,3 @@

------------- */
grunt.registerTask('notes', 'Run a ruby gem that will request from Github unreleased pull requests', ['shell:notes']);
grunt.registerTask('notes', 'Run a ruby gem that will request from Github unreleased pull requests', ['prompt:generatelogsmanually']);

@@ -15,4 +15,3 @@ grunt.registerTask('updateRelease', '', function () {

// Maintainers: Run prior to a release. Includes SauceLabs VM tests.
grunt.registerTask('release', 'Release a new version, push it and publish it', function() {
grunt.registerTask('release', 'Release a new version, push it and publish it', function () {
// default variables for release task

@@ -32,10 +31,10 @@ var releaseDefaults = {

if ( typeof grunt.config('sauceLoginFile') === 'undefined' ) {
grunt.log.write('The file SAUCE_API_KEY.yml is needed in order to run tests in SauceLabs.'['red'].bold +
' Please contact another maintainer to obtain this file.');
if (typeof grunt.config('sauceLoginFile') === 'undefined') {
grunt.log.write('The file SAUCE_API_KEY.yml is needed in order to run tests in SauceLabs.'.red.bold +
' Please contact another maintainer to obtain this file.');
}
if ( typeof grunt.config('cdnLoginFile') === 'undefined' ) {
grunt.log.write('The file FUEL_CDN.yml is needed in order to upload the release files to the CDN.'['red'].bold +
' Please contact another maintainer to obtain this file.');
if (typeof grunt.config('cdnLoginFile') === 'undefined') {
grunt.log.write('The file FUEL_CDN.yml is needed in order to upload the release files to the CDN.'.red.bold +
' Please contact another maintainer to obtain this file.');
}

@@ -60,7 +59,6 @@

grunt.registerTask('dorelease', '', function () {
grunt.log.writeln('');
if (!grunt.option('no-tests')) {
grunt.task.run(['releasetest']); //If phantom timeouts happening because of long-running qunit tests, look into setting `resourceTimeout` in phantom: http://phantomjs.org/api/webpage/property/settings.html
grunt.task.run(['releasetest']); // If phantom timeouts happening because of long-running qunit tests, look into setting `resourceTimeout` in phantom: http://phantomjs.org/api/webpage/property/settings.html
// Delete any screenshots that may have happened if it got this far. This isn't foolproof

@@ -79,5 +77,3 @@ // because it relies on the phantomjs server/page timeout, which can take longer than this

});
};
};

@@ -771,5 +771,6 @@ define(function (require) {

html: '<span class="glyphicon glyphicon-trash"></span> Delete',
clickAction: function (helpers, callback) {
clickAction: function (helpers, callback, e) {
console.log('hey it worked');
console.log(helpers);
e.preventDefault();
callback();

@@ -776,0 +777,0 @@ }

@@ -143,3 +143,4 @@ /*

$heading.outerHeight($hr.outerHeight());
$heading.outerWidth($hr.outerWidth());
// outerWidth isn't always appropriate or desirable. Allow an explicit value to be set if needed
$heading.outerWidth($heading.data('forced-width') || $hr.outerWidth());
});

@@ -222,3 +223,2 @@ };

if (actionsEnabled && shouldScroll) {
$wrapper.find('.actions-thead-wrapper').css('right', -scrollLeft);
$wrapper.find('.actions-column-wrapper').css('right', -scrollLeft);

@@ -233,3 +233,2 @@ }

if (actionsEnabled) {
$wrapper.find('.actions-thead-wrapper').css('right', '0');
$wrapper.find('.actions-column-wrapper').css('right', '0');

@@ -254,13 +253,13 @@ }

var selectlist = '<div class="btn-group">' +
'<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" data-flip="auto" aria-expanded="false">' +
'<span class="caret"></span>' +
'</button>' +
'<ul class="dropdown-menu dropdown-menu-right" role="menu">' +
actionsHtml +
'</ul></div>';
if ($actionsTable.length < 1) {
var selectlist = '<div class="btn-group">' +
'<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" data-flip="auto" aria-expanded="false">' +
'<span class="caret"></span>' +
'</button>' +
'<ul class="dropdown-menu dropdown-menu-right" role="menu">' +
actionsHtml +
'</ul></div>';
var $actionsColumnWrapper = $('<div class="actions-column-wrapper" style="width: '+ this.list_actions_width +'px"></div>').insertBefore($table);
// The width set here is overwritten in `list_sizeHeadings`. This is used for sizing the subsequent rows.
var $actionsColumnWrapper = $('<div class="actions-column-wrapper" style="width: ' + this.list_actions_width + 'px"></div>').insertBefore($table);
var $actionsColumn = $table.clone().addClass('table-actions');

@@ -275,7 +274,16 @@ $actionsColumn.find('th:not(:last-child)').remove();

$actionsColumn.find('thead .btn').attr('disabled', 'disabled');
} else {
var labelText = this.viewOptions.list_actions.label || '';
var $labelOverlay = $('<div class="repeater-list-heading empty">' + labelText + '</div>');
// repeater-list.less:302 has `margin-left: -9px;` which shifts this over and makes it not actually cover what it is supposed to cover. Make it wider to compensate.
var negative_maring_accomodation = 9;
$labelOverlay.data('forced-width', this.list_actions_width + negative_maring_accomodation);
var $th = $('<th>' + labelText + '</th>');
$th.append($labelOverlay);
$actionsColumn.find('thead tr').addClass('empty-heading').append($th);
}
else {
var label = this.viewOptions.list_actions.label || '<span class="actions-hidden">a</span>';
$actionsColumn.find('thead tr').addClass('empty-heading').html('<th>'+ label +'<div class="repeater-list-heading">'+ label +'</div></th>');
}

@@ -295,6 +303,2 @@ // Create Actions dropdown for each cell in actions table

/* this.$element.find('.repeater-list .actions-column-wrapper, .repeater-list .actions-column-wrapper td, .repeater-list .actions-column-wrapper th')
.css('width', this.list_actions_width);
this.$element.find('.repeater-list .actions-column-wrapper th .repeater-list-heading').css('width', this.list_actions_width + 1 + 'px');*/
this.$element.find('.repeater-list table.table-actions thead tr th').outerHeight($table.find('thead tr th').outerHeight());

@@ -307,3 +311,3 @@ this.$element.find('.repeater-list table.table-actions tbody tr td:first-child').each(function (i, elem) {

//row level actions click
this.$element.find('.table-actions tbody .action-item').on('click', function() {
this.$element.find('.table-actions tbody .action-item').on('click', function(e) {
var actionName = $(this).data('action');

@@ -315,6 +319,6 @@ var row = $(this).data('row');

};
self.list_getActionItems(selected);
self.list_getActionItems(selected, e);
});
// bulk actions click
this.$element.find('.table-actions thead .action-item').on('click', function() {
this.$element.find('.table-actions thead .action-item').on('click', function(e) {
var actionName = $(this).data('action');

@@ -331,7 +335,22 @@ var selected = {

self.list_getActionItems(selected);
self.list_getActionItems(selected, e);
});
};
$.fn.repeater.Constructor.prototype.list_getActionItems = function (selected) {
/*
* list_getActionItems
*
* Called when user clicks on an "action item".
*
* Object selected - object containing `actionName`, string value of the `data-action` attribute of the clicked
* "action item", and `rows` Array of jQuery objects of selected rows
* Object e - jQuery event of triggering event
*
* Calls implementor's clickAction function if provided. Passes `selectedObj`, `callback` and `e`.
* Object selectedObj - Object containing jQuery object `item` for selected row, and Object `rowData` for
* selected row's data-attributes, or Array of such Objects if multiple selections were made
* Function callback - ¯\_(ツ)_/¯
* Object e - jQuery event object representing the triggering event
*/
$.fn.repeater.Constructor.prototype.list_getActionItems = function (selected, e) {
var i;

@@ -354,3 +373,4 @@ var selectedObj = [];

if (actionObj.clickAction) {
actionObj.clickAction(selectedObj, function () {});
var callback = function callback () {};// for backwards compatibility. No idea why this was originally here...
actionObj.clickAction(selectedObj, callback, e);
}

@@ -449,4 +469,8 @@ };

resize: function () {
if (this.viewOptions.list_columnSyncing) {
this.list_sizeHeadings();
if (this.viewOptions.list_frozenColumns || this.viewOptions.list_actions){
this.render();
}else{
if (this.viewOptions.list_columnSyncing) {
this.list_sizeHeadings();
}
}

@@ -495,3 +519,3 @@ },

renderItem: function(helpers){
renderRow.call(this, helpers.container, helpers.subset, helpers.index);
renderRow.call(this, helpers.container, helpers.subset[helpers.index], helpers.index);
return false;

@@ -532,22 +556,24 @@ },

//ADDITIONAL METHODS
function renderColumn ($row, rows, rowIndex, columns, columnIndex) {
var className = columns[columnIndex].className;
var content = rows[rowIndex][columns[columnIndex].property];
function renderColumn ($tr, row, rowIndex, column) {
var content = row[column.property];
var $col = $('<td></td>');
var width = columns[columnIndex]._auto_width;
var property = columns[columnIndex].property;
if(this.viewOptions.list_actions !== false && property === '@_ACTIONS_@'){
content = '<div class="repeater-list-actions-placeholder" style="width: ' + this.list_actions_width + 'px"></div>';
$col.addClass(column.className);
if(this.viewOptions.list_actions !== false && column.property === '@_ACTIONS_@'){
$col.addClass('repeater-list-actions-placeholder-column');
content = '';
}
content = (content!==undefined) ? content : '';
content = (content !== undefined) ? content : '';
$col.append(content);
$col.addClass(((className !== undefined) ? className : '')).append(content);
if (width !== undefined) {
$col.outerWidth(width);
// excludes checkbox and actions columns, as well as columns with user set widths
if (column._auto_width !== undefined) {
$col.outerWidth(column._auto_width);
}
$row.append($col);
if (this.viewOptions.list_selectable === 'multi' && columns[columnIndex].property === '@_CHECKBOX_@') {
$tr.append($col);
if (this.viewOptions.list_selectable === 'multi' && column.property === '@_CHECKBOX_@') {
var checkBoxMarkup = '<label data-row="'+ rowIndex +'" class="checkbox-custom checkbox-inline body-checkbox">' +

@@ -559,8 +585,8 @@ '<input class="sr-only" type="checkbox"></label>';

if (!(columns[columnIndex].property === '@_CHECKBOX_@' || columns[columnIndex].property === '@_ACTIONS_@') && this.viewOptions.list_columnRendered) {
if (!(column.property === '@_CHECKBOX_@' || column.property === '@_ACTIONS_@') && this.viewOptions.list_columnRendered) {
this.viewOptions.list_columnRendered({
container: $row,
columnAttr: columns[columnIndex].property,
container: $tr,
columnAttr: column.property,
item: $col,
rowData: rows[rowIndex]
rowData: row
}, function () {});

@@ -570,92 +596,132 @@ }

function renderHeader ($tr, columns, index) {
/*
* Handle column header click to do sort.
*
* This function was extracted from the renderHeader function in this file
*
* Expects:
* e.data.$headerOverlay - visible/clickable header overlay
* e.data.$headerBase - sizer `<th>` element
* e.data.column - object representing raw data for clicked column
* e.data.$tr - `<tr>` from `<thead>`
* e.data.self - `this` context of the `renderHeader` function
*/
var handleColumnSort = function handleColumnSort (e) {
var self = e.data.self;
// Create a new jQuery object as set of both elements.
var $headers = e.data.$headerOverlay.add(e.data.$headerBase);
var $chevron = e.data.$headerOverlay.find('.glyphicon.rlc:first');
var $tr = e.data.$tr;
var column = e.data.column;
self.list_sortProperty = (typeof column.sortable === 'string') ? column.sortable : column.property;
var chevDown = 'glyphicon-chevron-down';
var chevron = '.glyphicon.rlc:first';
var chevUp = 'glyphicon-chevron-up';
var $div = $('<div class="repeater-list-heading"><span class="glyphicon rlc"></span></div>');
var checkBoxMarkup = '<div class="repeater-list-heading header-checkbox"><label class="checkbox-custom checkbox-inline">' +
'<input class="sr-only" type="checkbox"></label><div class="clearfix"></div></div>';
var $header = $('<th></th>');
if ($headers.hasClass('sorted')) {
if ($chevron.hasClass(chevUp)) {
$chevron.removeClass(chevUp).addClass(chevDown);
self.list_sortDirection = 'desc';
} else {
if (!self.viewOptions.list_sortClearing) {
$chevron.removeClass(chevDown).addClass(chevUp);
self.list_sortDirection = 'asc';
} else {
$headers.removeClass('sorted');
$chevron.removeClass(chevDown);
self.list_sortDirection = null;
self.list_sortProperty = null;
}
}
} else {
$tr.find('th, .repeater-list-heading').removeClass('sorted');
$chevron.removeClass(chevDown).addClass(chevUp);
self.list_sortDirection = 'asc';
$headers.addClass('sorted');
}
self.render({
clearInfinite: true,
pageIncrement: null
});
};
var renderHeader = function renderHeader ($tr, column, columnIndex) {
var self = this;
var $both, className, sortable, $span, $spans;
$div.data('fu_item_index', index);
$div.prepend(columns[index].label);
$header.html($div.html()).find('[id]').removeAttr('id');
// visible portion (top layer) of header
var $headerOverlay = $('<div class="repeater-list-heading"><span class="glyphicon rlc"></span></div>');
$headerOverlay.data('fu_item_index', columnIndex);
$headerOverlay.prepend(column.label);
if (columns[index].property !== '@_CHECKBOX_@') {
$header.append($div);
}
else {
$header.append(checkBoxMarkup);
}
// header underlayment
var $headerBase = $('<th></th>');
$both = $header.add($div);
$span = $div.find(chevron);
$spans = $span.add($header.find(chevron));
if (this.viewOptions.list_actions && columns[index].property === '@_ACTIONS_@') {
// actions column is _always_ hidden underneath absolute positioned actions table.
// Neither headerBase nor headerOverlay will ever be visible for actions column.
// This is here strictly for sizing purposes for the benefit of the other columns'
// sizing calculations.
if (this.viewOptions.list_actions && column.property === '@_ACTIONS_@') {
var width = this.list_actions_width;
$header.css('width', width);
$div.css('width', width);
$headerBase.css('width', width);
$headerOverlay.css('width', width);
}
className = columns[index].className;
if (className !== undefined) {
$both.addClass(className);
}
var headerClasses = [];
headerClasses.push(column.className);
sortable = columns[index].sortable;
var sortable = column.sortable;
if (sortable) {
$both.addClass('sortable');
$div.on('click.fu.repeaterList', function () {
self.list_sortProperty = (typeof sortable === 'string') ? sortable : columns[index].property;
if ($div.hasClass('sorted')) {
if ($span.hasClass(chevUp)) {
$spans.removeClass(chevUp).addClass(chevDown);
self.list_sortDirection = 'desc';
} else {
if (!self.viewOptions.list_sortClearing) {
$spans.removeClass(chevDown).addClass(chevUp);
self.list_sortDirection = 'asc';
} else {
$both.removeClass('sorted');
$spans.removeClass(chevDown);
self.list_sortDirection = null;
self.list_sortProperty = null;
}
}
headerClasses.push('sortable');
} else {
$tr.find('th, .repeater-list-heading').removeClass('sorted');
$spans.removeClass(chevDown).addClass(chevUp);
self.list_sortDirection = 'asc';
$both.addClass('sorted');
}
self.render({
clearInfinite: true,
pageIncrement: null
});
});
$headerOverlay.on(
'click.fu.repeaterList',
{
'self': self,
'$tr': $tr,
'$headerBase': $headerBase,
'$headerOverlay': $headerOverlay,
'column': column
},
handleColumnSort
);
}
if (columns[index].sortDirection === 'asc' || columns[index].sortDirection === 'desc') {
var $chevron = $headerOverlay.find('.glyphicon.rlc:first');
if (column.sortDirection === 'asc' || column.sortDirection === 'desc') {
$tr.find('th, .repeater-list-heading').removeClass('sorted');
$both.addClass('sortable sorted');
if (columns[index].sortDirection === 'asc') {
$spans.addClass(chevUp);
headerClasses.push('sortable sorted');
if (column.sortDirection === 'asc') {
$chevron.addClass('glyphicon-chevron-up');
this.list_sortDirection = 'asc';
} else {
$spans.addClass(chevDown);
$chevron.addClass('glyphicon-chevron-down');
this.list_sortDirection = 'desc';
}
this.list_sortProperty = (typeof sortable === 'string') ? sortable : columns[index].property;
this.list_sortProperty = (typeof sortable === 'string') ? sortable : column.property;
}
$tr.append($header);
}
// duplicate the header's overlay content into the header if appropriate (possibly for dimensional styling???)
$headerBase.html($headerOverlay.html());
function renderRow ($tbody, rows, index) {
// place visible content into header for display to user
if (column.property !== '@_CHECKBOX_@') {
$headerBase.append($headerOverlay);
} else {
var checkBoxMarkup = '<div class="repeater-list-heading header-checkbox"><label class="checkbox-custom checkbox-inline"><input class="sr-only" type="checkbox"></label><div class="clearfix"></div></div>';
$headerBase.append(checkBoxMarkup);
}
headerClasses = headerClasses.join(' ');
$headerBase.addClass(headerClasses);
$headerOverlay.addClass(headerClasses);
$tr.append($headerBase);
};
function renderRow ($tbody, row, rowIndex) {
var $row = $('<tr></tr>');

@@ -670,3 +736,3 @@ var self = this;

$row.attr('tabindex', 0); // allow items to be tabbed to / focused on
$row.data('item_data', rows[index]);
$row.data('item_data', row);

@@ -737,3 +803,3 @@ $row.on('click.fu.repeaterList', function () {

if (this.viewOptions.list_actions && !this.viewOptions.list_selectable) {
$row.data('item_data', rows[index]);
$row.data('item_data', row);
}

@@ -743,4 +809,4 @@

for (i = 0, l = this.list_columns.length; i < l; i++) {
renderColumn.call(this, $row, rows, index, this.list_columns, i);
for (i = 0; i < this.list_columns.length; i++) {
renderColumn.call(this, $row, row, rowIndex, this.list_columns[i]);
}

@@ -752,3 +818,3 @@

item: $row,
rowData: rows[index]
rowData: row
}, function () {});

@@ -779,33 +845,35 @@ }

function renderThead ($table, data) {
var columns = data.columns || [];
var $thead = $table.find('thead');
var i, j, l, $tr;
function differentColumns (oldCols, newCols) {
if (!newCols) {
return false;
}
if (!oldCols || (newCols.length !== oldCols.length)) {
var areDifferentColumns = function areDifferentColumns (oldCols, newCols) {
if (!newCols) {
return false;
}
if (!oldCols || (newCols.length !== oldCols.length)) {
return true;
}
for (var i = 0; i < newCols.length; i++) {
if (!oldCols[i]) {
return true;
}
for (i = 0, l = newCols.length; i < l; i++) {
if (!oldCols[i]) {
return true;
} else {
for (j in newCols[i]) {
if (oldCols[i][j] !== newCols[i][j]) {
return true;
}
} else {
for (var j in newCols[i]) {
if (oldCols[i][j] !== newCols[i][j]) {
return true;
}
}
}
}
}
return false;
}
return false;
};
if (this.list_firstRender || differentColumns(this.list_columns, columns) || $thead.length === 0) {
var renderThead = function renderThead ($table, data) {
var columns = data.columns || [];
var $thead = $table.find('thead');
if (this.list_firstRender || areDifferentColumns(this.list_columns, columns) || $thead.length === 0) {
$thead.remove();
this.list_firstRender = false;
this.$loader.removeClass('noHeader');
if (data.count < 1) {

@@ -815,2 +883,3 @@ this.list_noItems = true;

// insert checkbox column, if applicable
if (this.viewOptions.list_selectable === 'multi' && !this.list_noItems) {

@@ -822,12 +891,9 @@ var checkboxColumn = {

};
columns.splice(0, 0, checkboxColumn);
columns.unshift(checkboxColumn);
}
this.list_columns = columns;
this.list_firstRender = false;
this.$loader.removeClass('noHeader');
// insert actions column, if applicable
if (this.viewOptions.list_actions && !this.list_noItems){
var actionsColumn = {
label: this.viewOptions.list_actions.label || '<span class="actions-hidden">a</span>',
label: this.viewOptions.list_actions.label || '',
property: '@_ACTIONS_@',

@@ -840,80 +906,75 @@ sortable: false,

this.list_columns = columns;
$thead = $('<thead data-preserve="deep"><tr></tr></thead>');
$tr = $thead.find('tr');
for (i = 0, l = columns.length; i < l; i++) {
renderHeader.call(this, $tr, columns, i);
var $headerRow = $('<tr></tr>');
for (var i = 0; i < columns.length; i++) {
renderHeader.call(this, $headerRow, columns[i], i);
}
$thead = $('<thead data-preserve="deep"></thead>');
$thead.append($headerRow);
$table.prepend($thead);
// after checkbox column is created need to get width of checkbox column from its css class
if (this.viewOptions.list_selectable === 'multi' && !this.list_noItems) {
//after checkbox column is created need to get width of checkbox column from
//its css class
var checkboxWidth = this.$element.find('.repeater-list-wrapper .header-checkbox').outerWidth();
var selectColumn = $.grep(columns, function(column){
return column.property === '@_CHECKBOX_@';
})[0];
selectColumn.width = checkboxWidth;
columns[0].width = checkboxWidth;
}
sizeColumns.call(this, $tr);
sizeColumns.call(this, $headerRow);
}
}
};
function sizeColumns ($tr) {
var auto = [];
var sizeColumns = function sizeColumns ($tr) {
var autoGauge = [];
var self = this;
var i, l, newWidth, taken, total;
var takenWidth = 0;
var totalWidth = 0;
if (this.viewOptions.list_columnSizing) {
i = 0;
taken = 0;
total = 0;
$tr.find('th').each(function () {
var $th = $(this);
var isLast = ($th.next('th').length === 0);
var width;
if (self.viewOptions.list_columnSizing) {
$tr.find('th').each(function (i, th) {
var $th = $(th);
var isLast = ($(this).next('th').length === 0);
if (self.list_columns[i].width !== undefined) {
width = self.list_columns[i].width;
$th.outerWidth(width);
taken += $th.outerWidth();
total += $th.outerWidth();
var width = self.list_columns[i].width;
takenWidth += width;
totalWidth += width;
if (!isLast) {
$th.outerWidth(width);
self.list_columns[i]._auto_width = width;
}else{
$th.outerWidth('');// why does this work? This is invalid jQuery.
}
else {
$th.outerWidth('');
}
} else {
totalWidth += $th.outerWidth();
} else {
var outerWidth = $th.find('.repeater-list-heading').outerWidth();
total += $th.outerWidth();
auto.push({
autoGauge.push({
col: $th,
index: i,
last: isLast,
minWidth: outerWidth
minWidth: $th.find('.repeater-list-heading').outerWidth()
});
}
i++;
});
l = auto.length;
var canvasWidth = self.$canvas.find('.repeater-list-wrapper').outerWidth();
var newWidth = Math.floor((canvasWidth - takenWidth) / autoGauge.length);
if (l > 0) {
var canvasWidth = this.$canvas.find('.repeater-list-wrapper').outerWidth();
newWidth = Math.floor((canvasWidth - taken) / l);
for (i = 0; i < l; i++) {
if (auto[i].minWidth > newWidth) {
newWidth = auto[i].minWidth;
}
if (!auto[i].last || total > canvasWidth) {
auto[i].col.outerWidth(newWidth);
this.list_columns[auto[i].index]._auto_width = newWidth;
}
for (var i = 0; i < autoGauge.length; i++) {
var th = autoGauge[i];
if (newWidth < th.minWidth) {
newWidth = th.minWidth;
}
if (!th.last || canvasWidth < totalWidth) {
th.col.outerWidth(newWidth);
self.list_columns[th.index]._auto_width = newWidth;
}
}
}
}
};

@@ -920,0 +981,0 @@ function specialBrowserClass() {

@@ -119,3 +119,3 @@ /*

self.$element.trigger('resized.fu.repeater');
}, 75);
}, 500);//any faster and you get weird catastrophic errors with the header of the list repeater
});

@@ -640,8 +640,11 @@

};
height = ((staticHeight === 'true' || staticHeight === true) ? this.$element.height() : parseInt(staticHeight, 10)) -
this.$element.find('.repeater-header').outerHeight() -
this.$element.find('.repeater-footer').outerHeight() -
((viewportMargins.bottom === 'auto') ? 0 : parseInt(viewportMargins.bottom, 10)) -
((viewportMargins.top === 'auto') ? 0 : parseInt(viewportMargins.top, 10));
this.$viewport.outerHeight(height);
var staticHeightValue = (staticHeight === 'true' || staticHeight === true) ? this.$element.height() : parseInt(staticHeight, 10);
var headerHeight = this.$element.find('.repeater-header').outerHeight();
var footerHeight = this.$element.find('.repeater-footer').outerHeight();
var bottomMargin = (viewportMargins.bottom === 'auto') ? 0 : parseInt(viewportMargins.bottom, 10);
var topMargin = (viewportMargins.top === 'auto') ? 0 : parseInt(viewportMargins.top, 10);
height = staticHeightValue - headerHeight - footerHeight - bottomMargin - topMargin;
this.$viewport.outerHeight(height); // but WHY are we setting the outerHeight of the viewport to this???
} else {

@@ -648,0 +651,0 @@ this.$canvas.removeClass('scrolling');

@@ -39,3 +39,3 @@ /*

var Scheduler = function (element, options) {
var Scheduler = function Scheduler(element, options) {
var self = this;

@@ -72,2 +72,6 @@

this.$startDate.datepicker(this.options.startDateOptions);
var startDateResponse = (typeof this.options.startDateChanged === "function") ? this.options.startDateChanged : this._guessEndDate;
this.$startDate.on('change changed.fu.datepicker dateClicked.fu.datepicker', $.proxy(startDateResponse, this));
this.$startTime.combobox();

@@ -115,6 +119,42 @@ // init start time

var _getFormattedDate = function _getFormattedDate(dateObj, dash) {
var fdate = '';
var item;
fdate += dateObj.getFullYear();
fdate += dash;
item = dateObj.getMonth() + 1;//because 0 indexing makes sense when dealing with months /sarcasm
fdate += (item < 10) ? '0' + item : item;
fdate += dash;
item = dateObj.getDate();
fdate += (item < 10) ? '0' + item : item;
return fdate;
};
var ONE_SECOND = 1000;
var ONE_MINUTE = ONE_SECOND * 60;
var ONE_HOUR = ONE_MINUTE * 60;
var ONE_DAY = ONE_HOUR * 24;
var ONE_WEEK = ONE_DAY * 7;
var ONE_MONTH = ONE_WEEK * 5;// No good way to increment by one month using vanilla JS. Since this is an end date, we only need to ensure that this date occurs after at least one or more repeat increments, but there is no reason for it to be exact.
var ONE_YEAR = ONE_WEEK * 52;
var INTERVALS = {
secondly: ONE_SECOND,
minutely: ONE_MINUTE,
hourly: ONE_HOUR,
daily: ONE_DAY,
weekly: ONE_WEEK,
monthly: ONE_MONTH,
yearly: ONE_YEAR
};
var _incrementDate = function _incrementDate(start, end, interval, increment) {
return new Date(start.getTime() + (INTERVALS[interval] * increment));
};
Scheduler.prototype = {
constructor: Scheduler,
destroy: function () {
destroy: function destroy() {
var markup;

@@ -145,3 +185,3 @@ // set input value attribute

changed: function (e, data, propagate) {
changed: function changed(e, data, propagate) {
if (!propagate) {

@@ -158,11 +198,11 @@ e.stopPropagation();

disable: function () {
disable: function disable() {
this.toggleState('disable');
},
enable: function () {
enable: function enable() {
this.toggleState('enable');
},
setUtcTime: function (d, t, offset) {
setUtcTime: function setUtcTime(d, t, offset) {
var date = d.split('-');

@@ -205,3 +245,3 @@ var time = t.split(':');

// (Never, After, On date)
endSelectChanged: function (e, data) {
endSelectChanged: function endSelectChanged(e, data) {
var selectedItem, val;

@@ -232,3 +272,30 @@

getValue: function () {
_guessEndDate: function _guessEndDate() {
var interval = this.$repeatIntervalSelect.selectlist('selectedItem').value;
var end = new Date(this.$endDate.datepicker('getDate'));
var start = new Date(this.$startDate.datepicker('getDate'));
var increment = this.$repeatIntervalSpinbox.find('input').val();
if(interval !== "none" && end <= start){
// if increment spinbox is hidden, user has no idea what it is set to and it is probably not set to
// something they intended. Safest option is to set date forward by an increment of 1.
// this will keep monthly & yearly from auto-incrementing by more than a single interval
if(!this.$repeatIntervalSpinbox.is(':visible')){
increment = 1;
}
// treat weekdays as weekly. This treats all "weekdays" as a single set, of which a single increment
// is one week.
if(interval === "weekdays"){
increment = 1;
interval = "weekly";
}
end = _incrementDate(start, end, interval, increment);
this.$endDate.datepicker('setDate', end);
}
},
getValue: function getValue() {
// FREQ = frequency (secondly, minutely, hourly, daily, weekdays, weekly, monthly, yearly)

@@ -254,22 +321,5 @@ // BYDAY = when picking days (MO,TU,WE,etc)

var timeZone = this.$timeZone.selectlist('selectedItem');
var getFormattedDate;
getFormattedDate = function (dateObj, dash) {
var fdate = '';
var item;
fdate += dateObj.getFullYear();
fdate += dash;
item = dateObj.getMonth() + 1;//because 0 indexing makes sense when dealing with months /sarcasm
fdate += (item < 10) ? '0' + item : item;
fdate += dash;
item = dateObj.getDate();
fdate += (item < 10) ? '0' + item : item;
return fdate;
};
var day, days, hasAm, hasPm, month, pos, startDateTime, type;
startDateTime = '' + getFormattedDate(this.$startDate.datepicker('getDate'), '-');
startDateTime = '' + _getFormattedDate(this.$startDate.datepicker('getDate'), '-');

@@ -368,3 +418,3 @@ startDateTime += 'T';

} else if (end === 'date') {
duration = 'UNTIL=' + getFormattedDate(this.$endDate.datepicker('getDate'), '') + ';';
duration = 'UNTIL=' + _getFormattedDate(this.$endDate.datepicker('getDate'), '') + ';';
}

@@ -389,3 +439,3 @@

// (None, Hourly, Daily, Weekdays, Weekly, Monthly, Yearly
repeatIntervalSelectChanged: function (e, data) {
repeatIntervalSelectChanged: function repeatIntervalSelectChanged(e, data) {
var selectedItem, val, txt;

@@ -436,5 +486,7 @@

}
this._guessEndDate();
},
setValue: function (options) {
setValue: function setValue(options) {
var hours, i, item, l, minutes, period, recur, temp, startDate, startTime, timeOffset;

@@ -632,3 +684,3 @@

toggleState: function (action) {
toggleState: function toggleState(action) {
this.$element.find('.combobox').combobox(action);

@@ -649,3 +701,3 @@ this.$element.find('.datepicker').datepicker(action);

value: function (options) {
value: function value(options) {
if (options) {

@@ -662,3 +714,3 @@ return this.setValue(options);

$.fn.scheduler = function (option) {
$.fn.scheduler = function scheduler(option) {
var args = Array.prototype.slice.call(arguments, 1);

@@ -688,3 +740,3 @@ var methodReturn;

$.fn.scheduler.noConflict = function () {
$.fn.scheduler.noConflict = function noConflict() {
$.fn.scheduler = old;

@@ -691,0 +743,0 @@ return this;

@@ -11,39 +11,39 @@ {

"dependencies": {
"bootstrap": "3.x",
"jquery": "2.x",
"moment": "^2.10.6"
"bootstrap": "3.3.5",
"jquery": "2.1.4",
"moment": "2.10.6"
},
"description": "Base Fuel UX styles and controls",
"devDependencies": {
"bower": "1.x",
"connect": "3.x",
"grunt": "0.x",
"grunt-banner": "0.x",
"grunt-blanket-qunit": "~0.2.0",
"grunt-browserify": "3.x",
"grunt-bump": "0.x",
"grunt-cli": "0.x",
"grunt-contrib-clean": "0.x",
"grunt-contrib-compress": "0.x",
"grunt-contrib-concat": "0.x",
"grunt-contrib-connect": "0.x",
"grunt-contrib-copy": "0.x",
"grunt-contrib-jshint": "0.x",
"grunt-contrib-less": "1.x",
"grunt-contrib-qunit": "0.5.x",
"grunt-contrib-uglify": "0.x",
"grunt-contrib-watch": "0.x",
"grunt-html": "^5.0.0",
"grunt-jsbeautifier": "0.x",
"grunt-prompt": "1.x",
"grunt-saucelabs": "8.x",
"grunt-shell": "1.x",
"grunt-text-replace": "0.x",
"grunt-umd": "2.x",
"grunt-zip": "0.x",
"load-grunt-config": "0.x",
"load-grunt-tasks": "3.x",
"qunitjs": "1.x",
"semver": "5.x",
"serve-static": ">=1.7.2"
"bower": "1.6.5",
"connect": "3.4.0",
"grunt": "0.4.5",
"grunt-banner": "0.6.0",
"grunt-blanket-qunit": "0.2.0",
"grunt-browserify": "4.0.1",
"grunt-bump": "0.6.0",
"grunt-cli": "0.1.13",
"grunt-contrib-clean": "0.6.0",
"grunt-contrib-compress": "0.14.0",
"grunt-contrib-concat": "0.5.1",
"grunt-contrib-connect": "0.11.2",
"grunt-contrib-copy": "0.8.2",
"grunt-contrib-jshint": "0.11.3",
"grunt-contrib-less": "1.0.1",
"grunt-contrib-qunit": "0.5.2",
"grunt-contrib-uglify": "0.10.0",
"grunt-contrib-watch": "0.6.1",
"grunt-html": "5.0.1",
"grunt-jsbeautifier": "0.2.10",
"grunt-prompt": "1.3.0",
"grunt-saucelabs": "8.6.1",
"grunt-shell": "1.1.2",
"grunt-text-replace": "0.4.0",
"grunt-umd": "2.3.4",
"grunt-zip": "0.17.1",
"load-grunt-config": "0.17.2",
"load-grunt-tasks": "3.3.0",
"qunitjs": "1.19.0",
"semver": "5.0.3",
"serve-static": "1.10.0"
},

@@ -87,3 +87,3 @@ "engines": {

"title": "Fuel UX",
"version": "3.11.4",
"version": "3.11.5",
"volo": {

@@ -90,0 +90,0 @@ "baseDir": "lib",

@@ -16,3 +16,3 @@ #[Fuel UX](http://getfuelux.com/)

* [Quick start](#quick-start)
* [Using](#using)
* [Bugs and feature requests](#bugs-and-feature-requests)

@@ -25,3 +25,3 @@ * [Documentation](#documentation)

## Quick start
## Using

@@ -39,14 +39,14 @@ Fuel UX can be used with an existing page via CDN or installed in a project.

<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
<link href="//www.fuelcdn.com/fuelux/3.11.3/css/fuelux.min.css" rel="stylesheet">
<link href="//www.fuelcdn.com/fuelux/3.11.4/css/fuelux.min.css" rel="stylesheet">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.1/js/bootstrap.min.js"></script>
<script src="//www.fuelcdn.com/fuelux/3.11.3/js/fuelux.min.js"></script>
<script src="//www.fuelcdn.com/fuelux/3.11.4/js/fuelux.min.js"></script>
```
### Install
#### The code you want is in `dist`
A few ways available to install.
- Request files from [the Fuel UX CDN](http://www.fuelcdn.com/fuelux/3.11.3/)
- Request files from [the Fuel UX CDN](http://www.fuelcdn.com/fuelux/3.11.4/)
- Install with [NPM](https://www.npmjs.com/package/fuelux): `npm install fuelux`.

@@ -62,3 +62,3 @@ - [Download the latest release](https://github.com/exacttarget/fuelux/archive/3.4.0.zip).

Downloading the zip of FuelUX provides the following directories and files, which are grouped according to file type:
We provide compiled CSS and JS (like `fuelux.*`), as well as compiled and minified CSS and JS (like `fuelux.min.*`) in the `dist` folder. Supporting icons are provided as fonts.
```

@@ -78,4 +78,4 @@ fuelux/

```
We provide compiled CSS and JS (like `fuelux.*`), as well as compiled and minified CSS and JS (like `fuelux.min.*`) in the `dist` folder. Supporting icons are provided as fonts.
### Dependencies

@@ -103,21 +103,25 @@ Fuel UX is dependent upon [Bootstrap 3](https://github.com/twbs/bootstrap) and [jQuery](https://github.com/jquery/jquery). If you installed by cloning the repo or by downloading a .zip archive, you'll also want to grab these things, as it won't work without them.

## Contributing
Before writing code, we suggest you [search for issues](https://github.com/ExactTarget/fuelux/issues?state=open) or [create a new one](https://github.com/ExactTarget/fuelux/issues/new) to confirm where your contribution fits into
### Before writing code
* [confirm issue is new](https://github.com/ExactTarget/fuelux/issues), if not, get involved in previous report of issue.
* [create a new issue](https://github.com/ExactTarget/fuelux/issues/new) to confirm where your contribution fits into
our roadmap.
Please do not edit or commit files in the `dist` directory. You'll find source files in the respective `js`, `less`, and `fonts` directory. Project maintainers will commit files in the `dist` directory from time to time. Details on compiling CSS and JavasScript can be found [here](https://github.com/exacttarget/fuelux/blob/master/DETAILS.md#compiling-code).
### Writing code
* Do not edit or commit files in the `dist` directory. *Project maintainers will commit files in the `dist` directory from time to time. Details on compiling CSS and JavasScript can be found [here](https://github.com/exacttarget/fuelux/blob/master/DETAILS.md#compiling-code).*
* Source files are in respective `js`, `less`, and `fonts` directories.
* Conform to [Salesforce Marketing Cloud style guide](https://github.com/ExactTarget/javascript).
* Add and/or update unit tests for any new or changed functionality.
* Test your code at [http://localhost:8000/](http://localhost:8000/). (start using `grunt servefast`)
* Run unit tests with `grunt test` or in browser at [http://localhost:8000/test/](http://localhost:8000/test/) (you'll need to `grunt servefast` to keep server from quitting on failed unit tests to troubleshoot in browser).
Prior to submitting a pull request, please run `grunt` to lint & test your code. All pull requests are validated via [Travis CI](https://travis-ci.org/). If the tests fail unexpectedly feel free to [trigger a restart](https://github.com/exacttarget/fuelux/blob/master/DETAILS.md#travis-ci).
### Submitting Pull Requests
All pull requests are validated via [Travis CI](https://travis-ci.org/). If the tests fail and you feel it is a Travis issue, you can [trigger a restart](https://github.com/exacttarget/fuelux/blob/master/DETAILS.md#travis-ci).
Take care to maintain the existing coding style (tabs, clarity over brevity, declarative markup, semicolons, etc).
While grunt can run the included unit tests via PhantomJS, this isn't a substitute for running tests across a variety of browsers and environments. Please be sure to test in as many of the browsers listed in `sauce_browsers.yml` as you can before contributing.
Please review the [Salesforce Marketing Cloud style guide](https://github.com/ExactTarget/javascript) if you have any questions.
* Run `grunt` to lint & test your code.
* Write meaningful commit messages.
* Submit a pull request from your github fork, mentioning the issue your changes fix.
* Follow your pull request answering questions and making adjustments as appropriate until it is merged.
## Developing
Be sure to add unit tests for any new or changed functionality.
To serve the test page and lint your changes run `grunt serve` while developing. View the test page at [http://localhost:8000/test/](http://localhost:8000/test/). The `serve` task will run lint and unit tests against saved code.
While grunt can run the included unit tests via PhantomJS, this isn't a substitute for running tests across a variety of browsers and environments. Please be sure to test in as many of the browsers listed in `sauce_browsers.yml` as you can before contributing.
Read more about [contributing to FuelUX](https://github.com/ExactTarget/fuelux/wiki/Contributing-to-Fuel-UX)

@@ -127,5 +131,2 @@

Keep track of development and community news.
- Fuel UX, API's, and building with other Salesforce Marketing Cloud products visit [Code@](https://code.exacttarget.com/).
- Implementation help may be found at Stack Overflow (tagged [`fuelux`](http://stackoverflow.com/questions/tagged/fuelux)).

@@ -132,0 +133,0 @@ - Follow [@FuelUX on Twitter](https://twitter.com/fuelux).

@@ -5,3 +5,3 @@ window.$ = window.jQuery = require('jquery');

var fuelux = require('../dist/js/npm');
var QUnit = require('qunitjs');
require('qunitjs');

@@ -8,0 +8,0 @@ // In order to be be UMD compliant, modules must work with

@@ -389,4 +389,4 @@ /*global QUnit:false, module:false, test:false, asyncTest:false, expect:false*/

html: '<span class="glyphicon glyphicon-trash"></span> Delete',
clickAction: function(helpers, callback) {
testClickAction(helpers);
clickAction: function(helpers, callback, e) {
testClickAction(helpers, callback, e);
callback();

@@ -423,3 +423,3 @@ }

function testClickAction(helpers) {
function testClickAction(helpers, callback, e) {
equal((typeof helpers === 'object'), true, 'Items in row were returned after action click');

@@ -433,2 +433,5 @@ var count = 0;

equal(count === 4, true, 'Full row object was returned');
equal((typeof callback === 'function'), true, 'callback is a function');
equal((typeof e === 'object'), true, 'e is an object');
equal((typeof e.target !== 'undefined'), true, 'e is probably a jQuery event object');
}

@@ -435,0 +438,0 @@

@@ -246,2 +246,33 @@ /*global QUnit:false, module:false, test:false, asyncTest:false, expect:false*/

test('should guess end date when start date changed to be after end date', function(assert) {
var allDone = assert.async();
var today = new Date('10/06/2015');
var schedule = {
startDateTime: '2015-10-06T03:23-04:00',
endDateOptions: { date: '10/06/2015' },
recurrencePattern: 'FREQ=DAILY;INTERVAL=5;UNTIL=20151006'
};
var $schedulerDOM = $('<div>'+templateHtml+'</div>').find('#MyScheduler');
var $scheduler = $schedulerDOM.scheduler();
$scheduler.scheduler('value', schedule);
var $start = $scheduler.find('.start-datetime .start-date');
var $end = $scheduler.find('.end-on-date');
$start.on('changed.fu.datepicker', function(){
var end = $end.datepicker('getDate');
var start = $start.datepicker('getDate');
ok(start < end, 'end date after start date');
allDone();
});
$start.find('input').val('10/11/2015');
$start.find('input').trigger('change');
});
// TODO: need more end date test or dry out code where start and end use same methods

@@ -248,0 +279,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc