Milimetric has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/196489

Change subject: [WIP] Do NOT Merge
......................................................................

[WIP] Do NOT Merge

This is the start of a series of patches that will implement a new
layout for the visual editor funnel analysis, in dashiki.  It's
exploratory only, and a proper refactor of this and the wikimetrics
layout into separate repositories should be done.

Change-Id: Id732758508048e5b1d3126534ad145cb21bfa4f4
---
M bower.json
M src/app/startup.js
A src/components/button-group/button-group.html
A src/components/button-group/button-group.js
A src/components/dropdown/dropdown.html
A src/components/dropdown/dropdown.js
A src/components/funnel-layout/funnel-layout.html
A src/components/funnel-layout/funnel-layout.js
A src/css/062_header.min.css
A src/css/063_button.min.css
A src/css/064_dropdown.min.css
A src/css/065_divider.min.css
M src/css/070_styles.css
A src/css/071_wikimetrics_styles.css
M src/index.html
15 files changed, 363 insertions(+), 251 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/analytics/dashiki 
refs/changes/89/196489/1

diff --git a/bower.json b/bower.json
index 7527324..f990f65 100644
--- a/bower.json
+++ b/bower.json
@@ -10,7 +10,6 @@
     "topojson": "~1.6.18",
     "jquery": "^2.1.1",
     "moment": "^2.7.0",
-    "knockout-projections": "~1.1.0-pre",
     "URIjs": "~1.13.2",
     "typeahead.js": "~0.10.5",
     "semantic": "~0.19.0",
diff --git a/src/app/startup.js b/src/app/startup.js
index 049bc77..c42b824 100644
--- a/src/app/startup.js
+++ b/src/app/startup.js
@@ -16,6 +16,12 @@
     ko.components.register('vega-timeseries', { require: 
'components/visualizers/vega-timeseries/vega-timeseries' });
     ko.components.register('annotation-list', { require: 
'components/annotation-list/annotation-list' });
 
+
+    // separate layout, TODO: make multiple layouts coexist
+    ko.components.register('funnel-layout', { require: 
'components/funnel-layout/funnel-layout' });
+    ko.components.register('dropdown', { require: 
'components/dropdown/dropdown' });
+    ko.components.register('button-group', { require: 
'components/button-group/button-group' });
+
     // Start the application
     ko.applyBindings();
 });
