Skip to content
This repository was archived by the owner on Sep 8, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 93 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,6 +100,7 @@ Default: `false`

Like `disableToggle` above but only removes the arrows on mobile devices (max-device-width: 480px).


## Child Attributes

### uiLayoutContainer
Expand All@@ -113,6 +114,39 @@ Required on all child elements of the ui-layout element.
</div>
```

### Options
A string value `'central'` can be passed to the directive:
```xml
<div ui-layout>
<div ui-layout-container></div>
<div ui-layout-container="central"></div>
<div ui-layout-container></div>
</div>
```

The `'central'` container takes up all the remaining space during resizing, regardless of previous state, e.g. after splitbar drag.

### collapsed [collapsed]
Type: `boolean`

```xml
<div ui-layout>
<div ui-layout-container collapsed="true"></div>
<div ui-layout-container collapsed="layout.mycontainer"></div>
</div>
```

Controls collapsed state of the container. Application can store the state of the layout e.g. like so:
```javascript
$scope.layout {
toolbar: true,
leftSidebar: false,
mycontainer: false
}
```

Changing those values will toggle container. See also [`ui.layout.toggle`][event-toggle].

### size
Type: `String`

Expand DownExpand Up@@ -171,9 +205,63 @@ percentage

Events are broadcast on the scope where ui-layout is attached. This means they are available to any controller inside of a ui-layout container.

### ui.layout.toggle
### ui.layout.loaded
Returns: `string` or `null`


Dispatched when the layout container finished loading. It returns the value of the attribute, e.g. `ui-layout-loaded="my-loaded-message"`, or `null`. The `null` also means that the layout has finished collapsing all the containers that should be collapsed (per application request when setting the [`collapsed`][collapsed] attribute).

Dispatched when a container is opened or closed using the chevron buttons.
Collapsing container on application load currently goes through these steps:
1. layout is first loaded with all containers uncollapsed (disregarding user set values), then
2. containers are collapsed either:
- _automatically_: application has not set a string return value for the `ui.layout.loaded` event.
- _manually_: application sets collapsed flags in the callback passed to `ui.layout.loaded`

All this means that the user will notice a flicker. If the flicker is not desirable, hide the layout behind an overlay, wait for the `ui.layout.loaded` event. In the "automatic" mode, all is done and the layout should be presentable. In the "manual" mode it is up to the application to count the `ui.layout.toggle` events.



```xml
<div id="main-container" ui-layout ui-layout-loaded>
<div ui-layout-container>
<div ui-layout ui-layout-loaded="child-container">
<div ui-layout-container>

</div>
</div>
</div>
</div>
```

```javascript
$scope.$on('ui.layout.loaded', function(evt, id) => {
switch (id) {
case 'main-container':
...
break;
case 'child-container':
...
break;
default:
break;
}
});
```

Note: the value of the attribute is not evaluated, so:

```
$scope.layout = {
mySidebar: {someKey: 'some value'}
}

<div id='my-sidebar' ui-layout ui-layout-loaded="layout.mySidebar.someKey"></div>
// $scope.$on will receive the string 'layout.mySidebar.someKey'
```

### ui.layout.toggle [event-toggle]

Dispatched when a container is opened or closed. Element can be identified `container.id`, which is the same as `element.id` if provided, otherwise it is `null`.

```javascript
$scope.$on('ui.layout.toggle', function(e, container){
Expand All@@ -183,6 +271,9 @@ $scope.$on('ui.layout.toggle', function(e, container){
});
```

Manually toggling (clicking the arrow button on the splitbar) will not update the `collapsed` attribute.
If the application is using the `collapsed` attribute of `ui-layout-container` to programmatically control the collapsed state, the application should update it's state when this event occurs to stay in sync with the UI.

### ui.layout.resize

Dispatched as a splitbar is dragged, debounced to occur only every 50ms.
Expand Down
55 changes: 46 additions & 9 deletions demo/demo2.html
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,10 +4,10 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title></title>
<title>Angular UI Layout Demo 2</title>

<!-- Le css -->
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!--<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" type="text/css" />-->
<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<!-- Le javascript -->
Expand All@@ -16,10 +16,33 @@
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope) {
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};

$scope.layout = {
one: false,
four: false
};

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(){
$timeout(function(){
$scope.layout.one = true;
});
})
});

</script>
Expand All@@ -38,26 +61,40 @@
}
</style>
</head>
<body ng-controller="DemoController">
<div ui-layout="config">
<div ui-layout-container max-size="50%">
<body ng-controller="DemoController">
<div ui-layout="config" ui-layout-loaded>
<div ui-layout-container size="100px" max-size="50%" collapsed="layout.one">
One
<br/>
<button ng-click="updateDisplay()">Update Display</button>
</div>
<div ui-layout-container>Two</div>
<div ui-layout-container>Two
<p>
<button ng-click="toggle('one')">Toggle One</button></br>
<button ng-click="close('one')">Close One</button></br>
<button ng-click="open('one')">Open One</button></br>
</p>

<p>
<button ng-click="toggle('four')">Toggle Four</button></br>
<button ng-click="close('four')">Close Four</button></br>
<button ng-click="open('four')">Open Four</button></br>
</p>
</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three</div>
<div ui-layout-container>Three-One</div>
<div ui-layout-container>
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>

</body>
</html>
123 changes: 123 additions & 0 deletions demo/demo3.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html ng-app="x">
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title>Angular UI Layout Demo 2</title>

<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<script type="application/javascript" src="../bower_components/angular/angular.js"></script>
<script type="application/javascript" src="../src/ui-layout.js"></script>
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};


$scope.layout = {
top: true,
one: true,
four: false
};

$scope.cloak = Object.keys($scope.layout).map(function(k) {return $scope.layout[k]}).includes(true);

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(evt, id){
console.error('loaded', typeof id, id)
if (id === null) {
$timeout(function(){
$scope.cloak = false;
}, 500)
} else {
$timeout(function(){
$scope.layout.one = true;
$scope.layout.top = true;
});
}

});

$scope.$on('ui.layout.toggle', function(){
console.error("toggle", new Date())
})
});

</script>
<style>
.red {
background-color: red;
}
.green {
background-color: green;
}
.ui-splitbar {
background-color: red;
}
.ui-layout-container {
background-color: rgba(255, 175, 89, 0.23);
}

.cloak {
position: absolute;
top: 0;
bottom:0;
left: 0;
right: 0;
z-index: 10;
background-color: cornflowerblue;
}

</style>
</head>
<body ng-controller="DemoController" >
<div class="cloak" ng-if="cloak"></div>
<div ui-layout="{flow: 'row'}" ui-layout-loaded>
<div id="top" ui-layout-container collapsed="layout.top" size="50px">TOP</div>
<div ui-layout-container>
<div ui-layout="config" >
<div id="one" ui-layout-container size="100px" max-size="50%" min-size="100px" collapsed="layout.one">
<div ui-layout="{flow: 'row'}">
<div ui-layout-container>One-One</div>
<div ui-layout-container>One-Two</div>
<div ui-layout-container>One-Three</div>
</div>
</div>
<div ui-layout-container>Two

</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three-One one={{ layout.one }}, top={{ layout.top }}</div>
<div ui-layout-container min-size="50px">
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>
</div>
</div>

</body>
</html>
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat: Programmatically toggle containers by petrsimon · Pull Request #154 · angular-ui/ui-layout · GitHub
Skip to content
This repository was archived by the owner on Sep 8, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 93 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,6 +100,7 @@ Default: `false`

Like `disableToggle` above but only removes the arrows on mobile devices (max-device-width: 480px).


## Child Attributes

### uiLayoutContainer
Expand All@@ -113,6 +114,39 @@ Required on all child elements of the ui-layout element.
</div>
```

### Options
A string value `'central'` can be passed to the directive:
```xml
<div ui-layout>
<div ui-layout-container></div>
<div ui-layout-container="central"></div>
<div ui-layout-container></div>
</div>
```

The `'central'` container takes up all the remaining space during resizing, regardless of previous state, e.g. after splitbar drag.

### collapsed [collapsed]
Type: `boolean`

```xml
<div ui-layout>
<div ui-layout-container collapsed="true"></div>
<div ui-layout-container collapsed="layout.mycontainer"></div>
</div>
```

Controls collapsed state of the container. Application can store the state of the layout e.g. like so:
```javascript
$scope.layout {
toolbar: true,
leftSidebar: false,
mycontainer: false
}
```

Changing those values will toggle container. See also [`ui.layout.toggle`][event-toggle].

### size
Type: `String`

Expand DownExpand Up@@ -171,9 +205,63 @@ percentage

Events are broadcast on the scope where ui-layout is attached. This means they are available to any controller inside of a ui-layout container.

### ui.layout.toggle
### ui.layout.loaded
Returns: `string` or `null`


Dispatched when the layout container finished loading. It returns the value of the attribute, e.g. `ui-layout-loaded="my-loaded-message"`, or `null`. The `null` also means that the layout has finished collapsing all the containers that should be collapsed (per application request when setting the [`collapsed`][collapsed] attribute).

Dispatched when a container is opened or closed using the chevron buttons.
Collapsing container on application load currently goes through these steps:
1. layout is first loaded with all containers uncollapsed (disregarding user set values), then
2. containers are collapsed either:
- _automatically_: application has not set a string return value for the `ui.layout.loaded` event.
- _manually_: application sets collapsed flags in the callback passed to `ui.layout.loaded`

All this means that the user will notice a flicker. If the flicker is not desirable, hide the layout behind an overlay, wait for the `ui.layout.loaded` event. In the "automatic" mode, all is done and the layout should be presentable. In the "manual" mode it is up to the application to count the `ui.layout.toggle` events.



```xml
<div id="main-container" ui-layout ui-layout-loaded>
<div ui-layout-container>
<div ui-layout ui-layout-loaded="child-container">
<div ui-layout-container>

</div>
</div>
</div>
</div>
```

```javascript
$scope.$on('ui.layout.loaded', function(evt, id) => {
switch (id) {
case 'main-container':
...
break;
case 'child-container':
...
break;
default:
break;
}
});
```

Note: the value of the attribute is not evaluated, so:

```
$scope.layout = {
mySidebar: {someKey: 'some value'}
}

<div id='my-sidebar' ui-layout ui-layout-loaded="layout.mySidebar.someKey"></div>
// $scope.$on will receive the string 'layout.mySidebar.someKey'
```

### ui.layout.toggle [event-toggle]

Dispatched when a container is opened or closed. Element can be identified `container.id`, which is the same as `element.id` if provided, otherwise it is `null`.

```javascript
$scope.$on('ui.layout.toggle', function(e, container){
Expand All@@ -183,6 +271,9 @@ $scope.$on('ui.layout.toggle', function(e, container){
});
```

Manually toggling (clicking the arrow button on the splitbar) will not update the `collapsed` attribute.
If the application is using the `collapsed` attribute of `ui-layout-container` to programmatically control the collapsed state, the application should update it's state when this event occurs to stay in sync with the UI.

### ui.layout.resize

Dispatched as a splitbar is dragged, debounced to occur only every 50ms.
Expand Down
55 changes: 46 additions & 9 deletions demo/demo2.html
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,10 +4,10 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title></title>
<title>Angular UI Layout Demo 2</title>

<!-- Le css -->
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!--<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" type="text/css" />-->
<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<!-- Le javascript -->
Expand All@@ -16,10 +16,33 @@
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope) {
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};

$scope.layout = {
one: false,
four: false
};

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(){
$timeout(function(){
$scope.layout.one = true;
});
})
});

