Ver Fonte

enhance(capacitor): set up classic block editor

charlie há 5 meses atrás
pai
commit
1caf0276f5

+ 5 - 1
gulpfile.js

@@ -110,12 +110,16 @@ const common = {
         'node_modules/katex/dist/fonts/*.woff2',
       ]).pipe(gulp.dest(path.join(outputPath, 'css', 'fonts'))),
       () => gulp.src([
+        'node_modules/marked/marked.min.js',
+        'node_modules/@highlightjs/cdn-assets/highlight.min.js',
         'node_modules/@ionic/core/dist/ionic/**',
         'node_modules/react/umd/react.production.min.js',
         'node_modules/react/umd/react.development.js',
         'node_modules/react-dom/umd/react-dom.production.min.js',
         'node_modules/react-dom/umd/react-dom.development.js',
-        'node_modules/prop-types/prop-types.min.js'
+        'node_modules/prop-types/prop-types.min.js',
+        'node_modules/interactjs/dist/interact.min.js',
+        'packages/ui/dist/ui.js',
       ]).pipe(gulp.dest(path.join(outputPath, 'capacitor', 'js'))),
       () => gulp.src([
         'node_modules/@logseq/sqlite-wasm/sqlite-wasm/jswasm/sqlite3.wasm',

+ 5 - 0
resources/capacitor/index.html

@@ -9,11 +9,16 @@
 </head>
 <body>
 <div id="root"></div>
+<script defer src="./js/highlight.min.js"></script>
+<script defer src="./js/interact.min.js"></script>
+<script defer src="./js/marked.min.js"></script>
+<script defer src="./js/eventemitter3.umd.min.js"></script>
 <script defer src="./js/react.production.min.js"></script>
 <script defer src="./js/react-dom.production.min.js"></script>
 <script defer src="./js/prop-types.min.js"></script>
 <script defer type="module" src="./js/ionic.esm.js"></script>
 <script defer src="./js/tabler-icons-react.min.js"></script>
+<script defer src="./js/ui.js"></script>
 <script defer src="./shared.js"></script>
 <script defer src="./main.js"></script>
 <script>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
resources/capacitor/js/eventemitter3.umd.min.js


+ 3 - 0
shadow-cljs.edn

@@ -81,6 +81,9 @@
                                   :main
                                   {:init-fn capacitor.core/init
                                    :depends-on #{:shared}}
+                                  :code-editor
+                                  {:entries [frontend.extensions.code]
+                                   :depends-on #{:main}}
                                   :db-worker
                                   {:init-fn frontend.worker.db-worker/init
                                    :depends-on #{:shared}

+ 11 - 4
src/main/capacitor/app.cljs

@@ -3,8 +3,9 @@
             ["@capacitor/status-bar" :refer [StatusBar Style]]
             ["./externals.js"]
             [clojure.string :as string]
-            [frontend.db.react :as react]
-            [frontend.util :as util]
+            [logseq.shui.dialog.core :as shui-dialog]
+            [logseq.shui.popup.core :as shui-popup]
+            [logseq.shui.toaster.core :as shui-toaster]
             [rum.core :as rum]
             [frontend.rum :as frum]
             [promesa.core :as p]
@@ -202,7 +203,8 @@
     (rum/use-effect!
       (fn []
         (some-> js/window.externalsjs (.settleStatusBar))
-        (some-> js/window.externalsjs (.initGlobalListeners)))
+        (some-> js/window.externalsjs
+          (.initGlobalListeners #js {:onKeyboardHide (fn [] (state/exit-editing!))})))
       [current-repo])
 
     ;; navigation
@@ -235,4 +237,9 @@
 
       (keep-keyboard-open)
       (ui/install-notifications)
-      (ui/install-modals)]]))
+      (ui/install-modals)
+
+      (shui-toaster/install-toaster)
+      (shui-dialog/install-modals)
+      (shui-popup/install-popups)
+      ]]))

+ 17 - 14
src/main/capacitor/components/blocks.cljs

@@ -13,6 +13,7 @@
             [frontend.handler.page :as page-handler]
             [frontend.state :as fstate]
             [frontend.handler.notification :as notification]
+            [frontend.components.page :as cp-page]
             [capacitor.components.editor :as cc-editor]
             [capacitor.components.common :as cc-common]
             [capacitor.ionic :as ionic]))