diff --git a/src/components/button-group/button-group.html 
b/src/components/button-group/button-group.html
new file mode 100644
index 0000000..d5626bc
--- /dev/null
+++ b/src/components/button-group/button-group.html
@@ -0,0 +1,7 @@
+<div class="ui small buttons" data-bind="foreach: selectOne.options">
+    <div class="ui button"
+         data-bind="
+            text: $data,
+            click: $parent.select,
+            css: {active: $data === $parent.selectOne.selected()}"></div>
+</div>
diff --git a/src/components/button-group/button-group.js 
b/src/components/button-group/button-group.js
new file mode 100644
index 0000000..6772fa7
--- /dev/null
+++ b/src/components/button-group/button-group.js
@@ -0,0 +1,11 @@
+define(function (require) {
+    'use strict';
+
+    var templateMarkup = require('text!./button-group.html'),
+        SingleSelect = require('components/dropdown/dropdown').viewModel;
+
+    return {
+        viewModel: SingleSelect,
+        template: templateMarkup
+    };
+});
diff --git a/src/components/dropdown/dropdown.html 
b/src/components/dropdown/dropdown.html
new file mode 100644
index 0000000..e1cb9a1
--- /dev/null
+++ b/src/components/dropdown/dropdown.html
@@ -0,0 +1,9 @@
+<div class="ui compact small menu">
+    <div class="ui simple dropdown item">
+        <span data-bind="text: selectOne.selected"></span>
+        <i class="dropdown icon"></i>
+        <div class="menu" data-bind="foreach: selectOne.options">
+            <div class="item" data-bind="text: $data, click: 
$parent.select"></div>
+        </div>
+    </div>
+</div>
diff --git a/src/components/dropdown/dropdown.js 
b/src/components/dropdown/dropdown.js
new file mode 100644
index 0000000..529450a
--- /dev/null
+++ b/src/components/dropdown/dropdown.js
@@ -0,0 +1,18 @@
+define(function (require) {
+    'use strict';
+
+    var templateMarkup = require('text!./dropdown.html');
+
+    // this is used in dropdown and button-group, could factor it out
+    function SingleSelect(params) {
+        this.selectOne = params.selectOne;
+        this.select = function (option) {
+            this.selectOne.selected(option);
+        }.bind(this);
+    }
+
+    return {
+        viewModel: SingleSelect,
+        template: templateMarkup
+    };
+});
diff --git a/src/components/funnel-layout/funnel-layout.html 
b/src/components/funnel-layout/funnel-layout.html
new file mode 100644
index 0000000..7059cc3
--- /dev/null
+++ b/src/components/funnel-layout/funnel-layout.html
@@ -0,0 +1,19 @@
+<section>
+    <filters class="ui grid">
+        <div class="left aligned three wide column">
+            <dropdown params="selectOne: wiki"/>
+        </div>
+        <div class="eight wide column">
+            <label>from: <dropdown params="selectOne: fromDate"/></label>
+            <label>to: <dropdown params="selectOne: toDate"/></label>
+        </div>
+        <div class="right aligned five wide column">
+            <button-group params="selectOne: editor"/>
+        </div>
+    </filters>
+    <graphs class="ui attached segment">
+        <graph class="ui raised segment">graph goes here</graph>
+        <graph style="height: 499px" class="ui raised segment">graph goes 
here</graph>
+        <graph class="ui raised segment">graph goes here</graph>
+    </graphs>
+</section>
diff --git a/src/components/funnel-layout/funnel-layout.js 
b/src/components/funnel-layout/funnel-layout.js
new file mode 100644
index 0000000..4cf3d91
--- /dev/null
+++ b/src/components/funnel-layout/funnel-layout.js
@@ -0,0 +1,30 @@
+define(function (require) {
+    'use strict';
+
+    var ko = require('knockout'),
+        templateMarkup = require('text!./funnel-layout.html');
+
+    function FunnelLayout() {
+        this.wiki = {
+            options: ko.observable(['enwiki', 'rowiki', 'All Wikis']),
+            selected: ko.observable('All Wikis'),
+        };
+        this.fromDate = {
+            options: ko.observable(['2014-01-01', '2014-02-01', '2014-03-01']),
+            selected: ko.observable('2014-01-01'),
+        };
+        this.toDate = {
+            options: ko.observable(['2014-01-01', '2014-02-01', '2014-03-01']),
+            selected: ko.observable('2014-02-01'),
+        };
+        this.editor = {
+            options: ko.observable(['VE', 'Both', 'WT']),
+            selected: ko.observable('VE'),
+        };
+    }
+
+    return {
+        viewModel: FunnelLayout,
+        template: templateMarkup
+    };
+});
diff --git a/src/css/062_header.min.css b/src/css/062_header.min.css
new file mode 120000
index 0000000..baff89c
--- /dev/null
+++ b/src/css/062_header.min.css
@@ -0,0 +1 @@
+../bower_modules/semantic/build/minified/elements/header.min.css
\ No newline at end of file
diff --git a/src/css/063_button.min.css b/src/css/063_button.min.css
new file mode 120000
index 0000000..3cb03c0
--- /dev/null
+++ b/src/css/063_button.min.css
@@ -0,0 +1 @@
+../bower_modules/semantic/build/minified/elements/button.min.css
\ No newline at end of file
diff --git a/src/css/064_dropdown.min.css b/src/css/064_dropdown.min.css
new file mode 120000
index 0000000..6d1fac3
--- /dev/null
+++ b/src/css/064_dropdown.min.css
@@ -0,0 +1 @@
+../bower_modules/semantic/build/minified/modules/dropdown.min.css
\ No newline at end of file
diff --git a/src/css/065_divider.min.css b/src/css/065_divider.min.css
new file mode 120000
index 0000000..8e60546
--- /dev/null
+++ b/src/css/065_divider.min.css
@@ -0,0 +1 @@
+../bower_modules/semantic/build/minified/elements/divider.min.css
\ No newline at end of file
diff --git a/src/css/070_styles.css b/src/css/070_styles.css
index 8f9bf25..e614b6f 100644
--- a/src/css/070_styles.css
+++ b/src/css/070_styles.css
@@ -1,250 +1,4 @@
-/* site-wide styles */
-body {
-    padding: 0;
-    margin: 0;
-    height: 100vh;
-    font-family: "Nimbus Sans L","Liberation Sans","Helvetica 
Neue","Helvetica","Arial",sans-serif;
-    }
+filters, graphs, graph { display: block; }
 