</script>
Expand All@@ -38,26 +61,40 @@
}
</style>
</head>
<body ng-controller="DemoController">
<div ui-layout="config">
<div ui-layout-container max-size="50%">
<body ng-controller="DemoController">
<div ui-layout="config" ui-layout-loaded>
<div ui-layout-container size="100px" max-size="50%" collapsed="layout.one">
One
<br/>
<button ng-click="updateDisplay()">Update Display</button>
</div>
<div ui-layout-container>Two</div>
<div ui-layout-container>Two
<p>
<button ng-click="toggle('one')">Toggle One</button></br>
<button ng-click="close('one')">Close One</button></br>
<button ng-click="open('one')">Open One</button></br>
</p>

<p>
<button ng-click="toggle('four')">Toggle Four</button></br>
<button ng-click="close('four')">Close Four</button></br>
<button ng-click="open('four')">Open Four</button></br>
</p>
</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three</div>
<div ui-layout-container>Three-One</div>
<div ui-layout-container>
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>

</body>
</html>
123 changes: 123 additions & 0 deletions demo/demo3.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html ng-app="x">
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title>Angular UI Layout Demo 2</title>

<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<script type="application/javascript" src="../bower_components/angular/angular.js"></script>
<script type="application/javascript" src="../src/ui-layout.js"></script>
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};


$scope.layout = {
top: true,
one: true,
four: false
};

$scope.cloak = Object.keys($scope.layout).map(function(k) {return $scope.layout[k]}).includes(true);

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(evt, id){
console.error('loaded', typeof id, id)
if (id === null) {
$timeout(function(){
$scope.cloak = false;
}, 500)
} else {
$timeout(function(){
$scope.layout.one = true;
$scope.layout.top = true;
});
}

});

$scope.$on('ui.layout.toggle', function(){
console.error("toggle", new Date())
})
});

</script>
<style>
.red {
background-color: red;
}
.green {
background-color: green;
}
.ui-splitbar {
background-color: red;
}
.ui-layout-container {
background-color: rgba(255, 175, 89, 0.23);
}

.cloak {
position: absolute;
top: 0;
bottom:0;
left: 0;
right: 0;
z-index: 10;
background-color: cornflowerblue;
}

</style>
</head>
<body ng-controller="DemoController" >
<div class="cloak" ng-if="cloak"></div>
<div ui-layout="{flow: 'row'}" ui-layout-loaded>
<div id="top" ui-layout-container collapsed="layout.top" size="50px">TOP</div>
<div ui-layout-container>
<div ui-layout="config" >
<div id="one" ui-layout-container size="100px" max-size="50%" min-size="100px" collapsed="layout.one">
<div ui-layout="{flow: 'row'}">
<div ui-layout-container>One-One</div>
<div ui-layout-container>One-Two</div>
<div ui-layout-container>One-Three</div>
</div>
</div>
<div ui-layout-container>Two

</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three-One one={{ layout.one }}, top={{ layout.top }}</div>
<div ui-layout-container min-size="50px">
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>
</div>
</div>

</body>
</html>
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: Programmatically toggle containers by petrsimon · Pull Request #154 · angular-ui/ui-layout · GitHub
Skip to content
This repository was archived by the owner on Sep 8, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 93 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,6 +100,7 @@ Default: `false`

Like `disableToggle` above but only removes the arrows on mobile devices (max-device-width: 480px).


