Work on list paging - not complete, but promising
This commit is contained in:
		
							parent
							
								
									48c8b6445b
								
							
						
					
					
						commit
						96c273ee06
					
				
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							|  | @ -11,3 +11,7 @@ pom.xml.asc | |||
| .hg/ | ||||
| 
 | ||||
| resources/auto/ | ||||
| 
 | ||||
| generated/resources/sql/ | ||||
| 
 | ||||
| generated/src/clj/youyesyet/routes/ | ||||
|  |  | |||
|  | @ -69,7 +69,9 @@ | |||
|       (vector 'r) | ||||
|       (list 'let (vector | ||||
|                    'p | ||||
|                    (list 'support/massage-params (list :params 'r))) | ||||
|                    (list 'merge | ||||
|                          {:offset 0 :limit 25} | ||||
|                          (list 'support/massage-params (list :params 'r)))) | ||||
|             ;; TODO: we must take key params out of just params, | ||||
|             ;; but we should take all other params out of form-params - because we need the key to | ||||
|             ;; load the form in the first place, but just accepting values of other params would | ||||
|  | @ -86,6 +88,8 @@ | |||
|                   (reduce | ||||
|                     merge | ||||
|                     {:record | ||||
|                      ;; TODO: this breaks. We need to check for the presence of the | ||||
|                      ;; actual key in the params. | ||||
|                      (list 'if (list 'empty? (list 'remove 'nil? (list 'vals 'p))) [] | ||||
|                            (list | ||||
|                              (symbol | ||||
|  |  | |||
|  | @ -39,7 +39,7 @@ | |||
|   {:tag :div | ||||
|    :attrs {:class "big-link-container"} | ||||
|    :content | ||||
|    [{:tag :a :attrs {:href url} | ||||
|    [{:tag :a :attrs {:href url :class "big-link"} | ||||
|      :content (if | ||||
|                 (vector? content) | ||||
|                 content | ||||
|  | @ -62,22 +62,24 @@ | |||
|   ([filename application k] | ||||
|    (emit-content filename nil nil application k)) | ||||
|   ([filename spec entity application k] | ||||
|    (let [content (:content | ||||
|                    (first | ||||
|                      (or (children-with-tag spec k) | ||||
|                          (children-with-tag entity k) | ||||
|                          (children-with-tag | ||||
|                            (first | ||||
|                              (children-with-tag application :content)) | ||||
|                            k))))] | ||||
|    (let [content | ||||
|          (:content | ||||
|           (first | ||||
|            (or (children-with-tag spec k) | ||||
|                (children-with-tag entity k) | ||||
|                (children-with-tag | ||||
|                 (child-with-tag application :content) | ||||
|                 k))))] | ||||
|      (if | ||||
|        content | ||||
|        (list | ||||
|        (flatten | ||||
|         (list | ||||
|          (str "{% block " (name k) " %}") | ||||
|          (map | ||||
|          (doall | ||||
|           (map | ||||
|            #(with-out-str (x/emit-element %)) | ||||
|            content) | ||||
|          "{% endblock %}"))))) | ||||
|            content)) | ||||
|          "{% endblock %}")))))) | ||||
| 
 | ||||
| 
 | ||||
| (defn file-header | ||||
|  | @ -448,7 +450,7 @@ | |||
|             :content | ||||
|             [{:tag :input | ||||
|               :attrs {:type "submit" | ||||
|                       :id "search" | ||||
|                       :id "search-widget" | ||||
|                       :value "Search"}}]})))}]}) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -504,35 +506,6 @@ | |||
|     "{% endfor %}"]}) | ||||
| 
 | ||||
| 
 | ||||
| (defn- list-page-control | ||||
|   "What this needs to do is emit an HTML control which, when selected, requests the | ||||
|   next or previous page keeping the same search parameters; so it essentially needs | ||||
|   to be a submit button, not a link." | ||||
|   [forward?] | ||||
|   {:tag :div | ||||
|    :attrs {:class (if forward? "big-link-container" "back-link-container")} | ||||
|    :content | ||||
|    [{:tag :input | ||||
|      :attrs {:id "page" | ||||
|              :name "page" | ||||
|              :disabled (if | ||||
|                          forward? | ||||
|                          false | ||||
|                          "{% ifequal offset 0 %} false {% else %} true {% endifequal %}") | ||||
|              ;; TODO: real thought needs to happen on doing i18n for this! | ||||
|              :value (if forward? "Next" "Previous")}}]}) | ||||
| 
 | ||||
