|
502 | 502 | ::clerk/page-size 5
|
503 | 503 | ::clerk/width :full} wv)))))
|
504 | 504 |
|
| 505 | +(def table-viewers [table-head-viewer |
| 506 | + table-body-viewer |
| 507 | + table-markup-viewer |
| 508 | + table-row-viewer]) |
| 509 | + |
505 | 510 | (def viewer
|
506 |
| - (assoc viewer/table-viewer |
507 |
| - :transform-fn |
508 |
| - (fn transform-fn [{:as wrapped-value :nextjournal/keys [applied-viewer render-opts]}] |
509 |
| - (let [#?@(:clj [id (or (:id wrapped-value) |
510 |
| - (symbol (str (ns-name *ns*)) (str (gensym)))) |
511 |
| - var-name (symbol (namespace id) (str (name id) "-table"))]) |
512 |
| - _ #?(:clj (when-not (resolve var-name) |
513 |
| - (when-some [ns' (find-ns (symbol (namespace var-name)))] |
514 |
| - (intern ns' (symbol (name var-name)) (doto (atom {:active-filters {}}) |
515 |
| - (add-watch ::recompute |
516 |
| - (fn [_ _ _ _] |
517 |
| - (nextjournal.clerk/recompute!))))))) |
518 |
| - :cljs nil) |
519 |
| - table-state #?(:clj @@(resolve var-name) |
520 |
| - :cljs nil)] |
521 |
| - |
522 |
| - (if-let [{:keys [head rows summary filter-data autocomplete-data state]} |
523 |
| - (normalize-table-data (merge render-opts table-state) |
524 |
| - (viewer/->value wrapped-value))] |
525 |
| - (-> wrapped-value |
526 |
| - (assoc :nextjournal/viewer table-markup-viewer) |
527 |
| - (update :nextjournal/width #(or % :wide)) |
528 |
| - (update :nextjournal/render-opts merge {:num-cols (count (or head (first rows))) |
529 |
| - #?@(:clj [:sync-var (viewer/->viewer-eval |
530 |
| - (list 'nextjournal.clerk.render/intern-atom! |
531 |
| - (list 'quote var-name) table-state))]) |
532 |
| - :number-col? (into #{} |
533 |
| - (comp (map-indexed vector) |
534 |
| - (keep #(when (number? (second %)) (first %)))) |
535 |
| - (not-empty (first rows))) |
536 |
| - :summary summary |
537 |
| - :initial-table-state table-state |
538 |
| - :filter-data filter-data |
539 |
| - :autocomplete-data autocomplete-data |
540 |
| - :state state}) |
541 |
| - (update :nextjournal/render-opts dissoc :computed-columns :pre-process-stats) |
542 |
| - (assoc :nextjournal/value (cond->> [(viewer/with-viewer table-body-viewer (merge (-> applied-viewer |
543 |
| - (select-keys [:page-size]) |
544 |
| - (set/rename-keys {:page-size :nextjournal/page-size})) |
545 |
| - (select-keys wrapped-value [:nextjournal/page-size])) |
546 |
| - (if (seq rows) |
547 |
| - (map (partial viewer/with-viewer table-row-viewer) rows) |
548 |
| - [(viewer/html [:span.italic "this table has no rows"])]))] |
549 |
| - head (cons (viewer/with-viewer (:name table-head-viewer table-head-viewer) head))))) |
550 |
| - (-> wrapped-value |
551 |
| - viewer/mark-presented |
552 |
| - (assoc :nextjournal/width :wide) |
553 |
| - (assoc :nextjournal/value [(viewer/present wrapped-value)]) |
554 |
| - (assoc :nextjournal/viewer {:render-fn 'nextjournal.clerk.render/render-table-error}))))))) |
| 511 | + (-> viewer/table-viewer |
| 512 | + (assoc :transform-fn |
| 513 | + (fn transform-fn [{:as wrapped-value :nextjournal/keys [applied-viewer render-opts]}] |
| 514 | + (let [#?@(:clj [id (or (:id wrapped-value) |
| 515 | + (symbol (str (ns-name *ns*)) (str (gensym)))) |
| 516 | + var-name (symbol (namespace id) (str (name id) "-table")) |
| 517 | + _ (when-not (resolve var-name) |
| 518 | + (when-some [ns' (find-ns (symbol (namespace var-name)))] |
| 519 | + (intern ns' (symbol (name var-name)) (doto (atom {:active-filters {}}) |
| 520 | + (add-watch ::recompute |
| 521 | + (fn [_ _ _ _] |
| 522 | + (nextjournal.clerk/recompute!)))))))]) |
| 523 | + table-state #?(:clj @@(resolve var-name) |
| 524 | + :cljs nil)] |
| 525 | + |
| 526 | + (if-let [{:keys [head rows summary filter-data autocomplete-data state]} |
| 527 | + (normalize-table-data (merge render-opts table-state) |
| 528 | + (viewer/->value wrapped-value))] |
| 529 | + (-> wrapped-value |
| 530 | + (assoc :nextjournal/viewer table-markup-viewer) |
| 531 | + (update :nextjournal/width #(or % :wide)) |
| 532 | + (update :nextjournal/render-opts merge {:num-cols (count (or head (first rows))) |
| 533 | + #?@(:clj [:sync-var (viewer/->viewer-eval |
| 534 | + (list 'nextjournal.clerk.render/intern-atom! |
| 535 | + (list 'quote var-name) table-state))]) |
| 536 | + :number-col? (into #{} |
| 537 | + (comp (map-indexed vector) |
| 538 | + (keep #(when (number? (second %)) (first %)))) |
| 539 | + (not-empty (first rows))) |
| 540 | + :summary summary |
| 541 | + :initial-table-state table-state |
| 542 | + :filter-data filter-data |
| 543 | + :autocomplete-data autocomplete-data |
| 544 | + :state state}) |
| 545 | + (update :nextjournal/render-opts dissoc :computed-columns :pre-process-stats) |
| 546 | + (assoc :nextjournal/value (cond->> [(viewer/with-viewer table-body-viewer (merge (-> applied-viewer |
| 547 | + (select-keys [:page-size]) |
| 548 | + (set/rename-keys {:page-size :nextjournal/page-size})) |
| 549 | + (select-keys wrapped-value [:nextjournal/page-size])) |
| 550 | + (if (seq rows) |
| 551 | + (map (partial viewer/with-viewer table-row-viewer) rows) |
| 552 | + [(viewer/html [:span.italic "this table has no rows"])]))] |
| 553 | + head (cons (viewer/with-viewer (:name table-head-viewer table-head-viewer) head))))) |
| 554 | + (-> wrapped-value |
| 555 | + viewer/mark-presented |
| 556 | + (assoc :nextjournal/width :wide) |
| 557 | + (assoc :nextjournal/value [(viewer/present wrapped-value)]) |
| 558 | + (assoc :nextjournal/viewer {:render-fn 'nextjournal.clerk.render/render-table-error})))))) |
| 559 | + (update :add-viewers (fn [v] (concat (filter (fn [{:keys [name]}] (not (contains? (set (map :name table-viewers)) name))) v) |
| 560 | + table-viewers))))) |
555 | 561 |
|
556 | 562 | #_(viewer/reset-viewers! :default
|
557 | 563 | (viewer/add-viewers (viewer/get-default-viewers)
|
|
0 commit comments