## Child Attributes

### uiLayoutContainer
Expand All@@ -113,6 +114,39 @@ Required on all child elements of the ui-layout element.
</div>
```

### Options
A string value `'central'` can be passed to the directive:
```xml
<div ui-layout>
<div ui-layout-container></div>
<div ui-layout-container="central"></div>
<div ui-layout-container></div>
</div>
```

The `'central'` container takes up all the remaining space during resizing, regardless of previous state, e.g. after splitbar drag.

### collapsed [collapsed]
Type: `boolean`

```xml
<div ui-layout>
<div ui-layout-container collapsed="true"></div>
<div ui-layout-container collapsed="layout.mycontainer"></div>
</div>
```

Controls collapsed state of the container. Application can store the state of the layout e.g. like so:
```javascript
$scope.layout {
toolbar: true,
leftSidebar: false,
mycontainer: false
}
```

Changing those values will toggle container. See also [`ui.layout.toggle`][event-toggle].

### size
Type: `String`

Expand DownExpand Up@@ -171,9 +205,63 @@ percentage

Events are broadcast on the scope where ui-layout is attached. This means they are available to any controller inside of a ui-layout container.

### ui.layout.toggle
### ui.layout.loaded
Returns: `string` or `null`


Dispatched when the layout container finished loading. It returns the value of the attribute, e.g. `ui-layout-loaded="my-loaded-message"`, or `null`. The `null` also means that the layout has finished collapsing all the containers that should be collapsed (per application request when setting the [`collapsed`][collapsed] attribute).

Dispatched when a container is opened or closed using the chevron buttons.
Collapsing container on application load currently goes through these steps:
1. layout is first loaded with all containers uncollapsed (disregarding user set values), then
2. containers are collapsed either:
- _automatically_: application has not set a string return value for the `ui.layout.loaded` event.
- _manually_: application sets collapsed flags in the callback passed to `ui.layout.loaded`

All this means that the user will notice a flicker. If the flicker is not desirable, hide the layout behind an overlay, wait for the `ui.layout.loaded` event. In the "automatic" mode, all is done and the layout should be presentable. In the "manual" mode it is up to the application to count the `ui.layout.toggle` events.



```xml
<div id="main-container" ui-layout ui-layout-loaded>
<div ui-layout-container>
<div ui-layout ui-layout-loaded="child-container">
<div ui-layout-container>

</div>
</div>
</div>
</div>
```

```javascript
$scope.$on('ui.layout.loaded', function(evt, id) => {
switch (id) {
case 'main-container':
...
break;
case 'child-container':
...
break;
default:
break;
}
});
```

Note: the value of the attribute is not evaluated, so:

```
$scope.layout = {
mySidebar: {someKey: 'some value'}
}

<div id='my-sidebar' ui-layout ui-layout-loaded="layout.mySidebar.someKey"></div>
// $scope.$on will receive the string 'layout.mySidebar.someKey'
```

### ui.layout.toggle [event-toggle]

Dispatched when a container is opened or closed. Element can be identified `container.id`, which is the same as `element.id` if provided, otherwise it is `null`.

```javascript
$scope.$on('ui.layout.toggle', function(e, container){
Expand All@@ -183,6 +271,9 @@ $scope.$on('ui.layout.toggle', function(e, container){
});
```

Manually toggling (clicking the arrow button on the splitbar) will not update the `collapsed` attribute.
If the application is using the `collapsed` attribute of `ui-layout-container` to programmatically control the collapsed state, the application should update it's state when this event occurs to stay in sync with the UI.

### ui.layout.resize

Dispatched as a splitbar is dragged, debounced to occur only every 50ms.
Expand Down
55 changes: 46 additions & 9 deletions demo/demo2.html
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,10 +4,10 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title></title>
<title>Angular UI Layout Demo 2</title>

<!-- Le css -->
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!--<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" type="text/css" />-->
<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<!-- Le javascript -->
Expand All@@ -16,10 +16,33 @@
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope) {
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};

$scope.layout = {
one: false,
four: false
};

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(){
$timeout(function(){
$scope.layout.one = true;
});
})
});

</script>
Expand All@@ -38,26 +61,40 @@
}
</style>
</head>
<body ng-controller="DemoController">
<div ui-layout="config">
<div ui-layout-container max-size="50%">
<body ng-controller="DemoController">
<div ui-layout="config" ui-layout-loaded>
<div ui-layout-container size="100px" max-size="50%" collapsed="layout.one">
One
<br/>
<button ng-click="updateDisplay()">Update Display</button>
</div>
<div ui-layout-container>Two</div>
<div ui-layout-container>Two
<p>
<button ng-click="toggle('one')">Toggle One</button></br>
<button ng-click="close('one')">Close One</button></br>
<button ng-click="open('one')">Open One</button></br>
</p>

<p>
<button ng-click="toggle('four')">Toggle Four</button></br>
<button ng-click="close('four')">Close Four</button></br>
<button ng-click="open('four')">Open Four</button></br>
</p>
</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three</div>
<div ui-layout-container>Three-One</div>
<div ui-layout-container>
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>

</body>
</html>
123 changes: 123 additions & 0 deletions demo/demo3.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html ng-app="x">
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title>Angular UI Layout Demo 2</title>

<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<script type="application/javascript" src="../bower_components/angular/angular.js"></script>
<script type="application/javascript" src="../src/ui-layout.js"></script>
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};


$scope.layout = {
top: true,
one: true,
four: false
};

$scope.cloak = Object.keys($scope.layout).map(function(k) {return $scope.layout[k]}).includes(true);

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(evt, id){
console.error('loaded', typeof id, id)
if (id === null) {
$timeout(function(){
$scope.cloak = false;
}, 500)
} else {
$timeout(function(){
$scope.layout.one = true;
$scope.layout.top = true;
});
}

});

$scope.$on('ui.layout.toggle', function(){
console.error("toggle", new Date())
})
});

</script>
<style>
.red {
background-color: red;
}
.green {
background-color: green;
}
.ui-splitbar {
background-color: red;
}
.ui-layout-container {
background-color: rgba(255, 175, 89, 0.23);
}

.cloak {
position: absolute;
top: 0;
bottom:0;
left: 0;
right: 0;
z-index: 10;
background-color: cornflowerblue;
}

</style>
</head>
<body ng-controller="DemoController" >
<div class="cloak" ng-if="cloak"></div>
<div ui-layout="{flow: 'row'}" ui-layout-loaded>
<div id="top" ui-layout-container collapsed="layout.top" size="50px">TOP</div>
<div ui-layout-container>
<div ui-layout="config" >
<div id="one" ui-layout-container size="100px" max-size="50%" min-size="100px" collapsed="layout.one">
<div ui-layout="{flow: 'row'}">
<div ui-layout-container>One-One</div>
<div ui-layout-container>One-Two</div>
<div ui-layout-container>One-Three</div>
</div>
</div>
<div ui-layout-container>Two

</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three-One one={{ layout.one }}, top={{ layout.top }}</div>
<div ui-layout-container min-size="50px">
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>
</div>
</div>

</body>
</html>
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: Programmatically toggle containers by petrsimon · Pull Request #154 · angular-ui/ui-layout · GitHub
Skip to content
This repository was archived by the owner on Sep 8, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 93 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,6 +100,7 @@ Default: `false`

Like `disableToggle` above but only removes the arrows on mobile devices (max-device-width: 480px).


## Child Attributes

### uiLayoutContainer
Expand All@@ -113,6 +114,39 @@ Required on all child elements of the ui-layout element.
</div>
```

### Options
A string value `'central'` can be passed to the directive:
```xml
<div ui-layout>
<div ui-layout-container></div>
<div ui-layout-container="central"></div>
<div ui-layout-container></div>
</div>
```

The `'central'` container takes up all the remaining space during resizing, regardless of previous state, e.g. after splitbar drag.

### collapsed [collapsed]
Type: `boolean`

```xml
<div ui-layout>
<div ui-layout-container collapsed="true"></div>
<div ui-layout-container collapsed="layout.mycontainer"></div>
</div>
```

Controls collapsed state of the container. Application can store the state of the layout e.g. like so:
```javascript
$scope.layout {
toolbar: true,
leftSidebar: false,
mycontainer: false
}
```

Changing those values will toggle container. See also [`ui.layout.toggle`][event-toggle].

### size
Type: `String`

Expand DownExpand Up@@ -171,9 +205,63 @@ percentage

Events are broadcast on the scope where ui-layout is attached. This means they are available to any controller inside of a ui-layout container.

### ui.layout.toggle
### ui.layout.loaded
Returns: `string` or `null`


Dispatched when the layout container finished loading. It returns the value of the attribute, e.g. `ui-layout-loaded="my-loaded-message"`, or `null`. The `null` also means that the layout has finished collapsing all the containers that should be collapsed (per application request when setting the [`collapsed`][collapsed] attribute).

Dispatched when a container is opened or closed using the chevron buttons.
Collapsing container on application load currently goes through these steps:
1. layout is first loaded with all containers uncollapsed (disregarding user set values), then
2. containers are collapsed either:
- _automatically_: application has not set a string return value for the `ui.layout.loaded` event.
- _manually_: application sets collapsed flags in the callback passed to `ui.layout.loaded`

All this means that the user will notice a flicker. If the flicker is not desirable, hide the layout behind an overlay, wait for the `ui.layout.loaded` event. In the "automatic" mode, all is done and the layout should be presentable. In the "manual" mode it is up to the application to count the `ui.layout.toggle` events.



```xml
<div id="main-container" ui-layout ui-layout-loaded>
<div ui-layout-container>
<div ui-layout ui-layout-loaded="child-container">
<div ui-layout-container>

</div>
</div>
</div>
</div>
```

```javascript
$scope.$on('ui.layout.loaded', function(evt, id) => {
switch (id) {
case 'main-container':
...
break;
case 'child-container':
...
break;
default:
break;
}
});
```

Note: the value of the attribute is not evaluated, so:

```
$scope.layout = {
mySidebar: {someKey: 'some value'}
}

<div id='my-sidebar' ui-layout ui-layout-loaded="layout.mySidebar.someKey"></div>
// $scope.$on will receive the string 'layout.mySidebar.someKey'
```

### ui.layout.toggle [event-toggle]

Dispatched when a container is opened or closed. Element can be identified `container.id`, which is the same as `element.id` if provided, otherwise it is `null`.

```javascript
$scope.$on('ui.layout.toggle', function(e, container){
Expand All@@ -183,6 +271,9 @@ $scope.$on('ui.layout.toggle', function(e, container){
});
```

Manually toggling (clicking the arrow button on the splitbar) will not update the `collapsed` attribute.
If the application is using the `collapsed` attribute of `ui-layout-container` to programmatically control the collapsed state, the application should update it's state when this event occurs to stay in sync with the UI.

### ui.layout.resize

Dispatched as a splitbar is dragged, debounced to occur only every 50ms.
Expand Down
55 changes: 46 additions & 9 deletions demo/demo2.html
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,10 +4,10 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title></title>
<title>Angular UI Layout Demo 2</title>

<!-- Le css -->
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!--<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" type="text/css" />-->
<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<!-- Le javascript -->
Expand All@@ -16,10 +16,33 @@
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope) {
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};

$scope.layout = {
one: false,
four: false
};

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(){
$timeout(function(){
$scope.layout.one = true;
});
})
});