@@ -337,17 +338,19 @@
       (ionic/ion-content {:class "ion-padding"}
         (if loading?
           [:p.text-xl.text-center "Loading ..."]
-          (let [edit-opts {:reload-page! rerender!}]
-            [:<>
-             (when-let [children (:block/_parent page)]
-               [:ul.mt-2
-                {:class "min-h-[80px]"}
-                (for [block children]
-                  [:li.text-xl {:on-click #(nav-to-edit-block! block edit-opts)} (:block/title block)])])
-             [:p.pt-3.flex
-              (ionic/ion-button
-                {:fill "outline"
-                 :on-click #(nav-to-edit-block! {:block/page page} edit-opts)
-                 :class "w-full"}
-                "+ Add")]]))
-        ))))
+          (cp-page/page-blocks-cp page {})
+          ;(let [edit-opts {:reload-page! rerender!}]
+          ;  [:<>
+          ;   (when-let [children (:block/_parent page)]
+          ;     [:ul.mt-2
+          ;      {:class "min-h-[80px]"}
+          ;      (for [block children]
+          ;        [:li.text-xl {:on-click #(nav-to-edit-block! block edit-opts)} (:block/title block)])])
+          ;   [:p.pt-3.flex
+          ;    (ionic/ion-button
+          ;      {:fill "outline"
+          ;       :on-click #(nav-to-edit-block! {:block/page page} edit-opts)
+          ;       :class "w-full"}
+          ;      "+ Add")]]
+          ;  )
+          )))))

+ 12 - 3
src/main/capacitor/components/common.cljs

@@ -1,5 +1,7 @@
-(ns capacitor.components.common
-  (:require [frontend.util :as utils]))
+(ns capacitor.components.common)
+
+(defn stop [e]
+  (when e (doto e (.preventDefault) (.stopPropagation))))
 
 (defn get-dom-block-uuid
   [^js el]
@@ -12,10 +14,17 @@
   [^js el]
   (some-> el (.closest "[part=scroll]")))
 
+(defn current-page-scroll
+  []
+  (some-> (js/document.querySelector "ion-nav > .ion-page:not(.ion-page-hidden)")
+    (.querySelector "ion-content")
+    (.-shadowRoot)
+    (.querySelector "[part=scroll]")))
+
 (defn keep-keyboard-open
   [^js e]
   (try
     (.keepKeyboardOpen js/window)
-    (some-> e (utils/stop))
+    (some-> e (stop))
     (catch js/Error e'
       (js/console.error e'))))

+ 1 - 1
src/main/capacitor/components/editor.cljs

@@ -45,7 +45,7 @@
                              (when on-delete!
                                (prn :debug "delete block:" content opts)
                                (on-delete! content opts))))
-          debounce-save-handle! (util/debounce save-handle! 500)]
+          debounce-save-handle! (util/debounce save-handle! 128)]
       (ui/textarea
         {:class "editor-aux-input bg-gray-200 border-none resize-none"
          :ref *input

+ 5 - 2
src/main/capacitor/core.cljs

@@ -1,8 +1,10 @@
 (ns capacitor.core
   (:require ["react-dom/client" :as rdc]
             [capacitor.app :as app]
-            [capacitor.bootstrap :as bootstrap]))
+            ;[capacitor.bootstrap :as bootstrap]
+            [frontend.handler :as fhandler]))
 
+(set! (. js/window -isCapacitorNew) true)
 (defonce ^js root (rdc/createRoot (.getElementById js/document "root")))
 
 (defn ^:export render!
@@ -14,7 +16,8 @@
   ;; this is called in the index.html and must be exported
   ;; so it is available even in :advanced release builds
   (prn "[capacitor-new] init!")
-  (bootstrap/start! render!))
+  ;(bootstrap/start! render!)
+  (fhandler/start! render!))
 
 (defn ^:export stop! []
   ;; stop is called before any code is reloaded

+ 12 - 3
src/main/capacitor/externals.js

@@ -3,14 +3,19 @@ import { Capacitor } from '@capacitor/core'
 import { StatusBar, Style } from '@capacitor/status-bar'
 import { App } from '@capacitor/app'
 
-function initGlobalListeners () {
+function initGlobalListeners (opts = {}) {
   console.debug('[externals] init global listeners')
 
   const didShowHandle = (event) => {
     const docHeight = document.documentElement.clientHeight
     const { keyboardHeight } = event
-    if (keyboardHeight === 0) return
-    document.body.style.height = (docHeight - keyboardHeight) + 'px'
+    const { onKeyboardShow } = opts
+
+    if (onKeyboardShow) onKeyboardShow(event)
+
+    if (keyboardHeight !== 0) {
+      document.body.style.height = (docHeight - keyboardHeight) + 'px'
+    }
 
     // const alertWrapper = document.querySelector('.alert-wrapper')
     // if (alertWrapper) {
@@ -22,6 +27,9 @@ function initGlobalListeners () {
   }
 
   const didHideHandle = () => {
+    const { onKeyboardHide } = opts
+    if (onKeyboardHide) onKeyboardHide()
+
     document.body.style.removeProperty('height')
 
     // const alertWrapper = document.querySelector('.alert-wrapper')
@@ -71,6 +79,7 @@ function checkCursorLine (textarea) {
 }
 
 window.externalsjs = {
+  Keyboard, Capacitor,
   initGlobalListeners,
   settleStatusBar,
   checkCursorLine,

+ 46 - 43
src/main/frontend/util.cljc

@@ -19,6 +19,7 @@
             [clojure.pprint]
             [dommy.core :as d]
             [frontend.mobile.util :as mobile-util]
+            [capacitor.components.common :as capacitor-new-common]
             [logseq.common.util :as common-util]
             [goog.dom :as gdom]
             [goog.object :as gobj]
@@ -37,10 +38,47 @@
    [clojure.string :as string]
    [clojure.walk :as walk]))
 
+#?(:cljs
+   (do
+     (def safe-re-find common-util/safe-re-find)
+     (defn safe-keyword
+       [s]
+       (when (string? s)
+         (keyword (string/replace s " " "_"))))))
+
 #?(:cljs (goog-define NODETEST false)
    :clj (def NODETEST false))
 (defonce node-test? NODETEST)
 
+#?(:cljs
+   (do
+     (defn- ios*?
+       []
+       (utils/ios))
+     (def ios? (memoize ios*?))))
+
+#?(:cljs
+   (do
+     (defn- safari*?
+       []
+       (let [ua (string/lower-case js/navigator.userAgent)]
+         (and (string/includes? ua "webkit")
+           (not (string/includes? ua "chrome")))))
+     (def safari? (memoize safari*?))))
+
+#?(:cljs
+   (do
+     (defn- mobile*?
+       "Triggering condition: Mobile phones
+        *** Warning!!! ***
+        For UX logic only! Don't use for FS logic
+        iPad / Android Pad doesn't trigger!"
+       []
+       (when-not node-test?
+         (safe-re-find #"Mobi" js/navigator.userAgent)))
+     (def mobile? (memoize mobile*?))
+     (def capacitor-new? (memoize #(and js/window (gobj/get js/window "isCapacitorNew"))))))
+
 #?(:cljs
    (extend-protocol IPrintWithWriter
      symbol
@@ -59,11 +97,13 @@
            ([]
             (gdom/getElement "main-content-container"))
            ([el]
-            (if (.closest el "#main-content-container")
-              (app-scroll-container-node)
-              (or
-               (gdom/getElementByClass "sidebar-item-list")
-               (app-scroll-container-node))))))
+            (if (capacitor-new?)
+              (capacitor-new-common/current-page-scroll)
+              (if (.closest el "#main-content-container")
+                (app-scroll-container-node)
+                (or
+                  (gdom/getElementByClass "sidebar-item-list")
+                  (app-scroll-container-node)))))))
 #?(:cljs (defonce el-visible-in-viewport? utils/elementIsVisibleInViewport))
 #?(:cljs (defonce convert-to-roman utils/convertToRoman))
 #?(:cljs (defonce convert-to-letters utils/convertToLetters))
@@ -71,14 +111,6 @@
 
 #?(:cljs (def string-join-path common-util/string-join-path))
 
-#?(:cljs
-   (do
-     (def safe-re-find common-util/safe-re-find)
-     (defn safe-keyword
-       [s]
-       (when (string? s)
-         (keyword (string/replace s " " "_"))))))
-
 #?(:cljs
    (do
      (def uuid-string? common-util/uuid-string?)
@@ -99,34 +131,6 @@
        [s]
        (sanitizeFilename (str s)))))
 