| 
 | ||||
| (defn- list-tfoot | ||||
|   "Return a table footer element for the list view for this `list-spec` of this `entity` within | ||||
|   this `application`." | ||||
|   [list-spec entity application] | ||||
|   {:tag :tfoot | ||||
|    :content | ||||
|    [(list-page-control false) | ||||
|     (list-page-control true)]}) | ||||
| 
 | ||||
| 
 | ||||
| (defn list-to-template | ||||
|   "Generate a template as specified by this `list` element for this `entity`, | ||||
|   taken from this `application`. If `list` is nill, generate a default list | ||||
|  | @ -544,7 +517,22 @@ | |||
|          (:name (:attrs entity)) | ||||
|          "-" | ||||
|          (:name (:attrs list-spec)))] | ||||
|     {:big-links | ||||
|     {:back-links | ||||
|      {:tag :div | ||||
|       :content | ||||
|       [ | ||||
|        {:tag :div :attrs {:class "back-link-container"} | ||||
|         :content | ||||
|         ["{% ifunequal offset 0 %}" | ||||
|          {:tag :a :attrs {:id "prev-selector" :class "back-link"} | ||||
|           :content ["Previous"]} | ||||
|          "{% else %}" | ||||
|          {:tag :a | ||||
|           :attrs {:id "back-link" :class "back-link" :href "{{servlet-context}}/admin"} | ||||
|           :content ["Back"]} | ||||
|          "{% endifunequal %}"]} | ||||
|        ]} | ||||
|      :big-links | ||||
|      {:tag :div | ||||
|       :content | ||||
|       [{:tag :div :attrs {:class "big-link-container"} | ||||
|  | @ -558,25 +546,36 @@ | |||
|               :action (str "{{servlet-context}}/" form-name) | ||||
|               :method "POST"} | ||||
|       :content | ||||
|       [ | ||||
|        (csrf-widget) | ||||
|        {:tag :input :attrs {:id "offset" :type "hidden" :value "{{offset|0}}"}} | ||||
|        {:tag :input :attrs {:id "limit" :type "hidden" :value "{{limit|50}}"}} | ||||
|        (big-link (str "Add a new " (pretty-name entity)) (editor-name entity application)) | ||||
|       [(csrf-widget) | ||||
|        {:tag :input :attrs {:id "offset" :type "hidden" :value "{{params.offset|default:0}}"}} | ||||
|        {:tag :input :attrs {:id "limit" :type "hidden" :value "{{params.limit|default:50}}"}} | ||||
|        {:tag :table | ||||
|         :attrs {:caption (:name (:attrs entity))} | ||||
|         :content | ||||
|         [(list-thead list-spec entity application) | ||||
|          (list-tbody list-spec entity application) | ||||
|          (list-tfoot list-spec entity application)]}]} | ||||
|           [(list-thead list-spec entity application) | ||||
|            (list-tbody list-spec entity application) | ||||
|            ]}]} | ||||
|      :extra-script | ||||
|      (str "var form = document.getElementById('" form-name "'); | ||||
|      (str " | ||||
|           var form = document.getElementById('" form-name "'); | ||||
|           var ow = document.getElementById('offset'); | ||||
|           var lw = document.getElementById('limit'); | ||||
|           form.addEventListener('submit', function() { | ||||
|             ow.value='0'; | ||||
|           }); | ||||
| 
 | ||||
|           {% ifunequal offset 0 %} | ||||
|           document.getElementById('prev-selector').addEventListener('click', function () { | ||||
|             ow.value=(parseInt(ow.value)-parseInt(lw.value)); | ||||
|             console.log('Updated offset to ' + ow.value); | ||||
|             form.submit(); | ||||
|           }); | ||||
|           {% endifunequal %} | ||||
| 
 | ||||
|           document.getElementById('next-selector').addEventListener('click', function () { | ||||
|           ow.text=(parseInt(ow.text)+parseInt(lw.text)); | ||||
|           //form.submit(); | ||||
|             ow.value=(parseInt(ow.value)+parseInt(lw.value)); | ||||
|             console.log('Updated offset to ' + ow.value); | ||||
|             form.submit(); | ||||
|           });")})) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -621,15 +620,16 @@ | |||
|   (let | ||||
|     [first-class-entities | ||||
|      (sort-by | ||||
|        #(:name (:attrs %)) | ||||
|        (filter | ||||
|          #(children-with-tag % :list) | ||||
|          (children-with-tag application :entity)))] | ||||
|     {:content | ||||
|      {:tag :dl | ||||
|       :attrs {:class "index"} | ||||
|       :content | ||||
|       (apply | ||||
|       #(:name (:attrs %)) | ||||
|       (filter | ||||
|        #(children-with-tag % :list) | ||||
|        (children-with-tag application :entity)))] | ||||
|     {:application-index | ||||
|      {:content | ||||
|       {:tag :dl | ||||
|        :attrs {:class "index"} | ||||
|        :content | ||||
|        (apply | ||||
|         vector | ||||
|         (interleave | ||||
|          (map | ||||
|  | @ -651,60 +651,55 @@ | |||
|                           :tag :p | ||||
|                           :content (:content d))) | ||||
|                        (children-with-tag % :documentation)))) | ||||
|           first-class-entities)))}})) | ||||
|           first-class-entities)))}}})) | ||||
| 
 | ||||
