Compare commits
No commits in common. "ddebf832ee1ac332b7f33e027c98d2f60b4511cf" and "2cc0721b952b7144a6e6dc91e163f3b177cc85e5" have entirely different histories.
ddebf832ee
...
2cc0721b95
|
@ -1 +0,0 @@
|
||||||
frontend/vendor
|
|
22
README.md
22
README.md
|
@ -1,22 +0,0 @@
|
||||||
# Objective
|
|
||||||
|
|
||||||
I want to learn the following technologies:
|
|
||||||
|
|
||||||
* [Bower](http://bower.io)
|
|
||||||
* [AngularJS](http://angularjs.org)
|
|
||||||
|
|
||||||
Later:
|
|
||||||
|
|
||||||
* [Go](http://golang.org)
|
|
||||||
* [Grunt](http://gruntjs.com)
|
|
||||||
* [Sass](http://sass-lang.com)
|
|
||||||
* [Slim Framework](http://www.slimframework.com/)
|
|
||||||
* [W3.CSS](http://www.w3schools.com/w3css/) / [Bootstrap](http://getbootstrap.com)
|
|
||||||
|
|
||||||
This repository is used to keep track of the progress.
|
|
||||||
|
|
||||||
# Tutorials
|
|
||||||
|
|
||||||
* [AngularJS Tutorial Step 0](https://docs.angularjs.org/tutorial/step_00)
|
|
||||||
* [Managing Frontend Dependencies & Deployment Part 1: Bower](https://blog.engineyard.com/2014/frontend-dependencies-management-part-1)
|
|
||||||
* [Node, Grunt, Bower and Yeoman -- A Modern web dev's Toolkit](http://juristr.com/blog/2014/08/node-grunt-yeoman-bower/)
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
angular.module('MyApp')
|
||||||
|
|
||||||
|
.directive('edit', function ($parse) {
|
||||||
|
var directive = {}
|
||||||
|
|
||||||
|
directive.scope = true
|
||||||
|
directive.link = function (scope, element, attrs) {
|
||||||
|
scope.editor = {}
|
||||||
|
scope.item = {}
|
||||||
|
|
||||||
|
var callback = function (item) {}
|
||||||
|
var model = $parse(attrs.edit)
|
||||||
|
var editor = scope.editor
|
||||||
|
|
||||||
|
if (attrs.callback != null)
|
||||||
|
callback = $parse(attrs.callback)(scope)
|
||||||
|
|
||||||
|
editor.save = function () {
|
||||||
|
var data = model(scope)
|
||||||
|
callback(scope.item)
|
||||||
|
data[editor.key] = scope.item
|
||||||
|
editor.key = null
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.revert = function () {
|
||||||
|
editor.key = null
|
||||||
|
}
|
||||||
|
|
||||||
|
scope.$watch('editor.key', function (value) {
|
||||||
|
if (value == null) {
|
||||||
|
scope.item = {}
|
||||||
|
} else {
|
||||||
|
var data = model(scope)
|
||||||
|
scope.item = angular.copy(data[value] || {})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return directive
|
||||||
|
})
|
|
@ -0,0 +1,30 @@
|
||||||
|
angular.module('MyApp', [])
|
||||||
|
|
||||||
|
.controller('Demo', function ($scope) {
|
||||||
|
$scope.string1 = "Hello"
|
||||||
|
$scope.string2 = "World"
|
||||||
|
|
||||||
|
$scope.pagination = { limit: 5 }
|
||||||
|
|
||||||
|
$scope.demodata = [
|
||||||
|
{ Name: "Answer", Number: 42 },
|
||||||
|
{ Name: "Trek", Number: 47 },
|
||||||
|
{ Name: "Eight", Number: 8 },
|
||||||
|
]
|
||||||
|
|
||||||
|
$scope.moredata = []
|
||||||
|
|
||||||
|
$scope.remove = function (editor, array, index) {
|
||||||
|
array.splice(index, 1)
|
||||||
|
editor.key = null
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.log = function (x) {
|
||||||
|
console.log(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < 100; i++) {
|
||||||
|
var x = Math.random().toString().substr(2, 8)
|
||||||
|
$scope.moredata.push({ Name: x, Number: x })
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,115 @@
|
||||||
|
angular.module('MyApp')
|
||||||
|
|
||||||
|
.directive('pagination', function ($parse) {
|
||||||
|
var util = {}
|
||||||
|
var directive = {}
|
||||||
|
|
||||||
|
directive.restrict = 'A'
|
||||||
|
directive.scope = true
|
||||||
|
directive.link = function (scope, element, attrs) {
|
||||||
|
scope.pages = []
|
||||||
|
if (scope.pagination == null)
|
||||||
|
scope.pagination = {}
|
||||||
|
|
||||||
|
var params = scope.pagination
|
||||||
|
|
||||||
|
if (params.page == null)
|
||||||
|
params.page = util.init.page
|
||||||
|
if (params.limit == null)
|
||||||
|
params.limit = util.init.limit
|
||||||
|
if (params.buttons == null)
|
||||||
|
params.buttons = util.init.buttons
|
||||||
|
|
||||||
|
var recalc = function() {
|
||||||
|
scope.pages = util.calculate(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
scope.$watch('pagination.total', recalc);
|
||||||
|
scope.$watch('pagination.page', recalc);
|
||||||
|
scope.$watch('pagination.limit', recalc);
|
||||||
|
}
|
||||||
|
|
||||||
|
util.init = {
|
||||||
|
page: 1,
|
||||||
|
limit: 10,
|
||||||
|
buttons: [
|
||||||
|
// Arrow indices
|
||||||
|
{pos: 'arrows', current: 4, prev: 3, next: 5},
|
||||||
|
{pos: 4, diff: 0},
|
||||||
|
{pos: 5, diff: 1},
|
||||||
|
{pos: 6, diff: 2},
|
||||||
|
{pos: 7, diff: 5},
|
||||||
|
{pos: 8, diff: 'max'},
|
||||||
|
{pos: 3, diff: -1},
|
||||||
|
{pos: 2, diff: -2},
|
||||||
|
{pos: 1, diff: -5},
|
||||||
|
{pos: 0, diff: 'min'},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
util.clamp = function (x, min, max) {
|
||||||
|
if (x < min) return min;
|
||||||
|
if (x > max) return max;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
util.calculate = function (params) {
|
||||||
|
var result = [];
|
||||||
|
var pos = [];
|
||||||
|
|
||||||
|
params.buttons.forEach(function (button) {
|
||||||
|
if (button.pos === 'arrows') {
|
||||||
|
result.current = button.current
|
||||||
|
result.prev = button.prev
|
||||||
|
result.next = button.next
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var page = 0
|
||||||
|
|
||||||
|
if (button.diff === 'min')
|
||||||
|
page = params.min
|
||||||
|
else if (button.diff === 'max')
|
||||||
|
page = params.max
|
||||||
|
else
|
||||||
|
page = util.clamp(params.page + button.diff, params.min, params.max)
|
||||||
|
|
||||||
|
if (pos.indexOf(page) !== -1)
|
||||||
|
page = 'hide'
|
||||||
|
|
||||||
|
pos.push(page)
|
||||||
|
result[button.pos] = page
|
||||||
|
})
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return directive
|
||||||
|
})
|
||||||
|
|
||||||
|
.filter('paginate', function() {
|
||||||
|
return function(data, params) {
|
||||||
|
var result = data
|
||||||
|
var start = 0
|
||||||
|
|
||||||
|
var limit = params.limit
|
||||||
|
var page = params.page
|
||||||
|
|
||||||
|
var max = Math.max(1, Math.ceil(data.length / limit))
|
||||||
|
var page = Math.min(page, max)
|
||||||
|
|
||||||
|
if (limit !== -1) {
|
||||||
|
start = (page - 1) * limit
|
||||||
|
result = data.slice(start, start + limit)
|
||||||
|
}
|
||||||
|
|
||||||
|
params.total = data.length
|
||||||
|
params.start = start + 1
|
||||||
|
params.end = start + result.length
|
||||||
|
params.page = page
|
||||||
|
params.min = 1
|
||||||
|
params.max = max
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
})
|
|
@ -0,0 +1,53 @@
|
||||||
|
angular.module('MyApp')
|
||||||
|
|
||||||
|
.directive('subScope', ['subScopeUtils', function (util) {
|
||||||
|
var directive = util.directive()
|
||||||
|
|
||||||
|
directive.link = function (scope, element, attrs, controller, transclude) {
|
||||||
|
var key = attrs.subScope
|
||||||
|
var model = util.model(key)
|
||||||
|
|
||||||
|
scope.$watch('string', function(value) {
|
||||||
|
if (value.indexOf('Got in:') === 0)
|
||||||
|
return // prevent infinite calls
|
||||||
|
model.assign(scope.$parent, 'Got out: ' + value)
|
||||||
|
})
|
||||||
|
|
||||||
|
scope.$parent.$watch(key, function(value) {
|
||||||
|
if (value.indexOf('Got out:') === 0)
|
||||||
|
return // prevent infinite calls
|
||||||
|
scope.string = 'Got in: ' + value
|
||||||
|
})
|
||||||
|
|
||||||
|
util.transcluder(scope, element, transclude)
|
||||||
|
}
|
||||||
|
|
||||||
|
return directive
|
||||||
|
}])
|
||||||
|
|
||||||
|
.factory('subScopeUtils', function ($parse) {
|
||||||
|
var util = {}
|
||||||
|
|
||||||
|
util.model = function (expression) {
|
||||||
|
return $parse(expression)
|
||||||
|
}
|
||||||
|
|
||||||
|
util.directive = function () {
|
||||||
|
var result = {}
|
||||||
|
result.scope = true
|
||||||
|
result.transclude = true
|
||||||
|
result.template = '<input style="color: red" ng-model="string">'
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
util.transcluder = function (scope, element, transclude) {
|
||||||
|
var cloneLinker = function (clone) {
|
||||||
|
if (clone.length !== 0) // If transcluded element is non-empty,
|
||||||
|
element.empty() // Remove already appended template
|
||||||
|
element.append(clone)
|
||||||
|
}
|
||||||
|
transclude(scope, cloneLinker)
|
||||||
|
}
|
||||||
|
|
||||||
|
return util
|
||||||
|
})
|
|
@ -0,0 +1,87 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Angular Tests</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body ng-app="MyApp" ng-controller="Demo">
|
||||||
|
|
||||||
|
<h1>Scoping</h1>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div style="background:#eee">
|
||||||
|
<input ng-model="string1"><br>
|
||||||
|
<input ng-model="string2">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div sub-scope="string1">
|
||||||
|
<input style="color: blue" ng-model="string">
|
||||||
|
Scope {{ ok }} (Scope ok)
|
||||||
|
</div>
|
||||||
|
<div sub-scope="string2"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1>Editor</h1>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<button ng-click="log(demodata)">Print</button>
|
||||||
|
|
||||||
|
<table edit="demodata" callback="log">
|
||||||
|
<thead>
|
||||||
|
<th><button ng-click="editor.key = demodata.length">➕ New</button></th>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr ng-repeat-start="row in demodata">
|
||||||
|
<td><button ng-click="editor.key = $index">✏</button></td>
|
||||||
|
<td><button ng-click="remove(editor, demodata, $index)">🚫</button></td>
|
||||||
|
<td colspan="2">{{ row.Name }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr ng-repeat-end ng-if="editor.key === $index || $last && editor.key === $index + 1">
|
||||||
|
<td><button ng-click="editor.save()">✔️</button></td>
|
||||||
|
<td><button ng-click="editor.revert()">❌</button></td>
|
||||||
|
<td><input ng-model="item.Name"></td>
|
||||||
|
<td><input ng-model="item.Number"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1>Pagination</h1>
|
||||||
|
|
||||||
|
<div pagination>
|
||||||
|
<style>
|
||||||
|
.pagination button { width: 40px; }
|
||||||
|
.pagination .disabled { color: gray; }
|
||||||
|
.pagination .current { font-weight: bold; color: green; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<button ng-click="log(pages)">Print</button>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Number</th>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr ng-repeat="row in moredata | paginate: pagination">
|
||||||
|
<td>{{ row.Name }}</td>
|
||||||
|
<td>{{ row.Number }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<span class="pagination" ng-repeat="p in pages track by $index">
|
||||||
|
<button ng-class="{disabled: p === 'hide', current: $index === pages.current}" ng-click="pagination.page = p">{{ p }}</button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.12/angular.min.js"></script>
|
||||||
|
<script src="assets/js/MyApp.js"></script>
|
||||||
|
<script src="assets/js/SubScopeDirective.js"></script>
|
||||||
|
<script src="assets/js/EditorDirective.js"></script>
|
||||||
|
<script src="assets/js/PaginationDirective.js"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
"directory": "../frontend/vendor"
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
{
|
|
||||||
"name": "learn"
|
|
||||||
, "description": "Learn some stuff"
|
|
||||||
, "version": "0.0.0"
|
|
||||||
, "dependencies": {
|
|
||||||
"angular": "~1.5"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
.arterop-color-1 { background-color: #f81; }
|
|
||||||
.arterop-color-2 { background-color: #f42; }
|
|
||||||
.arterop-color-3 { background-color: #e22; }
|
|
||||||
.arterop-color-4 { background-color: #b23; }
|
|
||||||
.arterop-color-5 { background-color: #e08; }
|
|
||||||
.arterop-color-6 { background-color: #916; }
|
|
||||||
.arterop-gray { background-color: #666; }
|
|
|
@ -1,13 +0,0 @@
|
||||||
<!doctype html>
|
|
||||||
<html lang="en" ng-app>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>Angular tutorial</title>
|
|
||||||
<script src="vendor/angular/angular.min.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<p>Nothing here {{'yet' + '!'}}</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
Loading…
Reference in New Issue