-#?(:cljs
-   (do
-     (defn- ios*?
-       []
-       (utils/ios))
-     (def ios? (memoize ios*?))))
-
-#?(:cljs
-   (do
-     (defn- safari*?
-       []
-       (let [ua (string/lower-case js/navigator.userAgent)]
-         (and (string/includes? ua "webkit")
-              (not (string/includes? ua "chrome")))))
-     (def safari? (memoize safari*?))))
-
-#?(:cljs
-   (do
-     (defn- mobile*?
-       "Triggering condition: Mobile phones
-        *** Warning!!! ***
-        For UX logic only! Don't use for FS logic
-        iPad / Android Pad doesn't trigger!"
-       []
-       (when-not node-test?
-         (safe-re-find #"Mobi" js/navigator.userAgent)))
-     (def mobile? (memoize mobile*?))))
-
 #?(:cljs
    (do
      (defn- electron*?
@@ -1263,8 +1267,7 @@
              box-top     (.-top box-rect)
              box-bottom  (.-bottom box-rect)
 
-             header-height (-> (gdom/getElementByClass "cp__header")
-                               .-clientHeight)
+             header-height (or (some-> (gdom/getElementByClass "cp__header") (.-clientHeight)) 24)
 
              main-node   (app-scroll-container-node el)
              scroll-top'  (.-scrollTop main-node)

+ 17 - 0
tailwind.capacitor.css

@@ -1,4 +1,21 @@
 @charset "utf-8";
 
+@import "packages/ui/src/radix.css";
+@import "packages/ui/src/radix-hsl.css";
+@import "packages/ui/src/vars-classic.css";
+@import "packages/ui/src/colors.css";
 @import "packages/ui/src/index.css";  /* Tailwind base imported here */
+@import "resources/css/shui.css";
+@import "codemirror/lib/codemirror.css";
+@import "codemirror/theme/solarized.css";
+
+@import "src/main/frontend/ui.css";
+@import "src/main/frontend/components/block.css";
+@import "src/main/frontend/components/property.css";
+@import "src/main/frontend/components/editor.css";
+@import "src/main/frontend/components/content.css";
+@import "src/main/frontend/components/datepicker.css";
+@import "src/main/frontend/components/views.css";
+@import "src/main/frontend/components/block/views.css";
+
 @import-glob "src/main/capacitor/**/[!_]*.css";

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff