Megatest

Artifact [d888a50158]
Login

Artifact d888a501589c0b30127dbb25ef47862be0a748f4:


;;======================================================================
;; Copyright 2017, Matthew Welland.
;; 
;;  This program is made available under the GNU GPL version 2.0 or
;;  greater. See the accompanying file COPYING for details.
;; 
;;  This program is distributed WITHOUT ANY WARRANTY; without even the
;;  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
;;  PURPOSE.
;;======================================================================

(define (pages:index session db shared)
  (let* ((dbh         (s:db))
	 (ttypes      (pgdb:get-target-types dbh))
	 (selected    (string->number (or (s:session-var-get "target-type") "0")))
	 (curr-trec   (filter (lambda (x)(eq? selected (vector-ref x 0))) ttypes))
	 (curr-ttype  (if (and selected
			       (not (null? curr-trec)))
			  (vector-ref (car curr-trec) 1) #f))
	 (all-parts   (if curr-ttype (append (string-split curr-ttype "/") '("runname" "testname")) '()))
	 (tfilter     (or (s:session-var-get "target-filter") "%"))
	 (targets     (pgdb:get-targets-of-type dbh selected tfilter))
	 ;; (target      (s:session-var-get "target"))
	 ;; (target-patt (or target "%"))
	 (row-or-col  (string-split (or (s:session-var-get "row-or-col") "") ","))
	 (all-data    (if selected (pgdb:get-stats-given-target dbh selected tfilter)
			  '()))
	 ;; (all-data    (pgdb:get-tests dbh tfilter))
	 (ordered-data (pgdb:coalesce-runs dbh all-data all-parts row-or-col 0)))
    
    (list
     "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
     (s:html
      (s:title (conc "Megatest")) 
      (s:head
       index:kickstart-junk
       ) 
      (s:body
       ;; (s:session-var-get "target-type")
       ;; (conc " selected = " selected ", ttypes = " ttypes ", curr-ttype = " curr-ttype ", curr-trec = " curr-trec)
       ;; (conc (hash-table->alist ordered-data))
       (s:div 'class "grid flex" 'id "top_of_page"
	      ;; add visible to columns to help visualize them e.g. "col_12 visible"
	      ;; BEGINNING OF HEADER
	      (s:div 'class "col_12"
		     (s:fieldset
		      "Area type and target filter"
		      (s:form
		       'action "index.filter" 'method "post"
		       (s:div 'class "col_12"
			      (s:select (map (lambda (x)
					       (let ((tt-id (vector-ref x 0))
						     (ttype (vector-ref x 1)))
						 (if (eq? tt-id selected)
						     (list ttype tt-id ttype #t)
						     (list ttype tt-id ttype #f))))
					     ttypes)
					'name 'target-type)
			      (s:input-preserve 'name "tfilter" 'placeholder "Filter targets")
			      (s:input 'type "submit" 'name "set-filter-vals" 'value "Submit" 'class "col_3"))
		       ;; use radio buttons to select whether to put this identifier in row or column.
		       ;; this seems clumsly and takes up a lot of screen realestate
		       ;; (s:div 'class "col_12"
		       ;; 	      (s:div 'class "col_1" "identifier")
		       ;; 	      (map (lambda (target-var)
		       ;; 		     (s:div 'class "col_1" target-var))
		       ;; 		   all-parts))
		       ;; (s:div 'class "col_12"
		       ;; 	      (s:div 'class "col_1" "row")
		       ;; 	      (map (lambda (target-var)
		       ;; 		     (s:div 'class "col_1" (s:input 'type "checkbox" 'name "row-or-col" 'value target-var
		       ;; 						    ;; this silly trick preserves the checkmark
		       ;; 						    (if (member target-var row-or-col) 'checked "")
		       ;; 						    "")))
		       ;; 		   all-parts))
		       ))
		     (s:fieldset
		      (conc "Runs data for " tfilter)
		      ;;
		      ;; A very basic display
		      ;;
		      (let* ((a-keys (sort (hash-table-keys ordered-data) string>=?))
			     (b-keys (sort (apply
					      append
					      (map (lambda (sub-key)
						     (let ((subdat (hash-table-ref ordered-data sub-key)))
						       (hash-table-keys subdat)))
						   a-keys))
					   string>=?)))
			(if #f ;; swap rows/cols
			    (s:table
			     (s:tr (s:td "")(map s:tr b-keys))
			     (map
			      (lambda (row-key)
				(let ((subdat (hash-table-ref ordered-data row-key)))
				  (s:tr (s:td row-key)
					(map
					 (lambda (col-key)
					   (s:td (let ((dat (hash-table-ref/default subdat col-key #f)))
						   (s:td (if dat
							     (list (vector-ref dat 1) (vector-ref dat 0))
							     "")))))
					 b-keys))))
			      a-keys))
			    (s:table
			     (s:tr (s:td "")(map s:td a-keys))
			     (map
			      (lambda (row-key)
				(s:tr (s:td row-key)
				      (map
				       (lambda (col-key)
					 (let ((val (let* ((ht  (hash-table-ref/default ordered-data col-key #f)))
						      (if ht (hash-table-ref/default ht row-key #f)))))
					   (if val
					       (let* ((total (vector-ref val 1))
						      (pass  (vector-ref val 2))
						      (fail  (vector-ref val 3))
						      (other (vector-ref val 4))
						      (passper (round (* (/ pass total) 100)))
						      (failper (- 100 passper)))
						 (s:td 'style (conc "background: linear-gradient(to right, green " passper "%, red " failper "%);")
						       (conc total "/" pass "/" fail "/" other)))
					       (s:td ""))))
				       a-keys)))
			      b-keys))))))
		     
	      ;;(map (lambda (area)
	      ;;	     (s:p "data=" (conc area)))
	      ;;	   ;; (pgdb:get-tests dbh tfilter))
	      ;;	   (pgdb:get-stats-given-target dbh tfilter))
	      
	      
	      
	      
	      index:jquery
	      index:javascript
	      ))))))

  
		       ;; 	  (s:div 'class "col_12"
		       ;; 		 (s:div 'class "col_1" "row")
		       ;; 		 (map (lambda (target-var)
		       ;; 			(s:div 'class "col_1" (s:input 'type "radio" 'name target-var 'value "row")))
		       ;; 		      all-parts))
		       ;; 	  (s:div 'class "col_12"
		       ;; 		 (s:div 'class "col_1" "col")
		       ;; 		 (map (lambda (target-var)
		       ;; 			(s:div 'class "col_1" (s:input 'type "radio" 'name target-var 'value "col")))
		       ;; 		      all-parts)))
		       ;; 	 '())
		       ;; (s:h1 (s:session-var-get "target-type"))

	 ;; (s:select (map (lambda (x)
  ;; 		      (let ((t (vector-ref x 0)))
  ;; 			(list t t t (equal? t target))))
  ;; 		    targets)
  ;; 	       'name  'target)