</script>
Expand All@@ -38,26 +61,40 @@
}
</style>
</head>
<body ng-controller="DemoController">
<div ui-layout="config">
<div ui-layout-container max-size="50%">
<body ng-controller="DemoController">
<div ui-layout="config" ui-layout-loaded>
<div ui-layout-container size="100px" max-size="50%" collapsed="layout.one">
One
<br/>
<button ng-click="updateDisplay()">Update Display</button>
</div>
<div ui-layout-container>Two</div>
<div ui-layout-container>Two
<p>
<button ng-click="toggle('one')">Toggle One</button></br>
<button ng-click="close('one')">Close One</button></br>
<button ng-click="open('one')">Open One</button></br>
</p>

<p>
<button ng-click="toggle('four')">Toggle Four</button></br>
<button ng-click="close('four')">Close Four</button></br>
<button ng-click="open('four')">Open Four</button></br>
</p>
</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three</div>
<div ui-layout-container>Three-One</div>
<div ui-layout-container>
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>

</body>
</html>
123 changes: 123 additions & 0 deletions demo/demo3.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html ng-app="x">
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title>Angular UI Layout Demo 2</title>

<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<script type="application/javascript" src="../bower_components/angular/angular.js"></script>
<script type="application/javascript" src="../src/ui-layout.js"></script>
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};


$scope.layout = {
top: true,
one: true,
four: false
};

$scope.cloak = Object.keys($scope.layout).map(function(k) {return $scope.layout[k]}).includes(true);

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(evt, id){
console.error('loaded', typeof id, id)
if (id === null) {
$timeout(function(){
$scope.cloak = false;
}, 500)
} else {
$timeout(function(){
$scope.layout.one = true;
$scope.layout.top = true;
});
}

});

$scope.$on('ui.layout.toggle', function(){
console.error("toggle", new Date())
})
});

</script>
<style>
.red {
background-color: red;
}
.green {
background-color: green;
}
.ui-splitbar {
background-color: red;
}
.ui-layout-container {
background-color: rgba(255, 175, 89, 0.23);
}

.cloak {
position: absolute;
top: 0;
bottom:0;
left: 0;
right: 0;
z-index: 10;
background-color: cornflowerblue;
}

</style>
</head>
<body ng-controller="DemoController" >
<div class="cloak" ng-if="cloak"></div>
<div ui-layout="{flow: 'row'}" ui-layout-loaded>
<div id="top" ui-layout-container collapsed="layout.top" size="50px">TOP</div>
<div ui-layout-container>
<div ui-layout="config" >
<div id="one" ui-layout-container size="100px" max-size="50%" min-size="100px" collapsed="layout.one">
<div ui-layout="{flow: 'row'}">
<div ui-layout-container>One-One</div>
<div ui-layout-container>One-Two</div>
<div ui-layout-container>One-Three</div>
</div>
</div>
<div ui-layout-container>Two

</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three-One one={{ layout.one }}, top={{ layout.top }}</div>
<div ui-layout-container min-size="50px">
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>
</div>
</div>

</body>
</html>
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat: Programmatically toggle containers by petrsimon · Pull Request #154 · angular-ui/ui-layout · GitHub
Skip to content
This repository was archived by the owner on Sep 8, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 93 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,6 +100,7 @@ Default: `false`

Like `disableToggle` above but only removes the arrows on mobile devices (max-device-width: 480px).


## Child Attributes

