Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
Loading items

Target

Select target project
  • to/keycloak-theme-pirati
  • marek.krejpsky/keycloak-theme-pirati
2 results
Select Git revision
Loading items
Show changes
Showing
with 0 additions and 1257 deletions
/**
* Created by Allen Zou on 2016/10/13.
*/
"use strict";
require("./view/tree.less");
var fileIcon = require("./view/imgs/file.png");
var folderIcon = require("./view/imgs/folder.png");
var closedFolderIcon = require("./view/imgs/folder-closed.png");
var plusIcon = require("./view/imgs/plus.png");
var removeIcon = require("./view/imgs/remove.png");
var tree = angular.module("angular.tree", []);
tree
.directive("treeNode", function () {
return {
scope: {
item: "=",
adapter: "=",
icon: "=",
folderOpen: "=",
folderClose: "=",
nodeClick: "=",
childrenLoader: "=",
addItem: "=",
removeItem: "=",
editItem: "="
},
require: [],
restrict: "E",
// templateUrl: "directive/tree/node.html",
template: require("./view/node.html"),
link: function($scope, element, attributes, controllers) {
$scope.open = false;
$scope.add_btn = plusIcon;
$scope.remove_btn = removeIcon;
function load_children() {
if ($scope.childrenLoader) {
$scope.childrenLoader($scope.item)
.then(function(children) {
$scope.subNodes = children;
})
.catch(function(error) {
console.error(error);
$scope.subNodes = [];
})
} else {
$scope.subNodes = [];
}
}
$scope.wrap_node_click = function() {
if ($scope.item) {
var adaptedItem = $scope.adapter($scope.item);
if (adaptedItem.type === "branch") {
if ($scope.open) {
$scope.open = false;
$scope.folderClose && $scope.folderClose($scope.item);
}
else {
$scope.open = true;
$scope.folderOpen && $scope.folderOpen($scope.item);
load_children();
}
}
$scope.nodeClick && $scope.nodeClick($scope.item);
}
return false;
};
$scope.resolve_icon = function() {
var icon = null;
var adaptedItem = $scope.adapter($scope.item);
if (adaptedItem.type === 'branch') {
icon = ($scope.icon && $scope.icon($scope.item, $scope.open))
|| (!$scope.open && closedFolderIcon)
|| ($scope.open && folderIcon);
}
else {
icon = ($scope.icon && $scope.icon($scope.item))
|| fileIcon;
}
return icon;
};
$scope.node_class = function() {
var classes = ["node"];
var adaptedItem = $scope.adapter($scope.item);
if (adaptedItem.type === 'branch') {
classes.push("branch");
if ($scope.open) {
classes.push("open");
}
else {
classes.push("closed");
}
}
else {
classes.push("leaf");
}
return classes;
};
$scope.add_child = function() {
if ($scope.addItem) {
$scope.addItem($scope.item)
.then(function() {
load_children();
})
;
}
return false;
};
$scope.remove_self = function() {
if ($scope.removeItem) {
$scope.removeItem($scope.item)
.then(function() {
load_children();
})
;
}
return false;
};
$scope.edit = function() {
console.log("edit:::");
console.log($scope.editItem);
$scope.editItem && $scope.editItem($scope.item);
return false;
};
}
};
})
.directive("tree", function () {
var link = function($scope, element, attributes, controllers) {
$scope.itemAdapter = $scope.adapter || function(item) {
console.log("in tree .adapter");
return item;
};
$scope.tree_class = function() {
var classes = ["tree"];
return classes;
}
};
return {
scope: {
root: "=root",
adapter: "=",
icon: "=",
folderOpen: "=",
folderClose: "=",
nodeClick: "=",
childrenLoader: "=",
addItem: "=",
removeItem: "=",
editItem: "="
},
require: [],
restrict: "E",
// templateUrl: "directive/tree/tree.html",
template: require("./view/tree.html"),
link: link
}
})
;
module.exports = tree;
<div ng-class="node_class()">
<div class="directory-level" ng-click="wrap_node_click()">
<img class="icon" ng-src="{{ resolve_icon() }}">
<span>{{ adapter(item).text }}</span>
<div class="operation" ng-click="$event.stopPropagation()">
<a href class="add" ng-click="add_child()" ng-if="adapter(item).type==='branch'">
<img ng-src="{{ add_btn }}">
</a>
<a href class="remove" ng-click="remove_self()">
<img ng-src="{{ remove_btn }}">
</a>
<a href class="edit" ng-click="edit()">
<span class="glyphicon glyphicon-edit"></span>
</a>
</div>
</div>
<div class="sub-node" ng-if="open" ng-repeat="node in subNodes">
<tree-node item="node" adapter="adapter" icon="icon"
folder-open="folderOpen" folder-close="folderClose"
node-click="nodeClick" children-loader="childrenLoader"
add-item="addItem" remove-item="removeItem" edit-item="editItem">
</tree-node>
</div>
</div>
\ No newline at end of file
<div ng-class="tree_class()">
<tree-node item="root" adapter="itemAdapter" icon="icon"
folder-open="folderOpen" folder-close="folderClose"
node-click="nodeClick" children-loader="childrenLoader"
add-item="addItem" remove-item="removeItem" edit-item="editItem">
</tree-node>
</div>
\ No newline at end of file
.tree {
@node-height: 16px;
overflow: auto;
.node {
width: 100%;
.directory-level {
position: relative;
padding-right: 4px;
white-space: nowrap;
font-size: @node-height;
line-height: @node-height;
>.icon {
height: @node-height;
}
.operation {
display: inline;
margin-left: 20px;
visibility: hidden;
img {
height: @node-height;
}
}
&:hover {
.operation {
visibility: visible;
}
}
}
.sub-node {
padding-left: 14px;
}
}
}
\ No newline at end of file
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
/**
* Created by Allen Zou on 2016/10/13.
*/
"use strict";
__webpack_require__(6);
var fileIcon = __webpack_require__(7);
var folderIcon = __webpack_require__(9);
var closedFolderIcon = __webpack_require__(8);
var plusIcon = __webpack_require__(10);
var removeIcon = __webpack_require__(11);
var tree = angular.module("angular.tree", []);
tree
.directive("treeNode", function () {
return {
scope: {
item: "=",
adapter: "=",
icon: "=",
folderOpen: "=",
folderClose: "=",
nodeClick: "=",
childrenLoader: "=",
addItem: "=",
removeItem: "=",
editItem: "="
},
require: [],
restrict: "E",
// templateUrl: "directive/tree/node.html",
template: __webpack_require__(3),
link: function($scope, element, attributes, controllers) {
$scope.open = false;
$scope.add_btn = plusIcon;
$scope.remove_btn = removeIcon;
function load_children() {
if ($scope.childrenLoader) {
$scope.childrenLoader($scope.item)
.then(function(children) {
$scope.subNodes = children;
})
.catch(function(error) {
console.error(error);
$scope.subNodes = [];
})
} else {
$scope.subNodes = [];
}
}
$scope.wrap_node_click = function() {
if ($scope.item) {
var adaptedItem = $scope.adapter($scope.item);
if (adaptedItem.type === "branch") {
if ($scope.open) {
$scope.open = false;
$scope.folderClose && $scope.folderClose($scope.item);
}
else {
$scope.open = true;
$scope.folderOpen && $scope.folderOpen($scope.item);
load_children();
}
}
$scope.nodeClick && $scope.nodeClick($scope.item);
}
return false;
};
$scope.resolve_icon = function() {
var icon = null;
var adaptedItem = $scope.adapter($scope.item);
if (adaptedItem.type === 'branch') {
icon = ($scope.icon && $scope.icon($scope.item, $scope.open))
|| (!$scope.open && closedFolderIcon)
|| ($scope.open && folderIcon);
}
else {
icon = ($scope.icon && $scope.icon($scope.item))
|| fileIcon;
}
return icon;
};
$scope.node_class = function() {
var classes = ["node"];
var adaptedItem = $scope.adapter($scope.item);
if (adaptedItem.type === 'branch') {
classes.push("branch");
if ($scope.open) {
classes.push("open");
}
else {
classes.push("closed");
}
}
else {
classes.push("leaf");
}
return classes;
};
$scope.add_child = function() {
if ($scope.addItem) {
$scope.addItem($scope.item)
.then(function() {
load_children();
})
;
}
return false;
};
$scope.remove_self = function() {
if ($scope.removeItem) {
$scope.removeItem($scope.item)
.then(function() {
load_children();
})
;
}
return false;
};
$scope.edit = function() {
console.log("edit:::");
console.log($scope.editItem);
$scope.editItem && $scope.editItem($scope.item);
return false;
};
}
};
})
.directive("tree", function () {
var link = function($scope, element, attributes, controllers) {
$scope.itemAdapter = $scope.adapter || function(item) {
console.log("in tree .adapter");
return item;
};
$scope.tree_class = function() {
var classes = ["tree"];
return classes;
}
};
return {
scope: {
root: "=root",
adapter: "=",
icon: "=",
folderOpen: "=",
folderClose: "=",
nodeClick: "=",
childrenLoader: "=",
addItem: "=",
removeItem: "=",
editItem: "="
},
require: [],
restrict: "E",
// templateUrl: "directive/tree/tree.html",
template: __webpack_require__(4),
link: link
}
})
;
module.exports = tree;
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
exports = module.exports = __webpack_require__(2)();
// imports
// module
exports.push([module.id, ".tree {\n overflow: auto;\n}\n.tree .node {\n width: 100%;\n}\n.tree .node .directory-level {\n position: relative;\n padding-right: 4px;\n white-space: nowrap;\n font-size: 16px;\n line-height: 16px;\n}\n.tree .node .directory-level > .icon {\n height: 16px;\n}\n.tree .node .directory-level .operation {\n display: inline;\n margin-left: 20px;\n visibility: hidden;\n}\n.tree .node .directory-level .operation img {\n height: 16px;\n}\n.tree .node .directory-level:hover .operation {\n visibility: visible;\n}\n.tree .node .sub-node {\n padding-left: 14px;\n}\n", ""]);
// exports
/***/ },
/* 2 */
/***/ function(module, exports) {
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
// css base code, injected by the css-loader
module.exports = function() {
var list = [];
// return the list of modules as css string
list.toString = function toString() {
var result = [];
for(var i = 0; i < this.length; i++) {
var item = this[i];
if(item[2]) {
result.push("@media " + item[2] + "{" + item[1] + "}");
} else {
result.push(item[1]);
}
}
return result.join("");
};
// import a list of modules into the list
list.i = function(modules, mediaQuery) {
if(typeof modules === "string")
modules = [[null, modules, ""]];
var alreadyImportedModules = {};
for(var i = 0; i < this.length; i++) {
var id = this[i][0];
if(typeof id === "number")
alreadyImportedModules[id] = true;
}
for(i = 0; i < modules.length; i++) {
var item = modules[i];
// skip already imported module
// this implementation is not 100% perfect for weird media query combinations
// when a module is imported multiple times with different media queries.
// I hope this will never occur (Hey this way we have smaller bundles)
if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
if(mediaQuery && !item[2]) {
item[2] = mediaQuery;
} else if(mediaQuery) {
item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
}
list.push(item);
}
}
};
return list;
};
/***/ },
/* 3 */
/***/ function(module, exports) {
module.exports = "<div ng-class=\"node_class()\">\n <div class=\"directory-level\" ng-click=\"wrap_node_click()\">\n <img class=\"icon\" ng-src=\"{{ resolve_icon() }}\">\n <span>{{ adapter(item).text }}</span>\n <div class=\"operation\" ng-click=\"$event.stopPropagation()\">\n <a href class=\"add\" ng-click=\"add_child()\" ng-if=\"adapter(item).type==='branch'\">\n <img ng-src=\"{{ add_btn }}\">\n </a>\n <a href class=\"remove\" ng-click=\"remove_self()\">\n <img ng-src=\"{{ remove_btn }}\">\n </a>\n <a href class=\"edit\" ng-click=\"edit()\">\n <span class=\"glyphicon glyphicon-edit\"></span>\n </a>\n </div>\n </div>\n <div class=\"sub-node\" ng-if=\"open\" ng-repeat=\"node in subNodes\">\n <tree-node item=\"node\" adapter=\"adapter\" icon=\"icon\"\n folder-open=\"folderOpen\" folder-close=\"folderClose\"\n node-click=\"nodeClick\" children-loader=\"childrenLoader\"\n add-item=\"addItem\" remove-item=\"removeItem\" edit-item=\"editItem\">\n </tree-node>\n </div>\n</div>";
/***/ },
/* 4 */
/***/ function(module, exports) {
module.exports = "<div ng-class=\"tree_class()\">\n <tree-node item=\"root\" adapter=\"itemAdapter\" icon=\"icon\"\n folder-open=\"folderOpen\" folder-close=\"folderClose\"\n node-click=\"nodeClick\" children-loader=\"childrenLoader\"\n add-item=\"addItem\" remove-item=\"removeItem\" edit-item=\"editItem\">\n </tree-node>\n</div>";
/***/ },
/* 5 */
/***/ function(module, exports, __webpack_require__) {
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var stylesInDom = {},
memoize = function(fn) {
var memo;
return function () {
if (typeof memo === "undefined") memo = fn.apply(this, arguments);
return memo;
};
},
isOldIE = memoize(function() {
return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
}),
getHeadElement = memoize(function () {
return document.head || document.getElementsByTagName("head")[0];
}),
singletonElement = null,
singletonCounter = 0,
styleElementsInsertedAtTop = [];
module.exports = function(list, options) {
if(false) {
if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
}
options = options || {};
// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
// tags it will allow on a page
if (typeof options.singleton === "undefined") options.singleton = isOldIE();
// By default, add <style> tags to the bottom of <head>.
if (typeof options.insertAt === "undefined") options.insertAt = "bottom";
var styles = listToStyles(list);
addStylesToDom(styles, options);
return function update(newList) {
var mayRemove = [];
for(var i = 0; i < styles.length; i++) {
var item = styles[i];
var domStyle = stylesInDom[item.id];
domStyle.refs--;
mayRemove.push(domStyle);
}
if(newList) {
var newStyles = listToStyles(newList);
addStylesToDom(newStyles, options);
}
for(var i = 0; i < mayRemove.length; i++) {
var domStyle = mayRemove[i];
if(domStyle.refs === 0) {
for(var j = 0; j < domStyle.parts.length; j++)
domStyle.parts[j]();
delete stylesInDom[domStyle.id];
}
}
};
}
function addStylesToDom(styles, options) {
for(var i = 0; i < styles.length; i++) {
var item = styles[i];
var domStyle = stylesInDom[item.id];
if(domStyle) {
domStyle.refs++;
for(var j = 0; j < domStyle.parts.length; j++) {
domStyle.parts[j](item.parts[j]);
}
for(; j < item.parts.length; j++) {
domStyle.parts.push(addStyle(item.parts[j], options));
}
} else {
var parts = [];
for(var j = 0; j < item.parts.length; j++) {
parts.push(addStyle(item.parts[j], options));
}
stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
}
}
}
function listToStyles(list) {
var styles = [];
var newStyles = {};
for(var i = 0; i < list.length; i++) {
var item = list[i];
var id = item[0];
var css = item[1];
var media = item[2];
var sourceMap = item[3];
var part = {css: css, media: media, sourceMap: sourceMap};
if(!newStyles[id])
styles.push(newStyles[id] = {id: id, parts: [part]});
else
newStyles[id].parts.push(part);
}
return styles;
}
function insertStyleElement(options, styleElement) {
var head = getHeadElement();
var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];
if (options.insertAt === "top") {
if(!lastStyleElementInsertedAtTop) {
head.insertBefore(styleElement, head.firstChild);
} else if(lastStyleElementInsertedAtTop.nextSibling) {
head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);
} else {
head.appendChild(styleElement);
}
styleElementsInsertedAtTop.push(styleElement);
} else if (options.insertAt === "bottom") {
head.appendChild(styleElement);
} else {
throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");
}
}
function removeStyleElement(styleElement) {
styleElement.parentNode.removeChild(styleElement);
var idx = styleElementsInsertedAtTop.indexOf(styleElement);
if(idx >= 0) {
styleElementsInsertedAtTop.splice(idx, 1);
}
}
function createStyleElement(options) {
var styleElement = document.createElement("style");
styleElement.type = "text/css";
insertStyleElement(options, styleElement);
return styleElement;
}
function createLinkElement(options) {
var linkElement = document.createElement("link");
linkElement.rel = "stylesheet";
insertStyleElement(options, linkElement);
return linkElement;
}
function addStyle(obj, options) {
var styleElement, update, remove;
if (options.singleton) {
var styleIndex = singletonCounter++;
styleElement = singletonElement || (singletonElement = createStyleElement(options));
update = applyToSingletonTag.bind(null, styleElement, styleIndex, false);
remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true);
} else if(obj.sourceMap &&
typeof URL === "function" &&
typeof URL.createObjectURL === "function" &&
typeof URL.revokeObjectURL === "function" &&
typeof Blob === "function" &&
typeof btoa === "function") {
styleElement = createLinkElement(options);
update = updateLink.bind(null, styleElement);
remove = function() {
removeStyleElement(styleElement);
if(styleElement.href)
URL.revokeObjectURL(styleElement.href);
};
} else {
styleElement = createStyleElement(options);
update = applyToTag.bind(null, styleElement);
remove = function() {
removeStyleElement(styleElement);
};
}
update(obj);
return function updateStyle(newObj) {
if(newObj) {
if(newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap)
return;
update(obj = newObj);
} else {
remove();
}
};
}
var replaceText = (function () {
var textStore = [];
return function (index, replacement) {
textStore[index] = replacement;
return textStore.filter(Boolean).join('\n');
};
})();
function applyToSingletonTag(styleElement, index, remove, obj) {
var css = remove ? "" : obj.css;
if (styleElement.styleSheet) {
styleElement.styleSheet.cssText = replaceText(index, css);
} else {
var cssNode = document.createTextNode(css);
var childNodes = styleElement.childNodes;
if (childNodes[index]) styleElement.removeChild(childNodes[index]);
if (childNodes.length) {
styleElement.insertBefore(cssNode, childNodes[index]);
} else {
styleElement.appendChild(cssNode);
}
}
}
function applyToTag(styleElement, obj) {
var css = obj.css;
var media = obj.media;
if(media) {
styleElement.setAttribute("media", media)
}
if(styleElement.styleSheet) {
styleElement.styleSheet.cssText = css;
} else {
while(styleElement.firstChild) {
styleElement.removeChild(styleElement.firstChild);
}
styleElement.appendChild(document.createTextNode(css));
}
}
function updateLink(linkElement, obj) {
var css = obj.css;
var sourceMap = obj.sourceMap;
if(sourceMap) {
// http://stackoverflow.com/a/26603875
css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
}
var blob = new Blob([css], { type: "text/css" });
var oldSrc = linkElement.href;
linkElement.href = URL.createObjectURL(blob);
if(oldSrc)
URL.revokeObjectURL(oldSrc);
}
/***/ },
/* 6 */
/***/ function(module, exports, __webpack_require__) {
// style-loader: Adds some css to the DOM by adding a <style> tag
// load the styles
var content = __webpack_require__(1);
if(typeof content === 'string') content = [[module.id, content, '']];
// add the styles to the DOM
var update = __webpack_require__(5)(content, {});
if(content.locals) module.exports = content.locals;
// Hot Module Replacement
if(false) {
// When the styles change, update the <style> tags
if(!content.locals) {
module.hot.accept("!!./../../node_modules/css-loader/index.js!./../../node_modules/less-loader/index.js!./tree.less", function() {
var newContent = require("!!./../../node_modules/css-loader/index.js!./../../node_modules/less-loader/index.js!./tree.less");
if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
update(newContent);
});
}
// When the module is disposed, remove the <style> tags
module.hot.dispose(function() { update(); });
}
/***/ },
/* 7 */
/***/ function(module, exports) {
module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAOCAYAAADwikbvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAOw4AAA7DAZBCL/sAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAHZJREFUOE9j+P//Pxiv7HH8jw/D1CFjOAOqACu4srcGqwFEa8ZmAEma0Q3A1JxbgIrRAH7NBABezT3bF8JxfU08WCwrJwlMgwD1bYbZguxXkBjIVmSboepwaCYA8GoGRQeyvy07S8AYBmhnMyGAUzOxGKLnPwMABE2jDc+cnOsAAAAASUVORK5CYII="
/***/ },
/* 8 */
/***/ function(module, exports) {
module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAIhJREFUOE9j+P//P0UYqyApGIVzuN3kPzJGlsOF4Yy1xbpAChVAxVA0oGMwAbbt0TwEvtT8/8GuCjBGdxVYLVYDiAS4DUB2AR48PUoe0wCwX7EoxobRw4U6BszPUAEHHDEYrBbdALC/sCjGhrGGAUgQ7DQsGtAxVgNAGOQ0YjBMPQyjcEjH/xkAhEKsbVNNI1sAAAAASUVORK5CYII="
/***/ },
/* 9 */
/***/ function(module, exports) {
module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAOw4AAA7DAZBCL/sAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAJBJREFUOE9j+P//P0UYqyApGIVzuN3kPzJGlsOF4Yy1xbpAChVAxVA0oGMwAbbt0TwEvtT8/8GuCjBGdxVYLVYDiAS4DUB2AR48PUoe0wCwX9EUgsSIwVgNQOdjxcBwghswP0MFLAAThLHxYbA6mBfA/oIJoinEhmGaUQwgRzPcABAGeYMYDFMPwygc0vF/BgDd66LkDQj2XgAAAABJRU5ErkJggg=="
/***/ },
/* 10 */
/***/ function(module, exports) {
module.exports = "data:image/png;base64,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"
/***/ },
/* 11 */
/***/ function(module, exports) {
module.exports = "data:image/png;base64,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"
/***/ }
/******/ ]);
\ No newline at end of file
{
"directory": "bower_components"
}
\ No newline at end of file
{
"curly": true,
"eqeqeq": true,
"immed": true,
"latedef": true,
"newcap": true,
"noarg": true,
"sub": true,
"boss": true,
"eqnull": true
}
node_modules
bower_components
demo/bower_components
\ No newline at end of file
language: node_js
node_js:
- "0.8"
- "0.10"
before_install:
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
- npm install -g karma bower grunt-cli
- bower install
- npm install
script: "grunt"
CONTRIBUTING
============
* Open a [Pull Request (PR)](https://github.com/angular-ui/ui-select2/pull/new/master)
* Make sure your PR is on a **new branch** you created off of the latest version of master
* Do **not** open a PR from your master branch
* Open a PR to start a discussion even if the code isn't finished (easier to collect feedback this way)
* Make sure all previous tests pass and add new tests for added behaviors
module.exports = function (grunt) {
'use strict';
var initConfig;
// Loading external tasks
require('load-grunt-tasks')(grunt);
// Project configuration.
initConfig = {
bower: 'bower_components',
pkg: grunt.file.readJSON('package.json'),
watch: {
test: {
// Lint & run unit tests in Karma
// Just running `$ grunt watch` will only lint your code; to run tests
// on watch, use `$ grunt watch:karma` to start a Karma server first
files: ['src/select2.js', 'test/select2Spec.js'],
tasks: ['jshint', 'karma:unit:run']
}
},
karma: {
options: {
configFile: 'test/karma.conf.js',
browsers: ['Firefox', 'PhantomJS']
},
unit: {
singleRun: true
},
watch: {
autoWatch: true
},
server: {
background: true
}
},
jshint: {
all:[
'gruntFile.js',
'src/**/*.js',
'test/**/*Spec.js'
],
options: {
jshintrc: '.jshintrc'
}
},
changelog: {
options: {
dest: 'CHANGELOG.md'
}
}
};
// Register tasks
grunt.registerTask('default', ['jshint', 'karma:unit']);
grunt.registerTask('watch', ['jshint', 'karma:watch']);
grunt.initConfig(initConfig);
};
The MIT License
Copyright (c) 2012 the AngularUI Team, http://angular-ui.github.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
ui-select2 [![Build Status](https://travis-ci.org/angular-ui/ui-select2.png)](https://travis-ci.org/angular-ui/ui-select2)
==========
This directive allows you to enhance your select elements with behaviour from the [select2](http://ivaynberg.github.io/select2/) library.
# Requirements
- [AngularJS](http://angularjs.org/)
- [JQuery](http://jquery.com/)
- [Select2](http://ivaynberg.github.io/select2/)
## Setup
1. Install **Karma**, **Grunt** and **Bower**
`$ npm install -g karma grunt-cli bower`
2. Install development dependencies
`$ npm install`
3. Install components
`$ bower install`
4. ???
5. Profit!
## Testing
We use [Grunt](http://gruntjs.com/) to check for JavaScript syntax errors and execute all unit tests. To run Grunt, simply execute:
`$ grunt`
This will lint and test the code, then exit. To have Grunt stay open and automatically lint and test your files whenever you make a code change, use:
`$ grunt karma:server watch`
This will start a Karma server in the background and run unit tests in Firefox and PhantomJS whenever the source code or spec file is saved.
# Usage
We use [bower](https://github.com/bower/bower) for dependency management. Install AngularUI Select2 into your project by running the command
`$ bower install angular-ui-select2`
If you use a `bower.json` file in your project, you can have Bower save ui-select2 as a dependency by passing the `--save` or `--save-dev` flag with the above command.
This will copy the ui-select2 files into your `bower_components` folder, along with its dependencies. Load the script files in your application:
```html
<link rel="stylesheet" href="bower_components/select2/select2.css">
<script type="text/javascript" src="bower_components/jquery/jquery.js"></script>
<script type="text/javascript" src="bower_components/select2/select2.js"></script>
<script type="text/javascript" src="bower_components/angular/angular.js"></script>
<script type="text/javascript" src="bower_components/angular-ui-select2/src/select2.js"></script>
```
(Note that `jquery` must be loaded before `angular` so that it doesn't use `jqLite` internally)
Add the select2 module as a dependency to your application module:
```javascript
var myAppModule = angular.module('MyApp', ['ui.select2']);
```
Apply the directive to your form elements:
```html
<select ui-select2 ng-model="select2" data-placeholder="Pick a number">
<option value=""></option>
<option value="one">First</option>
<option value="two">Second</option>
<option value="three">Third</option>
</select>
```
## Options
All the select2 options can be passed through the directive. You can read more about the supported list of options and what they do on the [Select2 Documentation Page](http://ivaynberg.github.com/select2/)
```javascript
myAppModule.controller('MyController', function($scope) {
$scope.select2Options = {
allowClear:true
};
});
```
```html
<select ui-select2="select2Options" ng-model="select2">
<option value="one">First</option>
<option value="two">Second</option>
<option value="three">Third</option>
</select>
```
Some times it may make sense to specify the options in the template file.
```html
<select ui-select2="{ allowClear: true}" ng-model="select2">
<option value="one">First</option>
<option value="two">Second</option>
<option value="three">Third</option>
</select>
```
To define global defaults, you can configure the `uiSelect2Config` injectable:
```javascript
myAppModule.run(['uiSelect2Config', function(uiSelect2Config) {
uiSelect2Config.placeholder = "Placeholder text";
}]);
```
## Working with ng-model
The ui-select2 directive plays nicely with ng-model and validation directives such as ng-required.
If you add the ng-model directive to same the element as ui-select2 then the picked option is automatically synchronized with the model value.
## Working with dynamic options
`ui-select2` is incompatible with `<select ng-options>`. For the best results use `<option ng-repeat>` instead.
```html
<select ui-select2 ng-model="select2" data-placeholder="Pick a number">
<option value=""></option>
<option ng-repeat="number in range" value="{{number.value}}">{{number.text}}</option>
</select>
```
## Working with placeholder text
In order to properly support the Select2 placeholder, create an empty `<option>` tag at the top of the `<select>` and either set a `data-placeholder` on the select element or pass a `placeholder` option to Select2.
```html
<select ui-select2 ng-model="number" data-placeholder="Pick a number">
<option value=""></option>
<option value="one">First</option>
<option value="two">Second</option>
<option value="three">Third</option>
</select>
```
## ng-required directive
If you apply the required directive to element then the form element is invalid until an option is selected.
Note: Remember that the ng-required directive must be explicitly set, i.e. to "true". This is especially true on divs:
```html
<select ui-select2 ng-model="number" data-placeholder="Pick a number" ng-required="true">
<option value=""></option>
<option value="one">First</option>
<option value="two">Second</option>
<option value="three">Third</option>
</select>
```
## Using simple tagging mode
When AngularJS View-Model tags are stored as a list of strings, setting
the ui-select2 specific option `simple_tags` will allow to keep the model
as a list of strings, and not convert it into a list of Select2 tag objects.
```html
<input
type="hidden"
ui-select2="select2Options"
ng-model="list_of_string"
>
```
```javascript
myAppModule.controller('MyController', function($scope) {
$scope.list_of_string = ['tag1', 'tag2']
$scope.select2Options = {
'multiple': true,
'simple_tags': true,
'tags': ['tag1', 'tag2', 'tag3', 'tag4'] // Can be empty list.
};
});
```
{
"author": "AngularUI",
"name": "angular-ui-select2",
"version": "0.0.5",
"homepage": "http://angular-ui.github.com",
"keywords": [
"angular",
"angularui",
"select2"
],
"main": "./src/select2.js",
"dependencies": {
"angular": ">=1.2.0",
"select2": "~3.4",
"jquery": ">=1.6.4"
},
"devDependencies": {
"angular-mocks": ">=1.0.2"
}
}
var app = angular.module('angular-ui-select2-demo', ['ui.select2']);
app.controller('MainCtrl', function ($scope, $element) {
var states = [
{ text: 'Alaskan/Hawaiian Time Zone', children: [
{ id: 'AK', text: 'Alaska' },
{ id: 'HI', text: 'Hawaii' }
]},
{ text: 'Pacific Time Zone', children: [
{ id: 'CA', text: 'California' },
{ id: 'NV', text: 'Nevada' },
{ id: 'OR', text: 'Oregon' },
{ id: 'WA', text: 'Washington' }
]},
{ text: 'Mountain Time Zone', children: [
{ id: 'AZ', text: 'Arizona' },
{ id: 'CO', text: 'Colorado' },
{ id: 'ID', text: 'Idaho' },
{ id: 'MT', text: 'Montana' },
{ id: 'NE', text: 'Nebraska' },
{ id: 'NM', text: 'New Mexico' },
{ id: 'ND', text: 'North Dakota' },
{ id: 'UT', text: 'Utah' },
{ id: 'WY', text: 'Wyoming' }
]},
{ text: 'Central Time Zone', children: [
{ id: 'AL', text: 'Alabama' },
{ id: 'AR', text: 'Arkansas' },
{ id: 'IL', text: 'Illinois' },
{ id: 'IA', text: 'Iowa' },
{ id: 'KS', text: 'Kansas' },
{ id: 'KY', text: 'Kentucky' },
{ id: 'LA', text: 'Louisiana' },
{ id: 'MN', text: 'Minnesota' },
{ id: 'MS', text: 'Mississippi' },
{ id: 'MO', text: 'Missouri' },
{ id: 'OK', text: 'Oklahoma' },
{ id: 'SD', text: 'South Dakota' },
{ id: 'TX', text: 'Texas' },
{ id: 'TN', text: 'Tennessee' },
{ id: 'WI', text: 'Wisconsin' }
]},
{ text: 'Eastern Time Zone', children: [
{ id: 'CT', text: 'Connecticut' },
{ id: 'DE', text: 'Delaware' },
{ id: 'FL', text: 'Florida' },
{ id: 'GA', text: 'Georgia' },
{ id: 'IN', text: 'Indiana' },
{ id: 'ME', text: 'Maine' },
{ id: 'MD', text: 'Maryland' },
{ id: 'MA', text: 'Massachusetts' },
{ id: 'MI', text: 'Michigan' },
{ id: 'NH', text: 'New Hampshire' },
{ id: 'NJ', text: 'New Jersey' },
{ id: 'NY', text: 'New York' },
{ id: 'NC', text: 'North Carolina' },
{ id: 'OH', text: 'Ohio' },
{ id: 'PA', text: 'Pennsylvania' },
{ id: 'RI', text: 'Rhode Island' },
{ id: 'SC', text: 'South Carolina' },
{ id: 'VT', text: 'Vermont' },
{ id: 'VA', text: 'Virginia' },
{ id: 'WV', text: 'West Virginia' }
]}
];
function findState(id) {
for (var i=0; i<states.length; i++) {
for (var j=0; j<states[i].children.length; j++) {
if (states[i].children[j].id == id) {
return states[i].children[j];
}
}
}
}
$scope.multi2Value = ['CO', 'WA'];
$scope.multi = {
multiple: true,
query: function (query) {
query.callback({ results: states });
},
initSelection: function(element, callback) {
var val = $(element).select2('val'),
results = [];
for (var i=0; i<val.length; i++) {
results.push(findState(val[i]));
}
callback(results);
}
};
$scope.placeholders = {
placeholder: "Select a State"
};
$scope.array = {
data: [{id:0,text:'enhancement'},{id:1,text:'bug'},{id:2,text:'duplicate'},{id:3,text:'invalid'},{id:4,text:'wontfix'}]
};
$scope.arrayAsync = {
query: function (query) {
query.callback({ results: states });
},
initSelection: function(element, callback) {
var val = $(element).select2('val');
return callback(findState(val));
}
};
});