Merge remote-tracking branch 'github/master' into open250
This commit is contained in:
@@ -181,7 +181,7 @@ define(
|
||||
* @typedef DialogOption
|
||||
* @property {string} label a label to be displayed as the button
|
||||
* text for this action
|
||||
* @property {function} action a function to be called when the
|
||||
* @property {function} callback a function to be called when the
|
||||
* button is clicked
|
||||
*/
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"runs": [
|
||||
{
|
||||
"implementation": "StyleSheetLoader.js",
|
||||
"depends": [ "stylesheets[]", "$document" ]
|
||||
"depends": [ "stylesheets[]", "$document", "THEME" ]
|
||||
}
|
||||
],
|
||||
"stylesheets": [
|
||||
@@ -194,6 +194,11 @@
|
||||
{
|
||||
"key": "MCT_SCROLL_Y_ATTRIBUTE",
|
||||
"value": "mctScrollY"
|
||||
},
|
||||
{
|
||||
"key": "THEME",
|
||||
"value": "unspecified",
|
||||
"priority": "fallback"
|
||||
}
|
||||
],
|
||||
"containers": [
|
||||
|
||||
@@ -38,8 +38,9 @@ define(
|
||||
* @constructor
|
||||
* @param {object[]} stylesheets stylesheet extension definitions
|
||||
* @param $document Angular's jqLite-wrapped document element
|
||||
* @param {string} activeTheme the theme in use
|
||||
*/
|
||||
function StyleSheetLoader(stylesheets, $document) {
|
||||
function StyleSheetLoader(stylesheets, $document, activeTheme) {
|
||||
var head = $document.find('head'),
|
||||
document = $document[0];
|
||||
|
||||
@@ -62,8 +63,15 @@ define(
|
||||
head.append(link);
|
||||
}
|
||||
|
||||
// Stylesheets which specify themes should only be applied
|
||||
// when that theme has been declared.
|
||||
function matchesTheme(stylesheet) {
|
||||
return stylesheet.theme === undefined ||
|
||||
stylesheet.theme === activeTheme;
|
||||
}
|
||||
|
||||
// Add all stylesheets from extensions
|
||||
stylesheets.forEach(addStyleSheet);
|
||||
stylesheets.filter(matchesTheme).forEach(addStyleSheet);
|
||||
}
|
||||
|
||||
return StyleSheetLoader;
|
||||
|
||||
@@ -32,10 +32,11 @@ define(
|
||||
mockPlainDocument,
|
||||
mockHead,
|
||||
mockElement,
|
||||
testBundle,
|
||||
loader;
|
||||
|
||||
beforeEach(function () {
|
||||
var testBundle = {
|
||||
testBundle = {
|
||||
path: "a/b",
|
||||
resources: "c"
|
||||
};
|
||||
@@ -72,6 +73,40 @@ define(
|
||||
expect(mockElement.setAttribute)
|
||||
.toHaveBeenCalledWith('href', "a/b/c/d.css");
|
||||
});
|
||||
|
||||
describe("for themed stylesheets", function () {
|
||||
var testTheme = "test-theme";
|
||||
|
||||
beforeEach(function () {
|
||||
testStyleSheets = [{
|
||||
stylesheetUrl: "themed.css",
|
||||
bundle: testBundle,
|
||||
theme: testTheme
|
||||
}, {
|
||||
stylesheetUrl: "bad-theme.css",
|
||||
bundle: testBundle,
|
||||
theme: 'bad-theme'
|
||||
}];
|
||||
|
||||
loader = new StyleSheetLoader(
|
||||
testStyleSheets,
|
||||
mockDocument,
|
||||
testTheme
|
||||
);
|
||||
});
|
||||
|
||||
it("includes matching themes", function () {
|
||||
expect(mockElement.setAttribute)
|
||||
.toHaveBeenCalledWith('href', "a/b/c/themed.css");
|
||||
});
|
||||
|
||||
it("excludes mismatching themes", function () {
|
||||
expect(mockElement.setAttribute)
|
||||
.not.toHaveBeenCalledWith('href', "a/b/c/bad-theme.css");
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
@@ -85,7 +85,7 @@ define(
|
||||
function link(scope, element, attrs, ctrl, transclude) {
|
||||
if (deviceMatches(attrs.mctDevice)) {
|
||||
transclude(function (clone) {
|
||||
element.parent().append(clone);
|
||||
element.replaceWith(clone);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,13 +26,12 @@ define(
|
||||
function (MCTDevice) {
|
||||
"use strict";
|
||||
|
||||
var JQLITE_METHODS = [ 'parent', 'append' ];
|
||||
var JQLITE_METHODS = [ 'replaceWith' ];
|
||||
|
||||
describe("The mct-device directive", function () {
|
||||
var mockAgentService,
|
||||
mockTransclude,
|
||||
mockElement,
|
||||
mockParent,
|
||||
mockClone,
|
||||
testAttrs,
|
||||
directive;
|
||||
@@ -48,11 +47,8 @@ define(
|
||||
);
|
||||
mockTransclude = jasmine.createSpy("$transclude");
|
||||
mockElement = jasmine.createSpyObj(name, JQLITE_METHODS);
|
||||
mockParent = jasmine.createSpyObj(name, JQLITE_METHODS);
|
||||
mockClone = jasmine.createSpyObj(name, JQLITE_METHODS);
|
||||
|
||||
mockElement.parent.andReturn(mockParent);
|
||||
|
||||
mockTransclude.andCallFake(function (fn) {
|
||||
fn(mockClone);
|
||||
});
|
||||
@@ -65,6 +61,15 @@ define(
|
||||
directive = new MCTDevice(mockAgentService);
|
||||
});
|
||||
|
||||
function expectInclusion() {
|
||||
expect(mockElement.replaceWith)
|
||||
.toHaveBeenCalledWith(mockClone);
|
||||
}
|
||||
|
||||
function expectExclusion() {
|
||||
expect(mockElement.replaceWith).not.toHaveBeenCalled();
|
||||
}
|
||||
|
||||
it("is applicable at the attribute level", function () {
|
||||
expect(directive.restrict).toEqual("A");
|
||||
});
|
||||
@@ -80,54 +85,54 @@ define(
|
||||
it("restricts element inclusion for mobile devices", function () {
|
||||
testAttrs.mctDevice = "mobile";
|
||||
link();
|
||||
expect(mockParent.append).not.toHaveBeenCalled();
|
||||
expectExclusion();
|
||||
|
||||
mockAgentService.isMobile.andReturn(true);
|
||||
link();
|
||||
expect(mockParent.append).toHaveBeenCalledWith(mockClone);
|
||||
expectInclusion();
|
||||
});
|
||||
|
||||
it("restricts element inclusion for tablet devices", function () {
|
||||
testAttrs.mctDevice = "tablet";
|
||||
mockAgentService.isMobile.andReturn(true);
|
||||
link();
|
||||
expect(mockParent.append).not.toHaveBeenCalled();
|
||||
expectExclusion();
|
||||
|
||||
mockAgentService.isTablet.andReturn(true);
|
||||
link();
|
||||
expect(mockParent.append).toHaveBeenCalledWith(mockClone);
|
||||
expectInclusion();
|
||||
});
|
||||
|
||||
it("restricts element inclusion for phone devices", function () {
|
||||
testAttrs.mctDevice = "phone";
|
||||
mockAgentService.isMobile.andReturn(true);
|
||||
link();
|
||||
expect(mockParent.append).not.toHaveBeenCalled();
|
||||
expectExclusion();
|
||||
|
||||
mockAgentService.isPhone.andReturn(true);
|
||||
link();
|
||||
expect(mockParent.append).toHaveBeenCalledWith(mockClone);
|
||||
expectInclusion();
|
||||
});
|
||||
|
||||
it("restricts element inclusion for desktop devices", function () {
|
||||
testAttrs.mctDevice = "desktop";
|
||||
mockAgentService.isMobile.andReturn(true);
|
||||
link();
|
||||
expect(mockParent.append).not.toHaveBeenCalled();
|
||||
expectExclusion();
|
||||
|
||||
mockAgentService.isMobile.andReturn(false);
|
||||
link();
|
||||
expect(mockParent.append).toHaveBeenCalledWith(mockClone);
|
||||
expectInclusion();
|
||||
});
|
||||
|
||||
it("restricts element inclusion for portrait orientation", function () {
|
||||
testAttrs.mctDevice = "portrait";
|
||||
link();
|
||||
expect(mockParent.append).not.toHaveBeenCalled();
|
||||
expectExclusion();
|
||||
|
||||
mockAgentService.isPortrait.andReturn(true);
|
||||
link();
|
||||
expect(mockParent.append).toHaveBeenCalledWith(mockClone);
|
||||
expectInclusion();
|
||||
});
|
||||
|
||||
it("restricts element inclusion for landscape orientation", function () {
|
||||
@@ -135,11 +140,11 @@ define(
|
||||
mockAgentService.isLandscape.andReturn(false);
|
||||
mockAgentService.isPortrait.andReturn(true);
|
||||
link();
|
||||
expect(mockParent.append).not.toHaveBeenCalled();
|
||||
expectExclusion();
|
||||
|
||||
mockAgentService.isLandscape.andReturn(true);
|
||||
link();
|
||||
expect(mockParent.append).toHaveBeenCalledWith(mockClone);
|
||||
expectInclusion();
|
||||
});
|
||||
|
||||
it("allows multiple device characteristics to be requested", function () {
|
||||
@@ -148,17 +153,17 @@ define(
|
||||
testAttrs.mctDevice = "portrait mobile";
|
||||
link();
|
||||
// Neither portrait nor mobile, not called
|
||||
expect(mockParent.append).not.toHaveBeenCalled();
|
||||
expectExclusion();
|
||||
|
||||
mockAgentService.isPortrait.andReturn(true);
|
||||
link();
|
||||
|
||||
// Was portrait, but not mobile, so no
|
||||
expect(mockParent.append).not.toHaveBeenCalled();
|
||||
expectExclusion();
|
||||
|
||||
mockAgentService.isMobile.andReturn(true);
|
||||
link();
|
||||
expect(mockParent.append).toHaveBeenCalledWith(mockClone);
|
||||
expectInclusion();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
{
|
||||
"name": "Espresso",
|
||||
"description": "Espresso theme: dark and rich",
|
||||
"extensions": {
|
||||
"stylesheets": [
|
||||
{
|
||||
"stylesheetUrl": "css/theme-espresso.css",
|
||||
"priority": 1000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
"name": "Espresso",
|
||||
"description": "Espresso theme: dark and rich",
|
||||
"extensions": {
|
||||
"stylesheets": [
|
||||
{
|
||||
"stylesheetUrl": "css/theme-espresso.css",
|
||||
"priority": 1000
|
||||
}
|
||||
],
|
||||
"constants": [
|
||||
{
|
||||
"key": "THEME",
|
||||
"value": "espresso"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
{
|
||||
"name": "Sonw",
|
||||
"description": "Snow theme: light and cool",
|
||||
"extensions": {
|
||||
"stylesheets": [
|
||||
{
|
||||
"stylesheetUrl": "css/theme-snow.css",
|
||||
"priority": 1000
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
"name": "Snow",
|
||||
"description": "Snow theme: light and cool",
|
||||
"extensions": {
|
||||
"stylesheets": [
|
||||
{
|
||||
"stylesheetUrl": "css/theme-snow.css",
|
||||
"priority": 1000
|
||||
}
|
||||
],
|
||||
"constants": [
|
||||
{
|
||||
"key": "THEME",
|
||||
"value": "snow"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,20 +72,6 @@ $colorInputBg: $colorGenBg;
|
||||
$colorInputFg: $colorBodyFg;
|
||||
$colorFormText: pushBack($colorBodyFg, 10%);
|
||||
$colorInputIcon: pushBack($colorBodyFg, 25%);
|
||||
|
||||
// Status colors, mainly used for messaging and item ancillary symbols
|
||||
$colorStatusFg: #fff;
|
||||
$colorStatusDefault: #ccc;
|
||||
$colorStatusInfo: #60ba7b;
|
||||
$colorStatusAlert: #ffb66c;
|
||||
$colorStatusError: #c96b68;
|
||||
$colorProgressBarOuter: rgba(#000, 0.1);
|
||||
$colorProgressBarAmt: #0a0;
|
||||
$progressBarHOverlay: 15px;
|
||||
$progressBarStripeW: 20px;
|
||||
$shdwStatusIc: rgba(white, 0.8) 0 0px 5px;
|
||||
|
||||
// Selects
|
||||
$colorSelectBg: #ddd;
|
||||
$colorSelectFg: $colorBodyFg;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user