### uiLayoutContainer
Expand All@@ -113,6 +114,39 @@ Required on all child elements of the ui-layout element.
</div>
```

### Options
A string value `'central'` can be passed to the directive:
```xml
<div ui-layout>
<div ui-layout-container></div>
<div ui-layout-container="central"></div>
<div ui-layout-container></div>
</div>
```

The `'central'` container takes up all the remaining space during resizing, regardless of previous state, e.g. after splitbar drag.

### collapsed [collapsed]
Type: `boolean`

```xml
<div ui-layout>
<div ui-layout-container collapsed="true"></div>
<div ui-layout-container collapsed="layout.mycontainer"></div>
</div>
```

Controls collapsed state of the container. Application can store the state of the layout e.g. like so:
```javascript
$scope.layout {
toolbar: true,
leftSidebar: false,
mycontainer: false
}
```

Changing those values will toggle container. See also [`ui.layout.toggle`][event-toggle].

### size
Type: `String`

Expand DownExpand Up@@ -171,9 +205,63 @@ percentage

Events are broadcast on the scope where ui-layout is attached. This means they are available to any controller inside of a ui-layout container.

### ui.layout.toggle
### ui.layout.loaded
Returns: `string` or `null`


Dispatched when the layout container finished loading. It returns the value of the attribute, e.g. `ui-layout-loaded="my-loaded-message"`, or `null`. The `null` also means that the layout has finished collapsing all the containers that should be collapsed (per application request when setting the [`collapsed`][collapsed] attribute).

Dispatched when a container is opened or closed using the chevron buttons.
Collapsing container on application load currently goes through these steps:
1. layout is first loaded with all containers uncollapsed (disregarding user set values), then
2. containers are collapsed either:
- _automatically_: application has not set a string return value for the `ui.layout.loaded` event.
- _manually_: application sets collapsed flags in the callback passed to `ui.layout.loaded`

All this means that the user will notice a flicker. If the flicker is not desirable, hide the layout behind an overlay, wait for the `ui.layout.loaded` event. In the "automatic" mode, all is done and the layout should be presentable. In the "manual" mode it is up to the application to count the `ui.layout.toggle` events.



```xml
<div id="main-container" ui-layout ui-layout-loaded>
<div ui-layout-container>
<div ui-layout ui-layout-loaded="child-container">
<div ui-layout-container>

</div>
</div>
</div>
</div>
```

```javascript
$scope.$on('ui.layout.loaded', function(evt, id) => {
switch (id) {
case 'main-container':
...
break;
case 'child-container':
...
break;
default:
break;
}
});
```

Note: the value of the attribute is not evaluated, so:

```
$scope.layout = {
mySidebar: {someKey: 'some value'}
}

<div id='my-sidebar' ui-layout ui-layout-loaded="layout.mySidebar.someKey"></div>
// $scope.$on will receive the string 'layout.mySidebar.someKey'
```

### ui.layout.toggle [event-toggle]

Dispatched when a container is opened or closed. Element can be identified `container.id`, which is the same as `element.id` if provided, otherwise it is `null`.

```javascript
$scope.$on('ui.layout.toggle', function(e, container){
Expand All@@ -183,6 +271,9 @@ $scope.$on('ui.layout.toggle', function(e, container){
});
```

Manually toggling (clicking the arrow button on the splitbar) will not update the `collapsed` attribute.
If the application is using the `collapsed` attribute of `ui-layout-container` to programmatically control the collapsed state, the application should update it's state when this event occurs to stay in sync with the UI.

### ui.layout.resize

Dispatched as a splitbar is dragged, debounced to occur only every 50ms.
Expand Down
55 changes: 46 additions & 9 deletions demo/demo2.html
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,10 +4,10 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title></title>
<title>Angular UI Layout Demo 2</title>

<!-- Le css -->
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!--<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" type="text/css" />-->
<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<!-- Le javascript -->
Expand All@@ -16,10 +16,33 @@
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope) {
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};

$scope.layout = {
one: false,
four: false
};

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(){
$timeout(function(){
$scope.layout.one = true;
});
})
});

</script>
Expand All@@ -38,26 +61,40 @@
}
</style>
</head>
<body ng-controller="DemoController">
<div ui-layout="config">
<div ui-layout-container max-size="50%">
<body ng-controller="DemoController">
<div ui-layout="config" ui-layout-loaded>
<div ui-layout-container size="100px" max-size="50%" collapsed="layout.one">
One
<br/>
<button ng-click="updateDisplay()">Update Display</button>
</div>
<div ui-layout-container>Two</div>
<div ui-layout-container>Two
<p>
<button ng-click="toggle('one')">Toggle One</button></br>
<button ng-click="close('one')">Close One</button></br>
<button ng-click="open('one')">Open One</button></br>
</p>

<p>
<button ng-click="toggle('four')">Toggle Four</button></br>
<button ng-click="close('four')">Close Four</button></br>
<button ng-click="open('four')">Open Four</button></br>
</p>
</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three</div>
<div ui-layout-container>Three-One</div>
<div ui-layout-container>
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>

</body>
</html>
123 changes: 123 additions & 0 deletions demo/demo3.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html ng-app="x">
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title>Angular UI Layout Demo 2</title>

<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<script type="application/javascript" src="../bower_components/angular/angular.js"></script>
<script type="application/javascript" src="../src/ui-layout.js"></script>
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};


$scope.layout = {
top: true,
one: true,
four: false
};

$scope.cloak = Object.keys($scope.layout).map(function(k) {return $scope.layout[k]}).includes(true);

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(evt, id){
console.error('loaded', typeof id, id)
if (id === null) {
$timeout(function(){
$scope.cloak = false;
}, 500)
} else {
$timeout(function(){
$scope.layout.one = true;
$scope.layout.top = true;
});
}

});

$scope.$on('ui.layout.toggle', function(){
console.error("toggle", new Date())
})
});

</script>
<style>
.red {
background-color: red;
}
.green {
background-color: green;
}
.ui-splitbar {
background-color: red;
}
.ui-layout-container {
background-color: rgba(255, 175, 89, 0.23);
}

.cloak {
position: absolute;
top: 0;
bottom:0;
left: 0;
right: 0;
z-index: 10;
background-color: cornflowerblue;
}

</style>
</head>
<body ng-controller="DemoController" >
<div class="cloak" ng-if="cloak"></div>
<div ui-layout="{flow: 'row'}" ui-layout-loaded>
<div id="top" ui-layout-container collapsed="layout.top" size="50px">TOP</div>
<div ui-layout-container>
<div ui-layout="config" >
<div id="one" ui-layout-container size="100px" max-size="50%" min-size="100px" collapsed="layout.one">
<div ui-layout="{flow: 'row'}">
<div ui-layout-container>One-One</div>
<div ui-layout-container>One-Two</div>
<div ui-layout-container>One-Three</div>
</div>
</div>
<div ui-layout-container>Two

</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three-One one={{ layout.one }}, top={{ layout.top }}</div>
<div ui-layout-container min-size="50px">
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>
</div>
</div>

</body>
</html>
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: Programmatically toggle containers by petrsimon · Pull Request #154 · angular-ui/ui-layout · GitHub
Skip to content
This repository was archived by the owner on Sep 8, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 93 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,6 +100,7 @@ Default: `false`

Like `disableToggle` above but only removes the arrows on mobile devices (max-device-width: 480px).


## Child Attributes

### uiLayoutContainer
Expand All@@ -113,6 +114,39 @@ Required on all child elements of the ui-layout element.
</div>
```

### Options
A string value `'central'` can be passed to the directive:
```xml
<div ui-layout>
<div ui-layout-container></div>
<div ui-layout-container="central"></div>
<div ui-layout-container></div>
</div>
```

The `'central'` container takes up all the remaining space during resizing, regardless of previous state, e.g. after splitbar drag.

### collapsed [collapsed]
Type: `boolean`

```xml
<div ui-layout>
<div ui-layout-container collapsed="true"></div>
<div ui-layout-container collapsed="layout.mycontainer"></div>
</div>
```

Controls collapsed state of the container. Application can store the state of the layout e.g. like so:
```javascript
$scope.layout {
toolbar: true,
leftSidebar: false,
mycontainer: false
}
```

Changing those values will toggle container. See also [`ui.layout.toggle`][event-toggle].

### size
Type: `String`

Expand DownExpand Up@@ -171,9 +205,63 @@ percentage

Events are broadcast on the scope where ui-layout is attached. This means they are available to any controller inside of a ui-layout container.

### ui.layout.toggle
### ui.layout.loaded
Returns: `string` or `null`


Dispatched when the layout container finished loading. It returns the value of the attribute, e.g. `ui-layout-loaded="my-loaded-message"`, or `null`. The `null` also means that the layout has finished collapsing all the containers that should be collapsed (per application request when setting the [`collapsed`][collapsed] attribute).

Dispatched when a container is opened or closed using the chevron buttons.
Collapsing container on application load currently goes through these steps:
1. layout is first loaded with all containers uncollapsed (disregarding user set values), then
2. containers are collapsed either:
- _automatically_: application has not set a string return value for the `ui.layout.loaded` event.
- _manually_: application sets collapsed flags in the callback passed to `ui.layout.loaded`

All this means that the user will notice a flicker. If the flicker is not desirable, hide the layout behind an overlay, wait for the `ui.layout.loaded` event. In the "automatic" mode, all is done and the layout should be presentable. In the "manual" mode it is up to the application to count the `ui.layout.toggle` events.



```xml
<div id="main-container" ui-layout ui-layout-loaded>
<div ui-layout-container>
<div ui-layout ui-layout-loaded="child-container">
<div ui-layout-container>

</div>
</div>
</div>
</div>
```

```javascript
$scope.$on('ui.layout.loaded', function(evt, id) => {
switch (id) {
case 'main-container':
...
break;
case 'child-container':
...
break;
default:
break;
}
});
```

Note: the value of the attribute is not evaluated, so:

```
$scope.layout = {
mySidebar: {someKey: 'some value'}
}

<div id='my-sidebar' ui-layout ui-layout-loaded="layout.mySidebar.someKey"></div>
// $scope.$on will receive the string 'layout.mySidebar.someKey'
```

### ui.layout.toggle [event-toggle]

Dispatched when a container is opened or closed. Element can be identified `container.id`, which is the same as `element.id` if provided, otherwise it is `null`.

```javascript
$scope.$on('ui.layout.toggle', function(e, container){
Expand All@@ -183,6 +271,9 @@ $scope.$on('ui.layout.toggle', function(e, container){
});
```

Manually toggling (clicking the arrow button on the splitbar) will not update the `collapsed` attribute.
If the application is using the `collapsed` attribute of `ui-layout-container` to programmatically control the collapsed state, the application should update it's state when this event occurs to stay in sync with the UI.

### ui.layout.resize

Dispatched as a splitbar is dragged, debounced to occur only every 50ms.
Expand Down
55 changes: 46 additions & 9 deletions demo/demo2.html
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,10 +4,10 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title></title>
<title>Angular UI Layout Demo 2</title>

<!-- Le css -->
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!--<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" type="text/css" />-->
<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<!-- Le javascript -->
Expand All@@ -16,10 +16,33 @@
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope) {
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};

$scope.layout = {
one: false,
four: false
};

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(){
$timeout(function(){
$scope.layout.one = true;
});
})
});