| 
 | ||||
| (defn write-template-file | ||||
|   [filename template application] | ||||
|   (if | ||||
|     template | ||||
|     (try | ||||
|       (spit | ||||
|        (str *output-path* filename) | ||||
|        (s/join | ||||
|         "\n" | ||||
|         (flatten | ||||
|          (list | ||||
|           (file-header filename application) | ||||
|           (doall | ||||
|            (map | ||||
|             #(let [content (template %)] | ||||
|                (list | ||||
|                 (str "{% block " (name %) " %}") | ||||
|                 (cond (string? content) | ||||
|                       content | ||||
|                       (map? content) | ||||
|                       (with-out-str | ||||
|                         (x/emit-element content)) | ||||
|                       true | ||||
|                       (str "<!-- don't know what to do with '" content "' -->")) | ||||
|                 "{% endblock %}") | ||||
|                (keys template)))) | ||||
|           (file-footer filename application))))) | ||||
|       (catch Exception any | ||||
|         (spit | ||||
|           filepath | ||||
|           (s/join | ||||
|   (let [filepath (str *output-path* "resources/templates/auto/" filename)] | ||||
|     (if | ||||
|       template | ||||
|       (try | ||||
|         (do | ||||
|           (spit | ||||
|            filepath | ||||
|            (s/join | ||||
|             "\n" | ||||
|             (list | ||||
|             (flatten | ||||
|              (list | ||||
|               (file-header filename application) | ||||
|               (with-out-str | ||||
|                 (x/emit-element template)) | ||||
|               (file-footer filename application)))) | ||||
|         (if (> *verbosity* 0) (println "\tGenerated " filepath)) | ||||
|               (doall | ||||
|                (map | ||||
|                 #(let [content (template %)] | ||||
|                    (list | ||||
|                     (str "{% block " (name %) " %}") | ||||
|                     (cond (string? content) | ||||
|                           content | ||||
|                           (map? content) | ||||
|                           (with-out-str | ||||
|                             (x/emit-element content)) | ||||
|                           true | ||||
|                           (str "<!-- don't know what to do with '" content "' -->")) | ||||
|                     "{% endblock %}")) | ||||
|                    (keys template))) | ||||
|               (file-footer filename application))))) | ||||
|           (if (> *verbosity* 0) (println "\tGenerated " filepath))) | ||||
|         (catch Exception any | ||||
|           (let [report (str | ||||
|                          "ERROR: Exception " | ||||
|                          (.getName (.getClass any)) | ||||
|                          (.getMessage any) | ||||
|                          " while printing " | ||||
|                          filename)] | ||||
|             (spit | ||||
|               filepath | ||||
|               (with-out-str | ||||
|                 (println (str "<!-- " report "-->")) | ||||
|                 (p/pprint template))) | ||||
|             (println report))))) | ||||
|                         "ERROR: Exception " | ||||
|                         (.getName (.getClass any)) | ||||
|                         (.getMessage any) | ||||
|                         " while printing " | ||||
|                         filepath)] | ||||
|             (try | ||||
|               (spit | ||||
|                filepath | ||||
|                (with-out-str | ||||
|                  (println (str "<!-- " report "-->")) | ||||
|                  (p/pprint template))) | ||||
|               (catch Exception _ nil)) | ||||
|             (println report) | ||||
|             (throw any))))) | ||||
|     (str filepath))) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue