First attempt to create a panel based windows system
Change-Id: I2b6fb4cb147518d661dbccb3bd5f8e093b63bf55
diff --git a/Gruntfile.js b/Gruntfile.js
index d9efddf..1518cff 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -127,7 +127,7 @@
'dev/scss/sidebar/sidebar.scss',
'dev/scss/header/{header,hint,menu,searchbar,vc,datepicker}.scss',
'dev/scss/main/{alertify,intro,koralquery,highlight,kwic,logos,tagger,' +
- 'main,matchinfo,tree,pagination,query,'+
+ 'main,matchinfo,panel,tree,pagination,query,'+
'resultinfo,sidebar,tutorial,buttongroup}.scss'
],
tasks: ['sass'],
diff --git a/dev/demo/buttongroup.html b/dev/demo/buttongroup.html
index 9a26ed1..73050b5 100644
--- a/dev/demo/buttongroup.html
+++ b/dev/demo/buttongroup.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<html>
<head>
- <title>Hint demo</title>
+ <title>Panel and ButtonGroup demo</title>
<meta charset="utf-8" />
<script src="../js/lib/require.js" async="async"></script>
<link type="text/css" rel="stylesheet" href="../css/kalamar.css" />
</head>
<body>
- <nav id="mainButton" style="position: absolute; top: 300px"></nav>
+ <nav id="mainButton" style="position: absolute; width: 100%; top: 150px"></nav>
</body>
<script>
requirejs.config({
@@ -18,17 +18,21 @@
});
-require(['buttongroup'], function (btnClass) {
- btns = btnClass.create();
- btns.add('Meta',['meta'], function () {
+require(['buttongroup', 'panel','view'], function (btnClass, panelClass, viewClass) {
+ var panel = panelClass.create();
+ var actions = panel.actions;
+ actions.add('Meta',['meta'], function () {
console.log(this.button.classList.contains('meta'));
+ view = viewClass.create();
+ panel.add(view);
});
- var list = btns.addList('More', ['list']);
+ var list = actions.addList('More', ['list']);
list.readItems([
['cool', 'cool', function (e, action) { console.log('really' + this.action()) }],
['very cool', 'veryCool', function (e, action) { console.log('very cool') }]
]);
- document.getElementById('mainButton').appendChild(btns.element());
+
+ document.getElementById('mainButton').appendChild(panel.element());
});
diff --git a/dev/js/src/match.js b/dev/js/src/match.js
index 59d2e83..3576867 100644
--- a/dev/js/src/match.js
+++ b/dev/js/src/match.js
@@ -184,6 +184,9 @@
var that = this;
+ // TODO:
+ // Introduce panel object here!
+
// Add meta button
var refLine = element.querySelector("p.ref");
@@ -274,6 +277,9 @@
*/
info : function () {
+ // TODO:
+ // Rename info() to panel()
+
// Create match info
if (this._info === undefined)
this._info = infoClass.create(this);
diff --git a/dev/js/src/match/info.js b/dev/js/src/match/info.js
index 628659f..655535f 100644
--- a/dev/js/src/match/info.js
+++ b/dev/js/src/match/info.js
@@ -3,7 +3,7 @@
*/
/*
* TODO:
- * Create a "views" object, that is the parent of this
+ * Create a "panel" object, that is the parent of this
* class and supports a simple .add() method to add views
* to an element.
*/
@@ -60,34 +60,6 @@
/**
- * Open the information view,
- * if closed, otherwise close.
- */
- /*
- toggle : function () {
-
- var elem = this._match.element();
-
- if (this.opened == true) {
- elem.removeChild(
- this.element()
- );
- this.opened = false;
- }
- else {
- // Append element to match
- elem.appendChild(
- this.element()
- );
- this.opened = true;
- };
-
- return this.opened;
- },
- */
-
-
- /**
* Retrieve and parse snippet for table
* representation
*/
@@ -419,6 +391,9 @@
},
// Add action button
+ // TODO:
+ // These are view-buttons that should be added to
+ // the view and not to the panel!
_addButton : function (buttonType, element, cb) {
// TODO: Unless existent
var actions = document.createElement('ul');
diff --git a/dev/js/src/panel.js b/dev/js/src/panel.js
new file mode 100644
index 0000000..5aa96ad
--- /dev/null
+++ b/dev/js/src/panel.js
@@ -0,0 +1,95 @@
+/**
+ * Create a panel for a certain aspect of the system, like
+ * the result, a match, or the VC.
+ */
+define(['buttongroup', 'util'], function (buttonGroupClass) {
+
+ return {
+
+ // TODO:
+ // Support classes
+ create : function () {
+ return Object.create(this)._init();
+ },
+
+ _init : function () {
+ // ...
+ this.views = [];
+
+
+ /**
+ * Main action buttons for the panel,
+ * may be at the bottom (for matches)
+ * or as tabs (for the result).
+ */
+ this.actions = buttonGroupClass.create(['action', 'panel']);
+ return this;
+ },
+
+ /**
+ * The element of the panel
+ */
+ element : function () {
+ if (this._element)
+ return this._element;
+
+ // Create panel element
+ var e = document.createElement('div');
+ e.classList.add('panel');
+
+ e.appendChild(this.actions.element());
+
+ this._element = e;
+ return e;
+ },
+
+
+ /**
+ * Add a view to the panel
+ */
+ add : function (view) {
+
+ // Add view to views list
+ this.views.push(view);
+
+ // Append element to panel element
+
+ this.element().appendChild(
+ view.element()
+ );
+
+ view.panel = this;
+ },
+
+ /**
+ * Delete a closed view from panel
+ */
+ delView : function (view) {
+ for (i in this.views) {
+ if (this.views[i] === view) {
+ this.views[i] = undefined;
+ }
+ }
+ },
+
+ /**
+ * Elements before the action buttons
+ */
+ beforeActions : function (element) {
+ if (arguments.length > 0)
+ this._beforeActions = element;
+
+ return this._beforeActions;
+ },
+
+ /**
+ * Element after the action buttons
+ */
+ afterActions : function (element) {
+ if (arguments.length > 0)
+ this._afterActions = element;
+
+ return this._afterActions;
+ }
+ }
+});
diff --git a/dev/js/src/view.js b/dev/js/src/view.js
new file mode 100644
index 0000000..2eb5dd0
--- /dev/null
+++ b/dev/js/src/view.js
@@ -0,0 +1,55 @@
+/**
+ * Create a view that can be added to a panel,
+ * like a tree view or the metadata view.
+ */
+
+define(['buttongroup', 'util'], function (buttonGroupClass) {
+
+ return {
+
+ // TODO:
+ // Support classes
+ create : function () {
+ return Object.create(this)._init();
+ },
+
+ _init : function () {
+ // ..
+ this.panel = undefined;
+
+ // The buttonclass is bind to the view
+ this.actions = buttonGroupClass.create(['action', 'view']).bind(this);
+ this.actions.add('close', ['button-icon','close'], function (e) {
+ this.close();
+ });
+
+ return this;
+ },
+
+ /**
+ * Element of the view
+ */
+ element : function () {
+ if (this._element)
+ return this._element;
+
+ // Create panel element
+ var e = document.createElement('div');
+ e.classList.add('view');
+
+ e.appendChild(this.actions.element());
+
+ this._element = e;
+ return e;
+ },
+
+ /**
+ * Close the view.
+ */
+ close : function () {
+ var e = this.element();
+ e.parentNode.removeChild(e);
+ this.panel.delView(this);
+ }
+ };
+});
diff --git a/dev/scss/main/buttongroup.scss b/dev/scss/main/buttongroup.scss
index dea337d..acd3094 100644
--- a/dev/scss/main/buttongroup.scss
+++ b/dev/scss/main/buttongroup.scss
@@ -7,31 +7,6 @@
.button-group {
> span {
cursor: pointer;
- box-shadow: $choose-box-shadow;
- font-size: 9pt;
- line-height: 1.5em;
- padding: 0 4px;
- display: inline-block;
- @include choose-item;
- border-style: solid;
- border-width: $border-size 0;
- &:hover {
- @include choose-hover;
- }
- &:first-child {
- border: {
- left-width: $border-size;
- top-left-radius: $standard-border-radius;
- bottom-left-radius: $standard-border-radius;
- }
- }
- &:last-child {
- border: {
- right-width: $border-size;
- top-right-radius: $standard-border-radius;
- bottom-right-radius: $standard-border-radius;
- }
- }
&.button-icon {
font-family: 'FontAwesome';
> span {
@@ -41,6 +16,34 @@
}
}
+.button-group:not(.view) > span {
+ box-shadow: $choose-box-shadow;
+ font-size: 9pt;
+ line-height: 1.5em;
+ padding: 0 4px;
+ display: inline-block;
+ @include choose-item;
+ border-style: solid;
+ border-width: $border-size 0;
+ &:hover {
+ @include choose-hover;
+ }
+ &:first-child {
+ border: {
+ left-width: $border-size;
+ top-left-radius: $standard-border-radius;
+ bottom-left-radius: $standard-border-radius;
+ }
+ }
+ &:last-child {
+ border: {
+ right-width: $border-size;
+ top-right-radius: $standard-border-radius;
+ bottom-right-radius: $standard-border-radius;
+ }
+ }
+}
+
ul.button-group-list {
border-top-right-radius: 8px;
z-index: 150;
@@ -54,3 +57,31 @@
border-top-right-radius: 5px;
}
}
+
+
+.button-group.view {
+ display: block;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 20;
+ margin: 0;
+ padding: 0;
+ width: $right-match-distance;
+ > span {
+ border-width: 0;
+ text-decoration:none;
+ text-align: center;
+ font-style: normal;
+
+ &.download::after {
+ font-family: 'FontAwesome';
+ content: $fa-download;
+ }
+
+ &.close::after {
+ font-family: 'FontAwesome';
+ content: $fa-close;
+ }
+ }
+}
diff --git a/dev/scss/main/main.scss b/dev/scss/main/main.scss
index 40ef483..cfb3791 100644
--- a/dev/scss/main/main.scss
+++ b/dev/scss/main/main.scss
@@ -12,6 +12,7 @@
@import "alertify"; // Styling alerts
@import "intro"; // Intro page
@import "buttongroup"; // Button groups
+@import "panel"; // Base panel system
main {
margin: {
diff --git a/dev/scss/main/matchinfo.scss b/dev/scss/main/matchinfo.scss
index f2ed006..334ac74 100644
--- a/dev/scss/main/matchinfo.scss
+++ b/dev/scss/main/matchinfo.scss
@@ -235,6 +235,8 @@
}
}
+// TODO:
+// Probably obsolete now, as it will become part of the panel system
div.matchinfo ul.action.image {
display: block;
position: absolute;
diff --git a/dev/scss/main/panel.scss b/dev/scss/main/panel.scss
new file mode 100644
index 0000000..25d541b
--- /dev/null
+++ b/dev/scss/main/panel.scss
@@ -0,0 +1,26 @@
+@charset "utf-8";
+@import "../util";
+
+div.panel {
+ position: relative;
+ width: 100%;
+ display: block;
+ padding-top: $border-size;
+ background-color: $dark-orange;
+ border: {
+ style: solid;
+ color: $dark-orange;
+ width: 0;
+ }
+}
+
+div.view {
+ position: relative;
+ display: block;
+ min-height: 40px;
+ background-color: $middle-green;
+ width: 100%;
+ .button-group {
+ color: white;
+ }
+}