</script>
Expand All@@ -38,26 +61,40 @@
}
</style>
</head>
<body ng-controller="DemoController">
<div ui-layout="config">
<div ui-layout-container max-size="50%">
<body ng-controller="DemoController">
<div ui-layout="config" ui-layout-loaded>
<div ui-layout-container size="100px" max-size="50%" collapsed="layout.one">
One
<br/>
<button ng-click="updateDisplay()">Update Display</button>
</div>
<div ui-layout-container>Two</div>
<div ui-layout-container>Two
<p>
<button ng-click="toggle('one')">Toggle One</button></br>
<button ng-click="close('one')">Close One</button></br>
<button ng-click="open('one')">Open One</button></br>
</p>

<p>
<button ng-click="toggle('four')">Toggle Four</button></br>
<button ng-click="close('four')">Close Four</button></br>
<button ng-click="open('four')">Open Four</button></br>
</p>
</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three</div>
<div ui-layout-container>Three-One</div>
<div ui-layout-container>
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>

</body>
</html>
123 changes: 123 additions & 0 deletions demo/demo3.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html ng-app="x">
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title>Angular UI Layout Demo 2</title>

<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<script type="application/javascript" src="../bower_components/angular/angular.js"></script>
<script type="application/javascript" src="../src/ui-layout.js"></script>
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};


$scope.layout = {
top: true,
one: true,
four: false
};

$scope.cloak = Object.keys($scope.layout).map(function(k) {return $scope.layout[k]}).includes(true);

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(evt, id){
console.error('loaded', typeof id, id)
if (id === null) {
$timeout(function(){
$scope.cloak = false;
}, 500)
} else {
$timeout(function(){
$scope.layout.one = true;
$scope.layout.top = true;
});
}

});

$scope.$on('ui.layout.toggle', function(){
console.error("toggle", new Date())
})
});

</script>
<style>
.red {
background-color: red;
}
.green {
background-color: green;
}
.ui-splitbar {
background-color: red;
}
.ui-layout-container {
background-color: rgba(255, 175, 89, 0.23);
}

.cloak {
position: absolute;
top: 0;
bottom:0;
left: 0;
right: 0;
z-index: 10;
background-color: cornflowerblue;
}

</style>
</head>
<body ng-controller="DemoController" >
<div class="cloak" ng-if="cloak"></div>
<div ui-layout="{flow: 'row'}" ui-layout-loaded>
<div id="top" ui-layout-container collapsed="layout.top" size="50px">TOP</div>
<div ui-layout-container>
<div ui-layout="config" >
<div id="one" ui-layout-container size="100px" max-size="50%" min-size="100px" collapsed="layout.one">
<div ui-layout="{flow: 'row'}">
<div ui-layout-container>One-One</div>
<div ui-layout-container>One-Two</div>
<div ui-layout-container>One-Three</div>
</div>
</div>
<div ui-layout-container>Two

</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three-One one={{ layout.one }}, top={{ layout.top }}</div>
<div ui-layout-container min-size="50px">
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>
</div>
</div>

</body>
</html>
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: Programmatically toggle containers by petrsimon · Pull Request #154 · angular-ui/ui-layout · GitHub
Skip to content
This repository was archived by the owner on Sep 8, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 93 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,6 +100,7 @@ Default: `false`

Like `disableToggle` above but only removes the arrows on mobile devices (max-device-width: 480px).


## Child Attributes