-/* patches to semantic */
-.delete.icon {
-    cursor: pointer;
-}
-.ui.label.navy {
-    background-color: #347BFE;
-    color: white;
-}
-.ui.label {
-    text-transform: none;
-}
-.ui.inverted.input input {
-    background-color: #7C7C7C;
-    color: #232323;
-}
-.ui.dropdown.label {
-    height: 30.75px;
-}
-.separate.icon {
-    margin: 0 -4px 0 4px;
-}
-.ui.pointing.offset.above.label:before {
-    left: 11%!important;
-    top: -0.41em;
-}
-.ui.label,
-.ui.input input {
-    border-radius: 2px;
-}
-
-/* our styles */
-.ui.segment.metric {
-    padding: 0.5em;
-}
-.ui.label.metric {
-    margin: 0.25em;
-}
-.subtext {
-    color: #929292;
-    font-size: x-small;
-    text-transform: uppercase;
-    margin-left: 8px;
-}
-.icon.faded {
-    opacity: 0.1;
-}
-.item:hover .icon.faded {
-    opacity: 1;
-}
-.target {
-    position: absolute!important;
-    z-index: 100!important;
-    display: none!important;
-}
-.target.open {
-    display: block!important;
-}
-.categories.target.label {
-    padding: 1px;
-    margin-top: 7px!important;
-}
-.ui.pointing.white.label {
-    background-color: white;
-    border: 2px solid #E5E5E5;
-}
-.ui.pointing.white.label:before {
-    background-color: white;
-    border: 2px solid #E5E5E5;
-    border-bottom: none;
-    border-right: none;
-}
-.target.label .grid {
-    margin: 0px;
-}
-.target.label .grid .column {
-    padding: 0px;
-    margin: 0px;
-}
-input.typeahead {
-    color: white!important;
-    width: 280px!important;
-}
-a.header {
-    color: #112233;
-    text-decoration: none;
-}
-a.header:hover {
-    border-bottom: 2px solid #112233;
-}
-section.page.column {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    padding: 10px;
-}
-section.projects {
-    background-color: #6D6D6D;
-    width: 300px;
-}
-section.main {
-    background-color: #EEEEEE;
-    right: 0;
-    left: 300px;
-}
-.graph {
-    height: 87vh;
-}
-.graph .parent-of-resizable {
-    height: 100%;
-    min-height: 300px;
-    min-width: 800px;
-    max-height: 76vh;
-}
-.parent-of-resizable {
-    width: 100%;
-    height: 100%;
-    padding: 0;
-}
-.colored i.swatch {
-    vertical-align: bottom;
-    display: inline-block;
-    margin: 0 .35em 0 0;
-    width: 20px;
-    height: 20px;
-    opacity: 1;
-}
-.destructive:hover {
-    color: #D42E2A;
-}
-project-selector hr {
-    margin-right: 20px;
-}
-project-selector .ui.vertical.menu.fluid {
-    width: 94%!important;
-}
-
-breakdown-toggle {
-    display: block;
-    margin-top: 60px;
-}
-breakdown-toggle .ui.vertical.menu.fluid {
-    width: 94%!important;
-}
-breakdown-toggle .ui.menu a.header.item {
-    opacity: 1!important;
-}
-breakdown-toggle .ui.menu a.header.item,
-breakdown-toggle .ui.menu a.header.item:hover {
-    background-color: #4D4D4D;
-    color: #BDBDBD;
-}
-breakdown-toggle .ui.menu a.header.item.off,
-breakdown-toggle .ui.menu a.header.item.off:hover {
-    background-color: #808080;
-    color: #454545;
-}
-
-.annotation.label {
-    cursor: pointer;
-    margin: 5px 3px 3px 3px;
-}
-.annotation-list-title {
-    margin-left: 10px;
-    vertical-align: -2px;
-    font-size: 14px;
-}
-
-/**
- * Twitter typeahead stuff
- */
-.tt-query,
-.tt-hint {
-    width: 390px;
-    height: 30px;
-    padding: 8px 12px;
-    font-size: 24px;
-    line-height: 30px;
-    border: 2px solid #ccc;
-    border-radius: 2px;
-    outline: none;
-}
-.tt-query {
-    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.tt-hint {
-    color: #999
-}
-.tt-dropdown-menu {
-    width: 300px;
-    margin: 1px 0 0 1px;
-    padding: 8px 0;
-    background-color: #fff;
-    border: 1px solid #ccc;
-    border: 1px solid rgba(0, 0, 0, 0.2);
-    border-radius: 2px;
-    box-shadow: 0 5px 10px rgba(0,0,0,.2);
-    max-height: 24em;
-    overflow-y: scroll;
-    overflow-x: hidden;
-}
-.tt-suggestion {
-    padding: 3px 20px;
-    font-size: 16px;
-    line-height: 30px;
-    border-bottom: #ccc 1px solid;
-}
-.tt-suggestion .footnote {
-    float: right;
-    font-size:0.8em;
-}
-.tt-suggestion.tt-is-under-cursor { /* UPDATE: newer versions use 
.tt-suggestion.tt-cursor */
-    color: #fff;
-    background-color: #0097cf;
-
-}
-.tt-suggestion:hover {
-    font-weight: bold;
-    cursor: pointer;
-}
-.tt-suggestion p {
-    margin: 0;
-}
-.tt-back:hover{
-    font-weight: bold;
-}
-.tt-dropdown-menu {
-    display: none;
-}
-.tt-dropdown-menu .header {
-    margin: 0 0 0 10px;
-    font-size: 1.5em;
-    color: #888;
-}
-.tt-dropdown-menu > * {
-    margin: 0 0 14px 0;
-}
-.tt-dropdown-menu.open {
-    display: block;
-    position: absolute;
-    z-index: 100;
-}
-/* End Twitter Typeahead stuff */
+filters.ui.segment { padding: 0.5em 0.2em 0.5em 1em; box-shadow: none; }
+graphs.ui.attached.segment { background-color: #f7f7f7; margin: 6px; }
diff --git a/src/css/071_wikimetrics_styles.css 
b/src/css/071_wikimetrics_styles.css
new file mode 100644
index 0000000..8f9bf25
--- /dev/null
+++ b/src/css/071_wikimetrics_styles.css
@@ -0,0 +1,250 @@
+/* site-wide styles */
+body {
+    padding: 0;
+    margin: 0;
+    height: 100vh;
+    font-family: "Nimbus Sans L","Liberation Sans","Helvetica 
Neue","Helvetica","Arial",sans-serif;
+    }
+
+/* patches to semantic */
+.delete.icon {
+    cursor: pointer;
+}
+.ui.label.navy {
+    background-color: #347BFE;
+    color: white;
+}
+.ui.label {
+    text-transform: none;
+}
+.ui.inverted.input input {
+    background-color: #7C7C7C;
+    color: #232323;
+}
+.ui.dropdown.label {
+    height: 30.75px;
+}
+.separate.icon {
+    margin: 0 -4px 0 4px;
+}
+.ui.pointing.offset.above.label:before {
+    left: 11%!important;
+    top: -0.41em;
+}
+.ui.label,
+.ui.input input {
+    border-radius: 2px;
+}
+
+/* our styles */
+.ui.segment.metric {
+    padding: 0.5em;
+}
+.ui.label.metric {
+    margin: 0.25em;
+}
+.subtext {
+    color: #929292;
+    font-size: x-small;
+    text-transform: uppercase;
+    margin-left: 8px;
+}
+.icon.faded {
+    opacity: 0.1;
+}
+.item:hover .icon.faded {
+    opacity: 1;
+}
+.target {
+    position: absolute!important;
+    z-index: 100!important;
+    display: none!important;
+}
+.target.open {
+    display: block!important;
+}
+.categories.target.label {
+    padding: 1px;
+    margin-top: 7px!important;
+}
+.ui.pointing.white.label {
+    background-color: white;
+    border: 2px solid #E5E5E5;
+}
+.ui.pointing.white.label:before {
+    background-color: white;
+    border: 2px solid #E5E5E5;
+    border-bottom: none;
+    border-right: none;
+}
+.target.label .grid {
+    margin: 0px;
+}
+.target.label .grid .column {
+    padding: 0px;
+    margin: 0px;
+}
+input.typeahead {
+    color: white!important;
+    width: 280px!important;
+}
+a.header {
+    color: #112233;
+    text-decoration: none;
+}
+a.header:hover {
+    border-bottom: 2px solid #112233;
+}
+section.page.column {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    padding: 10px;
+}
+section.projects {
+    background-color: #6D6D6D;
+    width: 300px;
+}
+section.main {
+    background-color: #EEEEEE;
+    right: 0;
+    left: 300px;
+}
+.graph {
+    height: 87vh;
+}
+.graph .parent-of-resizable {
+    height: 100%;
+    min-height: 300px;
+    min-width: 800px;
+    max-height: 76vh;
+}
+.parent-of-resizable {
+    width: 100%;
+    height: 100%;
+    padding: 0;
+}
+.colored i.swatch {
+    vertical-align: bottom;
+    display: inline-block;
+    margin: 0 .35em 0 0;
+    width: 20px;
+    height: 20px;
+    opacity: 1;
+}
+.destructive:hover {
+    color: #D42E2A;
+}
+project-selector hr {
+    margin-right: 20px;
+}
+project-selector .ui.vertical.menu.fluid {
+    width: 94%!important;
+}
+
+breakdown-toggle {
+    display: block;
+    margin-top: 60px;
+}
+breakdown-toggle .ui.vertical.menu.fluid {
+    width: 94%!important;
+}
+breakdown-toggle .ui.menu a.header.item {
+    opacity: 1!important;
+}
+breakdown-toggle .ui.menu a.header.item,
+breakdown-toggle .ui.menu a.header.item:hover {
+    background-color: #4D4D4D;
+    color: #BDBDBD;
+}
+breakdown-toggle .ui.menu a.header.item.off,
+breakdown-toggle .ui.menu a.header.item.off:hover {
+    background-color: #808080;
+    color: #454545;
+}
+
+.annotation.label {
+    cursor: pointer;
+    margin: 5px 3px 3px 3px;
+}
+.annotation-list-title {
+    margin-left: 10px;
+    vertical-align: -2px;
+    font-size: 14px;
+}
+
+/**
+ * Twitter typeahead stuff
+ */
+.tt-query,
+.tt-hint {
+    width: 390px;
+    height: 30px;
+    padding: 8px 12px;
+    font-size: 24px;
+    line-height: 30px;
+    border: 2px solid #ccc;
+    border-radius: 2px;
+    outline: none;
+}
+.tt-query {
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.tt-hint {
+    color: #999
+}
+.tt-dropdown-menu {
+    width: 300px;
+    margin: 1px 0 0 1px;
+    padding: 8px 0;
+    background-color: #fff;
+    border: 1px solid #ccc;
+    border: 1px solid rgba(0, 0, 0, 0.2);
+    border-radius: 2px;
+    box-shadow: 0 5px 10px rgba(0,0,0,.2);
+    max-height: 24em;
+    overflow-y: scroll;
+    overflow-x: hidden;
+}
+.tt-suggestion {
+    padding: 3px 20px;
+    font-size: 16px;
+    line-height: 30px;
+    border-bottom: #ccc 1px solid;
+}
+.tt-suggestion .footnote {
+    float: right;
+    font-size:0.8em;
+}
+.tt-suggestion.tt-is-under-cursor { /* UPDATE: newer versions use 
.tt-suggestion.tt-cursor */
+    color: #fff;
+    background-color: #0097cf;
+
+}
+.tt-suggestion:hover {
+    font-weight: bold;
+    cursor: pointer;
+}
+.tt-suggestion p {
+    margin: 0;
+}
+.tt-back:hover{
+    font-weight: bold;
+}
+.tt-dropdown-menu {
+    display: none;
+}
+.tt-dropdown-menu .header {
+    margin: 0 0 0 10px;
+    font-size: 1.5em;
+    color: #888;
+}
+.tt-dropdown-menu > * {
+    margin: 0 0 14px 0;
+}
+.tt-dropdown-menu.open {
+    display: block;
+    position: absolute;
+    z-index: 100;
+}
+/* End Twitter Typeahead stuff */
diff --git a/src/index.html b/src/index.html
index f9d544f..8f330d4 100644
--- a/src/index.html
+++ b/src/index.html
@@ -8,6 +8,7 @@
         <!-- build:css -->
             <!-- always pick and choose semantic ui components, full build 
includes things like chatrooms! -->
             <!-- we have symlinked the modules used from bower_modules into 
style directory -->
+            <!-- NOTE: semantic < 1.0 docs available here for convenience: 
http://legacy.semantic-ui.com/ (later versions of semantic have breaking 
changes)-->
 
             <link href="css/000_grid.min.css" rel="stylesheet">
             <link href="css/010_menu.min.css" rel="stylesheet">
@@ -17,6 +18,10 @@
             <link href="css/050_input.min.css" rel="stylesheet">
             <link href="css/060_segment.min.css" rel="stylesheet">
             <link href="css/061_popup.min.css" rel="stylesheet">
+            <link href="css/062_header.min.css" rel="stylesheet">
+            <link href="css/063_button.min.css" rel="stylesheet">
+            <link href="css/064_dropdown.min.css" rel="stylesheet">
+            <link href="css/065_divider.min.css" rel="stylesheet">
 
             <!-- end semantic ui -->
             <link href="css/070_styles.css" rel="stylesheet">
@@ -28,6 +33,6 @@
         <!-- endbuild -->
     </head>
     <body>
-        <wikimetrics-layout/>
+        <funnel-layout/>
     </body>
 </html>

-- 
To view, visit https://gerrit.wikimedia.org/r/196489
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id732758508048e5b1d3126534ad145cb21bfa4f4
Gerrit-PatchSet: 1
Gerrit-Project: analytics/dashiki
Gerrit-Branch: master
Gerrit-Owner: Milimetric <dandree...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to