metric_admin 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/HEAD +1 -0
- data/LICENSE.txt +22 -0
- data/README.md +108 -0
- data/Rakefile +2 -0
- data/app/controllers/admin/metrics_controller.rb +115 -0
- data/app/views/admin/metrics/edit.haml +155 -0
- data/app/views/admin/metrics/evaluate.js.erb +8 -0
- data/app/views/admin/metrics/index.haml +51 -0
- data/app/views/admin/metrics/new.html.haml +126 -0
- data/app/views/admin/metrics/show.html.erb +74 -0
- data/config +6 -0
- data/hooks/ctags +10 -0
- data/hooks/post-checkout +6 -0
- data/hooks/post-commit +6 -0
- data/hooks/post-merge +6 -0
- data/hooks/post-rewrite +4 -0
- data/lib/metric_admin/version.rb +3 -0
- data/lib/metric_admin.rb +23 -0
- data/metric_admin.gemspec +23 -0
- data/rails/init.rb +1 -0
- metadata +95 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8fd7589666c761b69d4e7ee4ecd14d9199de3bba
|
4
|
+
data.tar.gz: 7ad211780457ec217fdc5b231cc616a38c3f0d65
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d72ffa6ec7ff1bbad23428339bc813de6c3b961cb01096fae0a82eb4cf6516a2f405dabde92216a20a29eed98906d6ff9e8617f07c5531cb00de9804fcd683aa
|
7
|
+
data.tar.gz: 09d3b8e32fef84b0b58d96626eb2356924ca2139ce9e41c7649226ea8d4442360e3da1e05141ef6ab0f8b0f2f1dc27a7d52151eaa544e8c52f67189df085aec0
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2016 Matt McFarling
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
# Metric Admin
|
2
|
+
|
3
|
+
This gem builds and edits metrics.
|
4
|
+
|
5
|
+
## Updating
|
6
|
+
|
7
|
+
Bump version in version.rb
|
8
|
+
Commit
|
9
|
+
rake build
|
10
|
+
rake release
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
Clone this repo to your local computer.
|
15
|
+
|
16
|
+
Add this line to your application's Gemfile:
|
17
|
+
|
18
|
+
gem 'metric_admin'
|
19
|
+
|
20
|
+
And then execute:
|
21
|
+
|
22
|
+
$ bundle install
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
In your application.js file add the following snippet:
|
27
|
+
|
28
|
+
$(function(){
|
29
|
+
$('a[rel="popover"]').popover();
|
30
|
+
$(".list-group").sortable({
|
31
|
+
update: function(event, ui) {
|
32
|
+
var data = $(this).sortable('serialize');
|
33
|
+
//alert(data);
|
34
|
+
$.ajax({
|
35
|
+
data: data,
|
36
|
+
type: 'POST',
|
37
|
+
url: '/metrics/sort'
|
38
|
+
});
|
39
|
+
}
|
40
|
+
});
|
41
|
+
// this excludes the div with class header from being sorted.
|
42
|
+
$(".list-group").sortable({ cancel: '.header' });
|
43
|
+
});
|
44
|
+
|
45
|
+
Also ensure that you are allowing for the CSRF Meta tags:
|
46
|
+
|
47
|
+
$(function(){
|
48
|
+
$.ajaxSetup({
|
49
|
+
beforeSend: function( xhr ) {
|
50
|
+
var token = $('meta[name="csrf-token"]').attr('content');
|
51
|
+
if (token) xhr.setRequestHeader('X-CSRF-Token', token);
|
52
|
+
}
|
53
|
+
});
|
54
|
+
});
|
55
|
+
|
56
|
+
In your config/routes.rb add the following:
|
57
|
+
|
58
|
+
map.connect "/metrics/sort", :controller => "admin/admin", :action => "sort"
|
59
|
+
|
60
|
+
Make a new css file in public/css for the gem:
|
61
|
+
|
62
|
+
h2.page-subtitle.pull-left {
|
63
|
+
margin-left: 1.1em;
|
64
|
+
}
|
65
|
+
|
66
|
+
.list-group {
|
67
|
+
margin-bottom: 15px;
|
68
|
+
border: 1px solid #ccc;
|
69
|
+
border-radius: 3px;
|
70
|
+
}
|
71
|
+
|
72
|
+
.list-group-item,
|
73
|
+
.header {
|
74
|
+
background-color: #f4f4f4;
|
75
|
+
border-bottom: 1px solid #ccc;
|
76
|
+
padding: 8px 15px;
|
77
|
+
vertical-align: middle;
|
78
|
+
}
|
79
|
+
|
80
|
+
.list-group-item:last-child {
|
81
|
+
border-bottom: none;
|
82
|
+
}
|
83
|
+
|
84
|
+
.list-group-item.odd {
|
85
|
+
background-color: #f4f4f4;
|
86
|
+
}
|
87
|
+
.list-group-item.even {
|
88
|
+
background-color: #fff;
|
89
|
+
}
|
90
|
+
|
91
|
+
In the AdminController add the following:
|
92
|
+
|
93
|
+
def sort
|
94
|
+
params[:metric].each_with_index do |metric_id, i|
|
95
|
+
metric = Metric.find(metric_id)
|
96
|
+
metric.update_attribute(:public_sort, i)
|
97
|
+
end
|
98
|
+
render :json => "sorted"
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
## Contributing
|
103
|
+
|
104
|
+
1. Fork it ( https://github.com/analyticsforlawyers/afl_teamwork/fork )
|
105
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
106
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
107
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
108
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
module MetricAdmin
|
2
|
+
class Admin::MetricsController < ApplicationController
|
3
|
+
|
4
|
+
layout "admin"
|
5
|
+
|
6
|
+
def index
|
7
|
+
@metric_categories = ResourceType.all
|
8
|
+
end
|
9
|
+
|
10
|
+
def show
|
11
|
+
@metric = Metric.find(params[:id])
|
12
|
+
@metricnote = MetricNote.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def edit
|
16
|
+
@metric_categories = ResourceType.all
|
17
|
+
@metric = Metric.find(params[:id])
|
18
|
+
@resource_type = ResourceType.find_by_id(@metric.resource_type_id)
|
19
|
+
end
|
20
|
+
|
21
|
+
def new
|
22
|
+
@metric = Metric.new
|
23
|
+
@metric.resource_type_id = params[:resource_type_id]
|
24
|
+
@metric.resource_type = params[:resource_type]
|
25
|
+
end
|
26
|
+
|
27
|
+
def destroy
|
28
|
+
|
29
|
+
if @metric = Metric.find(params[:id])
|
30
|
+
@metric.destroy
|
31
|
+
flash[:success] = "Metric has been removed."
|
32
|
+
redirect_to admin_metrics_url
|
33
|
+
else
|
34
|
+
flash[:alert] = "Metric has not been removed."
|
35
|
+
redirect_to admin_metrics_url
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def create
|
40
|
+
@metric = Metric.new(params[:metric])
|
41
|
+
if @metric.save
|
42
|
+
flash[:success] = "#{@metric.title} has been created"
|
43
|
+
redirect_to admin_metrics_url
|
44
|
+
else
|
45
|
+
flash[:notice] = "There was an error"
|
46
|
+
render :action => :new, :status => :unprocessable_entity
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def clone
|
51
|
+
@metric_to_clone = Metric.find(params[:id])
|
52
|
+
@metric = @metric_to_clone.clone
|
53
|
+
@metric.title = "Copy of #{@metric.title}"
|
54
|
+
@metric.sort = Metric.maximum(:sort, :conditions=>["resource_type_id = ?", @metric_to_clone.resource_type_id ]).to_i + 1
|
55
|
+
if @metric.save
|
56
|
+
flash[:notice] = "#{@metric.title} has been cloned"
|
57
|
+
redirect_to edit_admin_metric_url(@metric)
|
58
|
+
else
|
59
|
+
flash[:notice] = "There was an error"
|
60
|
+
render :action => :new, :status => :unprocessable_entity
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def calculate
|
65
|
+
CalculateMetrics.calculate_metrics_for_id(params[:id])
|
66
|
+
flash[:notice] = "Completed calculating"
|
67
|
+
redirect_to admin_metrics_url
|
68
|
+
end
|
69
|
+
|
70
|
+
def evaluate
|
71
|
+
metric_logic = params["logic"].gsub(":staff", params[:logic_staff])
|
72
|
+
error = {}
|
73
|
+
|
74
|
+
res = Thread.new{
|
75
|
+
require 'rubygems'
|
76
|
+
require 'active_support'
|
77
|
+
|
78
|
+
begin
|
79
|
+
@has_error = false
|
80
|
+
ActiveRecord::Base.establish_connection "needles_#{RAILS_ENV}"
|
81
|
+
@result, @results = eval(metric_logic)
|
82
|
+
ActiveRecord::Base.verify_active_connections!
|
83
|
+
[@result,@results]
|
84
|
+
rescue Exception => e
|
85
|
+
logger.info "Error Message: #{e.message}"
|
86
|
+
@has_error = true
|
87
|
+
@errors = [e.message, e.backtrace.join("\r\n")].join("\r\n")
|
88
|
+
end
|
89
|
+
}
|
90
|
+
|
91
|
+
@result, @results = res.value
|
92
|
+
@results = @results.to_json
|
93
|
+
|
94
|
+
respond_to do |format|
|
95
|
+
format.js
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
# PUT /admin/metrics/id
|
101
|
+
#----------------------------------------------------------------------------
|
102
|
+
def update
|
103
|
+
@metric = Metric.find_by_id(params[:metric][:id])
|
104
|
+
|
105
|
+
if @metric.update_attributes(params[:metric])
|
106
|
+
flash[:notice] = "#{@metric.title} has been updated"
|
107
|
+
# CalculateMetrics.calculate_metrics_for_id(@metric.id)
|
108
|
+
redirect_to :action => :edit
|
109
|
+
else
|
110
|
+
render :action => :index, :status => :unprocessable_entity
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
.row-fluid
|
2
|
+
.span3
|
3
|
+
.well.sidebar-nav
|
4
|
+
= link_to "<i class='icon-arrow-left'></i> Back to metrics", admin_metrics_url, :class=>"btn"
|
5
|
+
%hr
|
6
|
+
%p
|
7
|
+
%strong Actions:
|
8
|
+
%ul
|
9
|
+
%li= link_to "Calculate", "/admin/metrics/#{@metric.id}/calculate"
|
10
|
+
%li= link_to "Clone", "/admin/metrics/#{@metric.id}/clone"
|
11
|
+
%li= link_to "Delete", admin_metric_path(@metric.id), :confirm => "Are you sure?", :method => :delete
|
12
|
+
/ %p
|
13
|
+
/ %strong Previous versions:
|
14
|
+
/ %ul
|
15
|
+
/ - @metric.versions.each do |version|
|
16
|
+
/ %li= "#{time_ago_in_words(version.created_at)} ago"
|
17
|
+
.span9.well
|
18
|
+
.metric-content
|
19
|
+
.row-fluid
|
20
|
+
.span12
|
21
|
+
%h3{:style=>"margin:0;"}= "Editing: #{@metric.title}"
|
22
|
+
%hr
|
23
|
+
- form_for :metric, @metric, :url => admin_metric_path(@metric.id), :html => { :method => :put } do |f|
|
24
|
+
= f.error_messages
|
25
|
+
= f.hidden_field :id, :value => @metric.id
|
26
|
+
.row-fluid
|
27
|
+
.span4
|
28
|
+
.control-group
|
29
|
+
%label.control-label{:for => "title"} Title
|
30
|
+
.controls
|
31
|
+
= f.text_field :title, :placeholder => "title", :value => @metric.title
|
32
|
+
|
33
|
+
|
34
|
+
.control-group
|
35
|
+
%label.control-label{:for => "title"} Status
|
36
|
+
.controls
|
37
|
+
= f.select(:status, ['','inactive','active'], :selected=>@metric.status.to_s )
|
38
|
+
|
39
|
+
.control-group
|
40
|
+
%label.control-label{:for => "title"} Sort order
|
41
|
+
.controls
|
42
|
+
= f.text_field :sort, :value => @metric.sort.nil? ? @metric.resource_type.metrics.count : @metric.sort, :class=>"span3"
|
43
|
+
|
44
|
+
.span6
|
45
|
+
.row
|
46
|
+
.control-group
|
47
|
+
%label.control-label{:for => "title"} Name
|
48
|
+
.controls
|
49
|
+
= f.text_field :name, :value => @metric.name, "data-type" => "#{ResourceType.find(@metric.resource_type).code}"
|
50
|
+
|
51
|
+
.control-group
|
52
|
+
%label.control-label{:for => "metric_description"} Description
|
53
|
+
.controls
|
54
|
+
= f.text_area :description, :class=>"input-block-level", :placeholder => "description", :value => @metric.description, :rows => 2
|
55
|
+
.row
|
56
|
+
.span6
|
57
|
+
.control-group
|
58
|
+
%label.control-label{:for => "title"} Show Detail View
|
59
|
+
.controls
|
60
|
+
= f.check_box :has_detail
|
61
|
+
|
62
|
+
.span6
|
63
|
+
.control-group
|
64
|
+
%label.control-label{:for => "title"} Value Type
|
65
|
+
.controls
|
66
|
+
= f.select(:data_type, ['','integer','average','currency'], :selected=>@metric.status.to_s )
|
67
|
+
|
68
|
+
.row-fluid
|
69
|
+
.span12
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
.control-group
|
74
|
+
%label.control-label{:for => "description"} Logic:
|
75
|
+
.controls
|
76
|
+
= f.text_area :logic, :class=>"my-code-area input-block-level", :placeholder => "Technical Explanation", :value => @metric.logic, :rows => 20
|
77
|
+
%br
|
78
|
+
.error-wrapper
|
79
|
+
%label.control-label{:for => "description"} Errors:
|
80
|
+
.controls
|
81
|
+
= f.text_area :logic_errors, :class=>"input-block-level errors", :placeholder => "Error Container", :value => "", :rows => 20
|
82
|
+
%br
|
83
|
+
.controls
|
84
|
+
%label.control-label{:for => "logic_staff"} Staff: (for purposes of metric evaluation)
|
85
|
+
= text_field_tag :logic_staff, @metric.resource_type.resources.last.code
|
86
|
+
%br
|
87
|
+
%button.btn.run_logic{"aria-hidden" => "true", "data-dismiss" => "modal"}
|
88
|
+
Run
|
89
|
+
%i.icon-play
|
90
|
+
.loaderImage{:style=>"display:none;"}
|
91
|
+
Loading...
|
92
|
+
|
93
|
+
|
94
|
+
%br
|
95
|
+
%br
|
96
|
+
.well{:style=>"position:relative;"}
|
97
|
+
%small{:style=>"padding:3px 6px; font-size:10px; background:#dfdfdf; position:absolute; top:0; right:0;"} Logic Output
|
98
|
+
.row-fluid
|
99
|
+
.span6
|
100
|
+
%strong Quantified Result:
|
101
|
+
%br
|
102
|
+
.quantified_result
|
103
|
+
.span6
|
104
|
+
%strong Detailed Result
|
105
|
+
%br
|
106
|
+
.detailed_results
|
107
|
+
|
108
|
+
%tbody
|
109
|
+
|
110
|
+
|
111
|
+
.control-group
|
112
|
+
.controls
|
113
|
+
= f.submit "Update Metric", :class => 'btn btn-primary'
|
114
|
+
|
115
|
+
- content_for :footer do
|
116
|
+
:javascript
|
117
|
+
$(document).ready(function() {
|
118
|
+
$(".error-wrapper").hide();
|
119
|
+
$("#metric_title").on("blur", function(){
|
120
|
+
$("#metric_name").val( $("#metric_name").data('type') + "_" + this.value.replace(/[^A-Z0-9]/ig, "_").toLowerCase());
|
121
|
+
});
|
122
|
+
|
123
|
+
var editor = ace.edit("metric_logic");
|
124
|
+
$('.my-code-area').val(editor.getValue());
|
125
|
+
});
|
126
|
+
$('#metric_logic').ace({ theme: 'twilight', lang: 'ruby' })
|
127
|
+
|
128
|
+
$('.run_logic').on('click', function(){
|
129
|
+
var editor_contents = $('.my-code-area').val();
|
130
|
+
$('.loaderImage').show();
|
131
|
+
|
132
|
+
$('.quantified_result').html('');
|
133
|
+
$('.detailed_results').html('');
|
134
|
+
$('.errors').html('');
|
135
|
+
$(".error-wrapper").hide()
|
136
|
+
|
137
|
+
$.ajax(
|
138
|
+
{
|
139
|
+
type: "POST",
|
140
|
+
url: "/admin/metrics/1/evaluate.js",
|
141
|
+
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
|
142
|
+
contentType: "application/json; charset=utf-8",
|
143
|
+
data: JSON.stringify({logic: editor_contents , logic_staff: $("#logic_staff").val() }),
|
144
|
+
success: function(data){
|
145
|
+
$('.loaderImage').hide();
|
146
|
+
},
|
147
|
+
error: function (response) {
|
148
|
+
$('.loaderImage').hide();
|
149
|
+
$('.errors').html(response.responseText);
|
150
|
+
$('.error-wrapper').show();
|
151
|
+
}
|
152
|
+
}
|
153
|
+
);
|
154
|
+
return false;
|
155
|
+
});
|
@@ -0,0 +1,51 @@
|
|
1
|
+
.row-fluid
|
2
|
+
.span3
|
3
|
+
.well.sidebar-nav
|
4
|
+
%h3{:style=>"margin-top:0;"} Metric Types
|
5
|
+
.well
|
6
|
+
%ul.nav.nav-list
|
7
|
+
- @metric_categories.each do |c|
|
8
|
+
%li
|
9
|
+
%a{:href=>"#tab-#{c.id}", "data-toggle"=>"tab"}
|
10
|
+
= c.name
|
11
|
+
|
12
|
+
.span9
|
13
|
+
.well
|
14
|
+
.metric-content.tab-content{:style=>"border:0;"}
|
15
|
+
- @metric_categories.each_with_index do |c, i|
|
16
|
+
.tab-pane{:id=>"tab-#{c.id}", :class=> i == 0 ? "active" : ""}
|
17
|
+
%div.row
|
18
|
+
%h2.page-subtitle.pull-left= c.name
|
19
|
+
= link_to "<i class='icon-plus icon-white'></i> Create a new #{c.name} metric", new_admin_metric_url(:resource_type_id => c), :class=>"btn btn-primary pull-right"
|
20
|
+
|
21
|
+
- metrics = Metric.all(:conditions=>["resource_type_id=?", c.id], :order => 'category ASC, public_sort ASC')
|
22
|
+
|
23
|
+
- if metrics
|
24
|
+
- metrics.group_by{|x| x.category }.each do |category, _metrics|
|
25
|
+
%div#simpleList.list-group
|
26
|
+
%div.header{:draggable => false}
|
27
|
+
= category.present? ? category : 'No Category'
|
28
|
+
|
29
|
+
- _metrics.each do |metric|
|
30
|
+
%div.item.list-group-item{:class => cycle('odd', 'even'), :id => "metric-#{metric.id}"}
|
31
|
+
= link_to metric.title, edit_admin_metric_path(metric.id)
|
32
|
+
|
33
|
+
- if Result.count(:conditions=>["calculated_at = ? and metric_id = ?", Date.today.to_s, metric.id ]) == 0 && metric.status == 'active'
|
34
|
+
%p.label.warning Has not run today.
|
35
|
+
- if metric.status != 'active'
|
36
|
+
%p.label{:style=>"margin-left:5px;"} Not Active
|
37
|
+
|
38
|
+
.pull-right
|
39
|
+
.btn-group
|
40
|
+
%button.btn Action
|
41
|
+
%button.btn.dropdown-toggle{"data-toggle" => "dropdown"}
|
42
|
+
%span.caret
|
43
|
+
%ul.dropdown-menu
|
44
|
+
%li
|
45
|
+
= link_to "Edit".html_safe, edit_admin_metric_path(metric.id)
|
46
|
+
%li
|
47
|
+
= link_to "Calculate", "/admin/metrics/#{metric.id}/calculate"
|
48
|
+
%li
|
49
|
+
= link_to "Clone", "/admin/metrics/#{metric.id}/clone"
|
50
|
+
%li
|
51
|
+
= link_to "Delete", admin_metric_path(metric.id), :confirm => "Are you sure?", :method => :delete
|
@@ -0,0 +1,126 @@
|
|
1
|
+
.row-fluid
|
2
|
+
.span3
|
3
|
+
.well.sidebar-nav
|
4
|
+
= link_to "<i class='icon-arrow-left'></i> Back to metrics", admin_metrics_url, :class=>"btn"
|
5
|
+
.span9.well
|
6
|
+
.metric-content
|
7
|
+
%h3{:style=>"margin:0;"}= "New Metric"
|
8
|
+
%hr
|
9
|
+
- form_for ["admin/metrics", @metric], :url => { :action => "create" }, :html => {:class => "nifty_form"} do |f|
|
10
|
+
= f.error_messages
|
11
|
+
= f.hidden_field :id, :value => @metric.id
|
12
|
+
= f.hidden_field :resource_type_id, :value => params[:resource_type_id]
|
13
|
+
|
14
|
+
.control-group
|
15
|
+
%label.control-label{:for => "title"} Title
|
16
|
+
.controls
|
17
|
+
= f.text_field :title, :placeholder => "title", :value => @metric.title
|
18
|
+
|
19
|
+
.control-group
|
20
|
+
%label.control-label{:for => "title"} Name
|
21
|
+
.controls
|
22
|
+
= f.text_field :name, :value => @metric.name, :disabled=>true, "data-type" => "#{ResourceType.find(params[:resource_type_id]).code}"
|
23
|
+
|
24
|
+
.control-group
|
25
|
+
%label.control-label{:for => "title"} Status
|
26
|
+
.controls
|
27
|
+
= f.select(:status, ['','inactive','active'], :selected=>@metric.status.to_s )
|
28
|
+
|
29
|
+
.control-group
|
30
|
+
%label.control-label{:for => "title"} Sort order (next position)
|
31
|
+
.controls
|
32
|
+
= f.text_field :sort, :value => Metric.count(:conditions=>["resource_type_id = ?", params[:resource_type_id]])+1
|
33
|
+
|
34
|
+
.control-group
|
35
|
+
%label.control-label{:for => "description"} Logic:
|
36
|
+
.controls
|
37
|
+
= f.text_area :logic, :class=>"my-code-area input-block-level", :placeholder => "Technical Explanation", :value => @metric.logic, :rows => 20
|
38
|
+
|
39
|
+
%br
|
40
|
+
.controls
|
41
|
+
%label.control-label{:for => "logic_staff"} Staff: (for purposes of metric evaluation)
|
42
|
+
= text_field_tag :logic_staff, Resource.first(:conditions=>["resource_type_id = ?", params[:resource_type_id]]).code
|
43
|
+
|
44
|
+
%br
|
45
|
+
%button.btn.run_logic{"aria-hidden" => "true", "data-dismiss" => "modal"}
|
46
|
+
Run
|
47
|
+
%i.icon-play
|
48
|
+
.loaderImage{:style=>"display:none;"}
|
49
|
+
Loading...
|
50
|
+
|
51
|
+
|
52
|
+
%br
|
53
|
+
%br
|
54
|
+
.well{:style=>"position:relative;"}
|
55
|
+
%small{:style=>"padding:3px 6px; font-size:10px; background:#dfdfdf; position:absolute; top:0; right:0;"} Logic Output
|
56
|
+
.row-fluid
|
57
|
+
.span6
|
58
|
+
%strong Quantified Result:
|
59
|
+
%br
|
60
|
+
.quantified_result
|
61
|
+
|
62
|
+
.span6
|
63
|
+
%strong Detailed Result
|
64
|
+
%br
|
65
|
+
.detailed_results
|
66
|
+
|
67
|
+
%tbody
|
68
|
+
- if @metric.sort
|
69
|
+
.control-group
|
70
|
+
%label.control-label{:for => "title"} Sort Order
|
71
|
+
.controls
|
72
|
+
= f.text_field :sort, :value => @metric.sort
|
73
|
+
|
74
|
+
|
75
|
+
.control-group
|
76
|
+
%label.control-label{:for => "metric_description"} Description
|
77
|
+
.controls
|
78
|
+
= f.text_area :description, :class=>"input-block-level", :placeholder => "description", :value => @metric.description, :rows => 4
|
79
|
+
|
80
|
+
.control-group
|
81
|
+
%label.control-label{:for => "description"} Technical Explanation
|
82
|
+
.controls
|
83
|
+
= f.text_area :description, :class=>"input-block-level", :placeholder => "Technical Explanation", :value => @metric.technical_explanation, :rows => 4
|
84
|
+
|
85
|
+
.control-group
|
86
|
+
.controls
|
87
|
+
= f.submit "Create Metric", :class => 'btn btn-primary'
|
88
|
+
|
89
|
+
- content_for :footer do
|
90
|
+
:javascript
|
91
|
+
$(document).ready(function() {
|
92
|
+
|
93
|
+
$("#metric_title").on("blur", function(){
|
94
|
+
$("#metric_name").val( $("#metric_name").data('type') + "_" + this.value.replace(/[^A-Z0-9]/ig, "_").toLowerCase());
|
95
|
+
});
|
96
|
+
|
97
|
+
var editor = ace.edit("metric_logic");
|
98
|
+
$('.my-code-area').val(editor.getValue());
|
99
|
+
});
|
100
|
+
$('#metric_logic').ace({ theme: 'twilight', lang: 'ruby' })
|
101
|
+
|
102
|
+
$('.run_logic').on('click', function(){
|
103
|
+
var editor_contents = $('.my-code-area').val();
|
104
|
+
$('.loaderImage').show();
|
105
|
+
|
106
|
+
$('.quantified_result').html('');
|
107
|
+
$('.detailed_results').html('');
|
108
|
+
|
109
|
+
$.ajax(
|
110
|
+
{
|
111
|
+
type: "POST",
|
112
|
+
url: "/admin/metrics/1/evaluate.js",
|
113
|
+
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
|
114
|
+
contentType: "application/json; charset=utf-8",
|
115
|
+
data: JSON.stringify({logic: editor_contents , logic_staff: $("#logic_staff").val() }),
|
116
|
+
success: function(data){
|
117
|
+
$('.loaderImage').hide();
|
118
|
+
|
119
|
+
},
|
120
|
+
error: function (response) {
|
121
|
+
$('.loaderImage').hide();
|
122
|
+
}
|
123
|
+
}
|
124
|
+
);
|
125
|
+
return false;
|
126
|
+
});
|
@@ -0,0 +1,74 @@
|
|
1
|
+
<div class="container">
|
2
|
+
<h1 class="pagetitle"><%= @metric.title %></h1>
|
3
|
+
|
4
|
+
<table class="table table-striped table-bordered">
|
5
|
+
<tr>
|
6
|
+
<td>Description:</td>
|
7
|
+
<td><%= @metric.description %></td>
|
8
|
+
</tr>
|
9
|
+
<tr>
|
10
|
+
<td>Status:</td>
|
11
|
+
<td><%= @metric.status %></td>
|
12
|
+
</tr>
|
13
|
+
<tr>
|
14
|
+
<td>Explanation:</td>
|
15
|
+
<td><%= @metric.explanation %></td>
|
16
|
+
</tr>
|
17
|
+
<tr>
|
18
|
+
<td>Has Detail View:</td>
|
19
|
+
<td><%= @metric.has_detail %></td>
|
20
|
+
</tr>
|
21
|
+
<tr>
|
22
|
+
<td valign="top">Explanation:</td>
|
23
|
+
<td><%= @metric.explanation %></td>
|
24
|
+
</tr>
|
25
|
+
<tr>
|
26
|
+
<td valign="top">Technical Explanation:</td>
|
27
|
+
<td><%= @metric.technical_explanation %></td>
|
28
|
+
</tr>
|
29
|
+
</table>
|
30
|
+
|
31
|
+
<div class="metric-notes-container">
|
32
|
+
<h2>Notes:</h2>
|
33
|
+
|
34
|
+
<hr />
|
35
|
+
<div class="row">
|
36
|
+
<div class="note-entry-form well span4 pull-right" style="float:right;">
|
37
|
+
<h3>Create a Note</h3>
|
38
|
+
<hr />
|
39
|
+
<% form_for ["new_metric_notes", @metricnote], :url => { :controller =>'metric_notes' } do |f| %>
|
40
|
+
|
41
|
+
<%= f.hidden_field :user_id, :value => current_user.id %>
|
42
|
+
<%= f.hidden_field :metric_id, :value => @metric.id %>
|
43
|
+
|
44
|
+
<p><%= f.label :title %>
|
45
|
+
<%= f.text_field :title %></p>
|
46
|
+
|
47
|
+
<p><%= f.label :content %>
|
48
|
+
<%= f.text_field :content %></p>
|
49
|
+
|
50
|
+
|
51
|
+
<p><%= f.submit "Create" %></p>
|
52
|
+
<% end %>
|
53
|
+
|
54
|
+
</div>
|
55
|
+
|
56
|
+
<div class="metric-notes-list span7" style="float:left;">
|
57
|
+
<% if @metric.metric_notes.any? %>
|
58
|
+
<% @metric.metric_notes.reverse.each do |note| %>
|
59
|
+
<div class="well">
|
60
|
+
<span class="pull-right"><%= note.created_at.strftime("%m/%d/%Y at %I:%M%p") %></span>
|
61
|
+
<strong><%= note.title %></strong><br />
|
62
|
+
<%= note.content %>
|
63
|
+
</div>
|
64
|
+
<% end %>
|
65
|
+
<% else %>
|
66
|
+
<h2>No notes for this metric</h2>
|
67
|
+
<% end %>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
|
71
|
+
</div>
|
72
|
+
|
73
|
+
|
74
|
+
</div>
|
data/config
ADDED
data/hooks/ctags
ADDED
data/hooks/post-checkout
ADDED
data/hooks/post-commit
ADDED
data/hooks/post-merge
ADDED
data/hooks/post-rewrite
ADDED
data/lib/metric_admin.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require "metric_admin/version"
|
2
|
+
|
3
|
+
module MetricAdmin
|
4
|
+
class << self
|
5
|
+
attr_accessor :logger
|
6
|
+
attr_accessor :configuration
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.configure
|
10
|
+
self.configuration ||= Configuration.new
|
11
|
+
yield(configuration)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.logger
|
15
|
+
@logger ||= Logger.new($stdout).tap do |log|
|
16
|
+
log.progname = self.name
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Configuration
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'metric_admin/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "metric_admin"
|
8
|
+
spec.version = MetricAdmin::VERSION
|
9
|
+
spec.authors = ["Analytics For Lawyers"]
|
10
|
+
spec.email = ["matt@analyticsforlawyers.com","brandon@analyticsforlawyers.com"]
|
11
|
+
spec.summary = %q{Gem that builds and edits metrics.}
|
12
|
+
spec.description = %q{Build and edit metrics.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.4.2"
|
23
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'metric_admin'
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: metric_admin
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Analytics For Lawyers
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 10.4.2
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 10.4.2
|
41
|
+
description: Build and edit metrics.
|
42
|
+
email:
|
43
|
+
- matt@analyticsforlawyers.com
|
44
|
+
- brandon@analyticsforlawyers.com
|
45
|
+
executables: []
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- ".gitignore"
|
50
|
+
- Gemfile
|
51
|
+
- HEAD
|
52
|
+
- LICENSE.txt
|
53
|
+
- README.md
|
54
|
+
- Rakefile
|
55
|
+
- app/controllers/admin/metrics_controller.rb
|
56
|
+
- app/views/admin/metrics/edit.haml
|
57
|
+
- app/views/admin/metrics/evaluate.js.erb
|
58
|
+
- app/views/admin/metrics/index.haml
|
59
|
+
- app/views/admin/metrics/new.html.haml
|
60
|
+
- app/views/admin/metrics/show.html.erb
|
61
|
+
- config
|
62
|
+
- hooks/ctags
|
63
|
+
- hooks/post-checkout
|
64
|
+
- hooks/post-commit
|
65
|
+
- hooks/post-merge
|
66
|
+
- hooks/post-rewrite
|
67
|
+
- lib/metric_admin.rb
|
68
|
+
- lib/metric_admin/version.rb
|
69
|
+
- metric_admin.gemspec
|
70
|
+
- rails/init.rb
|
71
|
+
homepage: ''
|
72
|
+
licenses:
|
73
|
+
- MIT
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.4.6
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: Gem that builds and edits metrics.
|
95
|
+
test_files: []
|