### uiLayoutContainer
Expand All@@ -113,6 +114,39 @@ Required on all child elements of the ui-layout element.
</div>
```

### Options
A string value `'central'` can be passed to the directive:
```xml
<div ui-layout>
<div ui-layout-container></div>
<div ui-layout-container="central"></div>
<div ui-layout-container></div>
</div>
```

The `'central'` container takes up all the remaining space during resizing, regardless of previous state, e.g. after splitbar drag.

### collapsed [collapsed]
Type: `boolean`

```xml
<div ui-layout>
<div ui-layout-container collapsed="true"></div>
<div ui-layout-container collapsed="layout.mycontainer"></div>
</div>
```

Controls collapsed state of the container. Application can store the state of the layout e.g. like so:
```javascript
$scope.layout {
toolbar: true,
leftSidebar: false,
mycontainer: false
}
```

Changing those values will toggle container. See also [`ui.layout.toggle`][event-toggle].

### size
Type: `String`

Expand DownExpand Up@@ -171,9 +205,63 @@ percentage

Events are broadcast on the scope where ui-layout is attached. This means they are available to any controller inside of a ui-layout container.

### ui.layout.toggle
### ui.layout.loaded
Returns: `string` or `null`


Dispatched when the layout container finished loading. It returns the value of the attribute, e.g. `ui-layout-loaded="my-loaded-message"`, or `null`. The `null` also means that the layout has finished collapsing all the containers that should be collapsed (per application request when setting the [`collapsed`][collapsed] attribute).

Dispatched when a container is opened or closed using the chevron buttons.
Collapsing container on application load currently goes through these steps:
1. layout is first loaded with all containers uncollapsed (disregarding user set values), then
2. containers are collapsed either:
- _automatically_: application has not set a string return value for the `ui.layout.loaded` event.
- _manually_: application sets collapsed flags in the callback passed to `ui.layout.loaded`

All this means that the user will notice a flicker. If the flicker is not desirable, hide the layout behind an overlay, wait for the `ui.layout.loaded` event. In the "automatic" mode, all is done and the layout should be presentable. In the "manual" mode it is up to the application to count the `ui.layout.toggle` events.



```xml
<div id="main-container" ui-layout ui-layout-loaded>
<div ui-layout-container>
<div ui-layout ui-layout-loaded="child-container">
<div ui-layout-container>

</div>
</div>
</div>
</div>
```

```javascript
$scope.$on('ui.layout.loaded', function(evt, id) => {
switch (id) {
case 'main-container':
...
break;
case 'child-container':
...
break;
default:
break;
}
});
```

Note: the value of the attribute is not evaluated, so:

```
$scope.layout = {
mySidebar: {someKey: 'some value'}
}

<div id='my-sidebar' ui-layout ui-layout-loaded="layout.mySidebar.someKey"></div>
// $scope.$on will receive the string 'layout.mySidebar.someKey'
```

### ui.layout.toggle [event-toggle]

Dispatched when a container is opened or closed. Element can be identified `container.id`, which is the same as `element.id` if provided, otherwise it is `null`.

```javascript
$scope.$on('ui.layout.toggle', function(e, container){
Expand All@@ -183,6 +271,9 @@ $scope.$on('ui.layout.toggle', function(e, container){
});
```

Manually toggling (clicking the arrow button on the splitbar) will not update the `collapsed` attribute.
If the application is using the `collapsed` attribute of `ui-layout-container` to programmatically control the collapsed state, the application should update it's state when this event occurs to stay in sync with the UI.

### ui.layout.resize

Dispatched as a splitbar is dragged, debounced to occur only every 50ms.
Expand Down
55 changes: 46 additions & 9 deletions demo/demo2.html
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,10 +4,10 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title></title>
<title>Angular UI Layout Demo 2</title>

<!-- Le css -->
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!--<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" type="text/css" />-->
<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<!-- Le javascript -->
Expand All@@ -16,10 +16,33 @@
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope) {
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};

$scope.layout = {
one: false,
four: false
};

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(){
$timeout(function(){
$scope.layout.one = true;
});
})
});

</script>
Expand All@@ -38,26 +61,40 @@
}
</style>
</head>
<body ng-controller="DemoController">
<div ui-layout="config">
<div ui-layout-container max-size="50%">
<body ng-controller="DemoController">
<div ui-layout="config" ui-layout-loaded>
<div ui-layout-container size="100px" max-size="50%" collapsed="layout.one">
One
<br/>
<button ng-click="updateDisplay()">Update Display</button>
</div>
<div ui-layout-container>Two</div>
<div ui-layout-container>Two
<p>
<button ng-click="toggle('one')">Toggle One</button></br>
<button ng-click="close('one')">Close One</button></br>
<button ng-click="open('one')">Open One</button></br>
</p>

<p>
<button ng-click="toggle('four')">Toggle Four</button></br>
<button ng-click="close('four')">Close Four</button></br>
<button ng-click="open('four')">Open Four</button></br>
</p>
</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three</div>
<div ui-layout-container>Three-One</div>
<div ui-layout-container>
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>

</body>
</html>
123 changes: 123 additions & 0 deletions demo/demo3.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html ng-app="x">
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title>Angular UI Layout Demo 2</title>

<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<script type="application/javascript" src="../bower_components/angular/angular.js"></script>
<script type="application/javascript" src="../src/ui-layout.js"></script>
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};


$scope.layout = {
top: true,
one: true,
four: false
};

$scope.cloak = Object.keys($scope.layout).map(function(k) {return $scope.layout[k]}).includes(true);

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(evt, id){
console.error('loaded', typeof id, id)
if (id === null) {
$timeout(function(){
$scope.cloak = false;
}, 500)
} else {
$timeout(function(){
$scope.layout.one = true;
$scope.layout.top = true;
});
}

});

$scope.$on('ui.layout.toggle', function(){
console.error("toggle", new Date())
})
});

</script>
<style>
.red {
background-color: red;
}
.green {
background-color: green;
}
.ui-splitbar {
background-color: red;
}
.ui-layout-container {
background-color: rgba(255, 175, 89, 0.23);
}

.cloak {
position: absolute;
top: 0;
bottom:0;
left: 0;
right: 0;
z-index: 10;
background-color: cornflowerblue;
}

</style>
</head>
<body ng-controller="DemoController" >
<div class="cloak" ng-if="cloak"></div>
<div ui-layout="{flow: 'row'}" ui-layout-loaded>
<div id="top" ui-layout-container collapsed="layout.top" size="50px">TOP</div>
<div ui-layout-container>
<div ui-layout="config" >
<div id="one" ui-layout-container size="100px" max-size="50%" min-size="100px" collapsed="layout.one">
<div ui-layout="{flow: 'row'}">
<div ui-layout-container>One-One</div>
<div ui-layout-container>One-Two</div>
<div ui-layout-container>One-Three</div>
</div>
</div>
<div ui-layout-container>Two

</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three-One one={{ layout.one }}, top={{ layout.top }}</div>
<div ui-layout-container min-size="50px">
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>
</div>
</div>

</body>
</html>
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat: Programmatically toggle containers by petrsimon · Pull Request #154 · angular-ui/ui-layout · GitHub
Skip to content
This repository was archived by the owner on Sep 8, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 93 additions & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -100,6 +100,7 @@ Default: `false`

Like `disableToggle` above but only removes the arrows on mobile devices (max-device-width: 480px).


## Child Attributes

### uiLayoutContainer
Expand All@@ -113,6 +114,39 @@ Required on all child elements of the ui-layout element.
</div>
```

### Options
A string value `'central'` can be passed to the directive:
```xml
<div ui-layout>
<div ui-layout-container></div>
<div ui-layout-container="central"></div>
<div ui-layout-container></div>
</div>
```

The `'central'` container takes up all the remaining space during resizing, regardless of previous state, e.g. after splitbar drag.

### collapsed [collapsed]
Type: `boolean`

```xml
<div ui-layout>
<div ui-layout-container collapsed="true"></div>
<div ui-layout-container collapsed="layout.mycontainer"></div>
</div>
```

Controls collapsed state of the container. Application can store the state of the layout e.g. like so:
```javascript
$scope.layout {
toolbar: true,
leftSidebar: false,
mycontainer: false
}
```

Changing those values will toggle container. See also [`ui.layout.toggle`][event-toggle].

### size
Type: `String`

Expand DownExpand Up@@ -171,9 +205,63 @@ percentage

Events are broadcast on the scope where ui-layout is attached. This means they are available to any controller inside of a ui-layout container.

### ui.layout.toggle
### ui.layout.loaded
Returns: `string` or `null`


Dispatched when the layout container finished loading. It returns the value of the attribute, e.g. `ui-layout-loaded="my-loaded-message"`, or `null`. The `null` also means that the layout has finished collapsing all the containers that should be collapsed (per application request when setting the [`collapsed`][collapsed] attribute).

Dispatched when a container is opened or closed using the chevron buttons.
Collapsing container on application load currently goes through these steps:
1. layout is first loaded with all containers uncollapsed (disregarding user set values), then
2. containers are collapsed either:
- _automatically_: application has not set a string return value for the `ui.layout.loaded` event.
- _manually_: application sets collapsed flags in the callback passed to `ui.layout.loaded`

All this means that the user will notice a flicker. If the flicker is not desirable, hide the layout behind an overlay, wait for the `ui.layout.loaded` event. In the "automatic" mode, all is done and the layout should be presentable. In the "manual" mode it is up to the application to count the `ui.layout.toggle` events.



```xml
<div id="main-container" ui-layout ui-layout-loaded>
<div ui-layout-container>
<div ui-layout ui-layout-loaded="child-container">
<div ui-layout-container>

</div>
</div>
</div>
</div>
```

```javascript
$scope.$on('ui.layout.loaded', function(evt, id) => {
switch (id) {
case 'main-container':
...
break;
case 'child-container':
...
break;
default:
break;
}
});
```

Note: the value of the attribute is not evaluated, so:

```
$scope.layout = {
mySidebar: {someKey: 'some value'}
}

<div id='my-sidebar' ui-layout ui-layout-loaded="layout.mySidebar.someKey"></div>
// $scope.$on will receive the string 'layout.mySidebar.someKey'
```

### ui.layout.toggle [event-toggle]

Dispatched when a container is opened or closed. Element can be identified `container.id`, which is the same as `element.id` if provided, otherwise it is `null`.

```javascript
$scope.$on('ui.layout.toggle', function(e, container){
Expand All@@ -183,6 +271,9 @@ $scope.$on('ui.layout.toggle', function(e, container){
});
```

Manually toggling (clicking the arrow button on the splitbar) will not update the `collapsed` attribute.
If the application is using the `collapsed` attribute of `ui-layout-container` to programmatically control the collapsed state, the application should update it's state when this event occurs to stay in sync with the UI.

### ui.layout.resize

Dispatched as a splitbar is dragged, debounced to occur only every 50ms.
Expand Down
55 changes: 46 additions & 9 deletions demo/demo2.html
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,10 +4,10 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title></title>
<title>Angular UI Layout Demo 2</title>

<!-- Le css -->
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<!--<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" type="text/css" />-->
<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<!-- Le javascript -->
Expand All@@ -16,10 +16,33 @@
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope) {
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};

$scope.layout = {
one: false,
four: false
};

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(){
$timeout(function(){
$scope.layout.one = true;
});
})
});

</script>
Expand All@@ -38,26 +61,40 @@
}
</style>
</head>
<body ng-controller="DemoController">
<div ui-layout="config">
<div ui-layout-container max-size="50%">
<body ng-controller="DemoController">
<div ui-layout="config" ui-layout-loaded>
<div ui-layout-container size="100px" max-size="50%" collapsed="layout.one">
One
<br/>
<button ng-click="updateDisplay()">Update Display</button>
</div>
<div ui-layout-container>Two</div>
<div ui-layout-container>Two
<p>
<button ng-click="toggle('one')">Toggle One</button></br>
<button ng-click="close('one')">Close One</button></br>
<button ng-click="open('one')">Open One</button></br>
</p>

<p>
<button ng-click="toggle('four')">Toggle Four</button></br>
<button ng-click="close('four')">Close Four</button></br>
<button ng-click="open('four')">Open Four</button></br>
</p>
</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three</div>
<div ui-layout-container>Three-One</div>
<div ui-layout-container>
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>

</body>
</html>
123 changes: 123 additions & 0 deletions demo/demo3.html
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html ng-app="x">
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">

<title>Angular UI Layout Demo 2</title>

<link rel="stylesheet" type="text/css" href="../src/ui-layout.css"/>

<script type="application/javascript" src="../bower_components/angular/angular.js"></script>
<script type="application/javascript" src="../src/ui-layout.js"></script>
<script type="application/javascript">

var app = angular.module('x', ['ui.layout']);
app.controller('DemoController', function($scope, $timeout) {
$scope.config = {
flow: 'column'
};


$scope.layout = {
top: true,
one: true,
four: false
};

$scope.cloak = Object.keys($scope.layout).map(function(k) {return $scope.layout[k]}).includes(true);

$scope.toggle = function(which) {
$scope.layout[which] = !$scope.layout[which];
};

$scope.close = function(which) {
$scope.layout[which] = true;
};

$scope.open = function(which) {
$scope.layout[which] = false;
}

$scope.$on('ui.layout.loaded', function(evt, id){
console.error('loaded', typeof id, id)
if (id === null) {
$timeout(function(){
$scope.cloak = false;
}, 500)
} else {
$timeout(function(){
$scope.layout.one = true;
$scope.layout.top = true;
});
}

});

$scope.$on('ui.layout.toggle', function(){
console.error("toggle", new Date())
})
});

</script>
<style>
.red {
background-color: red;
}
.green {
background-color: green;
}
.ui-splitbar {
background-color: red;
}
.ui-layout-container {
background-color: rgba(255, 175, 89, 0.23);
}

.cloak {
position: absolute;
top: 0;
bottom:0;
left: 0;
right: 0;
z-index: 10;
background-color: cornflowerblue;
}

</style>
</head>
<body ng-controller="DemoController" >
<div class="cloak" ng-if="cloak"></div>
<div ui-layout="{flow: 'row'}" ui-layout-loaded>
<div id="top" ui-layout-container collapsed="layout.top" size="50px">TOP</div>
<div ui-layout-container>
<div ui-layout="config" >
<div id="one" ui-layout-container size="100px" max-size="50%" min-size="100px" collapsed="layout.one">
<div ui-layout="{flow: 'row'}">
<div ui-layout-container>One-One</div>
<div ui-layout-container>One-Two</div>
<div ui-layout-container>One-Three</div>
</div>
</div>
<div ui-layout-container>Two

</div>
<div ui-layout-container>
<!--Three-->
<div ui-layout="{ flow:'row', dividerSize:'12' }">
<div ui-layout-container>Three-One one={{ layout.one }}, top={{ layout.top }}</div>
<div ui-layout-container min-size="50px">
Three-Two
<div ng-include="demo/testinclude.html"></div>
</div>
</div>
</div>
<div ui-layout-container collapsed="layout.four">
Four
</div>
</div>
</div>
</div>

</body>
</html>
Loading