mirror of
https://github.com/logseq/logseq.git
synced 2026-04-24 14:14:55 +00:00
Merge branch 'feat/db' into feat/capacitor-new
This commit is contained in:
56
.github/workflows/build-desktop-release.yml
vendored
56
.github/workflows/build-desktop-release.yml
vendored
@@ -170,58 +170,6 @@ jobs:
|
||||
with:
|
||||
name: static
|
||||
path: static
|
||||
|
||||
e2e-test:
|
||||
name: E2E Test Shard ${{ matrix.shard }}
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
shard: [1, 2, 3]
|
||||
needs: [ compile-cljs ]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Download The Static Asset
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: static
|
||||
path: static
|
||||
|
||||
- name: Set up Node
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: 'yarn'
|
||||
cache-dependency-path: |
|
||||
yarn.lock
|
||||
static/yarn.lock
|
||||
|
||||
- name: Fetch yarn deps for E2E test
|
||||
run: |
|
||||
yarn install
|
||||
(cd static && yarn install && yarn rebuild:all)
|
||||
env:
|
||||
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: true
|
||||
|
||||
- name: Install Fluxbox
|
||||
run: sudo apt-get update && sudo apt-get install -y fluxbox
|
||||
|
||||
# Emulate a virtual framebuffer on machines with no display hardware
|
||||
- name: Run XVFB
|
||||
run: Xvfb :1 -screen 0 1024x768x24 >/dev/null 2>&1 &
|
||||
|
||||
# Start a lightweight window manager to simulate window actions (maximize,restore etc)
|
||||
- name: Start Fluxbox
|
||||
run: DISPLAY=:1.0 fluxbox >/dev/null 2>&1 &
|
||||
|
||||
- name: Run Playwright test
|
||||
run: DISPLAY=:1.0 npx playwright test --reporter github --shard=${{ matrix.shard }}/3
|
||||
env:
|
||||
LOGSEQ_CI: true
|
||||
DEBUG: "pw:api"
|
||||
RELEASE: true # skip dev only test
|
||||
|
||||
build-linux-x64:
|
||||
runs-on: ubuntu-22.04
|
||||
needs: [ compile-cljs ]
|
||||
@@ -580,7 +528,7 @@ jobs:
|
||||
|
||||
nightly-release:
|
||||
if: ${{ github.event_name == 'schedule' || github.event.inputs.build-target == 'nightly' }}
|
||||
needs: [ build-macos-x64, build-macos-arm64, build-linux-x64, build-linux-arm64, codesign-windows, build-android, e2e-test ]
|
||||
needs: [ build-macos-x64, build-macos-arm64, build-linux-x64, build-linux-arm64, codesign-windows, build-android]
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Download MacOS x64 Artifacts
|
||||
@@ -660,7 +608,7 @@ jobs:
|
||||
release:
|
||||
# NOTE: For now, we only have beta channel to be released on Github
|
||||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.build-target == 'beta' }}
|
||||
needs: [ build-macos-x64, build-macos-arm64, build-linux-x64, build-linux-arm64, codesign-windows, build-android, e2e-test ]
|
||||
needs: [ build-macos-x64, build-macos-arm64, build-linux-x64, build-linux-arm64, codesign-windows, build-android]
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Download MacOS x64 Artifacts
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
-/resources/static/js/katex.min.js
|
||||
-/resources/static/js/mhchem.min.js
|
||||
-/resources/static/js/mldoc.min.js
|
||||
-/resources/static/js/reveal.js
|
||||
-/resources/static/js/sci.min.js
|
||||
-/resources/static/js/excalidraw.min.js
|
||||
-/resources/static/js/react-force-graph.min.js
|
||||
|
||||
24
deps/db/src/logseq/db/common/property_util.cljs
vendored
24
deps/db/src/logseq/db/common/property_util.cljs
vendored
@@ -1,30 +1,28 @@
|
||||
(ns logseq.db.common.property-util
|
||||
"Property related util fns. Fns used in both DB and file graphs should go here"
|
||||
(:require [datascript.core :as d]
|
||||
[logseq.db.common.entity-plus :as entity-plus]
|
||||
[logseq.db.frontend.property :as db-property]
|
||||
[logseq.db.sqlite.util :as sqlite-util]))
|
||||
|
||||
(defn- get-file-pid-by-ident
|
||||
(defn get-file-pid
|
||||
"Gets file graph property id given the db graph ident"
|
||||
[db-ident]
|
||||
(get-in db-property/built-in-properties [db-ident :name] (name db-ident)))
|
||||
;; Map of unique cases where the db graph keyword name is different than the file graph id
|
||||
(let [unique-file-ids {:logseq.property/order-list-type :logseq.order-list-type
|
||||
:logseq.property.tldraw/page :logseq.tldraw.page
|
||||
:logseq.property.tldraw/shape :logseq.tldraw.shape
|
||||
:logseq.property/publishing-public? :public}]
|
||||
(or (get unique-file-ids db-ident)
|
||||
(keyword (name db-ident)))))
|
||||
|
||||
;; TODO: refactor later to remove this fn
|
||||
;; TODO: replace repo with db later to remove this fn
|
||||
(defn get-pid
|
||||
"Get a built-in property's id (keyword name for file graph and db-ident for db
|
||||
graph) given its db-ident. No need to use this fn in a db graph only context"
|
||||
[repo db-ident]
|
||||
(if (sqlite-util/db-based-graph? repo)
|
||||
db-ident
|
||||
(get-file-pid-by-ident db-ident)))
|
||||
|
||||
(defn get-pid-2
|
||||
"Get a built-in property's id (keyword name for file graph and db-ident for db
|
||||
graph) given its db-ident. No need to use this fn in a db graph only context"
|
||||
[db db-ident]
|
||||
(if (entity-plus/db-based-graph? db)
|
||||
db-ident
|
||||
(get-file-pid-by-ident db-ident)))
|
||||
(get-file-pid db-ident)))
|
||||
|
||||
(defn lookup
|
||||
"Get the property value by a built-in property's db-ident from coll. For file and db graphs"
|
||||
|
||||
50
deps/db/src/logseq/db/frontend/property.cljs
vendored
50
deps/db/src/logseq/db/frontend/property.cljs
vendored
@@ -12,7 +12,7 @@
|
||||
;; Main property vars
|
||||
;; ==================
|
||||
|
||||
(def ^:large-vars/data-var built-in-properties*
|
||||
(def ^:large-vars/data-var built-in-properties
|
||||
"Map of built in properties for db graphs with their :db/ident as keys.
|
||||
Each property has a config map with the following keys:
|
||||
TODO: Move some of these keys to :properties since :schema is a deprecated concept
|
||||
@@ -26,8 +26,6 @@
|
||||
seen in when :public? is set. Valid values are :page, :block and :never. Property can
|
||||
be viewed in any context if not set
|
||||
* :title - Property's :block/title
|
||||
* :name - Property's :block/name as a keyword. If none given, one is derived from the db/ident.
|
||||
TODO: This is barely used for old properties. Deprecate this and move to gp-exporter
|
||||
* :attribute - Property keyword that is saved to a datascript attribute outside of :block/properties
|
||||
* :queryable? - Boolean for whether property can be queried in the query builder
|
||||
* :closed-values - Vec of closed-value maps for properties with choices. Map
|
||||
@@ -196,10 +194,6 @@
|
||||
{:logseq.property/description "Provides a way for a page to associate to another page i.e. backward compatible tagging."}}
|
||||
:logseq.property/background-color {:title "Background color"
|
||||
:schema {:type :default :hide? true}}
|
||||
:logseq.property/background-image {:title "Background image"
|
||||
:schema
|
||||
{:type :default ; FIXME: asset
|
||||
:view-context :block}}
|
||||
;; number (1-6) or boolean for auto heading
|
||||
:logseq.property/heading {:title "Heading"
|
||||
:schema {:type :any :hide? true}
|
||||
@@ -241,7 +235,6 @@
|
||||
:schema {:type :map :hide? true}}
|
||||
;; FIXME: :logseq.property/order-list-type should updated to closed values
|
||||
:logseq.property/order-list-type {:title "List type"
|
||||
:name :logseq.order-list-type
|
||||
:schema {:type :default
|
||||
:hide? true}}
|
||||
:logseq.property.linked-references/includes {:title "Included references"
|
||||
@@ -253,10 +246,10 @@
|
||||
:schema {:type :node
|
||||
:cardinality :many
|
||||
:hide? true}}
|
||||
:logseq.property.tldraw/page {:name :logseq.tldraw.page
|
||||
:logseq.property.tldraw/page {:title "Tldraw Page"
|
||||
:schema {:type :map
|
||||
:hide? true}}
|
||||
:logseq.property.tldraw/shape {:name :logseq.tldraw.shape
|
||||
:logseq.property.tldraw/shape {:title "Tldraw Shape"
|
||||
:schema {:type :map
|
||||
:hide? true}}
|
||||
|
||||
@@ -567,17 +560,6 @@
|
||||
:public? true}
|
||||
:queryable? true})))
|
||||
|
||||
(def built-in-properties
|
||||
(->> built-in-properties*
|
||||
(map (fn [[k v]]
|
||||
(assert (and (keyword? k) (namespace k)))
|
||||
[k
|
||||
;; All built-ins must have a :name
|
||||
(if (:name v)
|
||||
v
|
||||
(assoc v :name (keyword (string/lower-case (name k)))))]))
|
||||
(into (ordered-map))))
|
||||
|
||||
(def db-attribute-properties
|
||||
"Internal properties that are also db schema attributes"
|
||||
#{:block/alias :block/tags :block/parent
|
||||
@@ -701,22 +683,6 @@
|
||||
(or (:block/title ent)
|
||||
(:logseq.property/value ent)))
|
||||
|
||||
(defn- ref->property-value-content
|
||||
"Given a ref from a pulled query e.g. `{:db/id X}`, gets a readable name for
|
||||
the property value of a ref type property"
|
||||
[db ref]
|
||||
(some->> (:db/id ref)
|
||||
(d/entity db)
|
||||
property-value-content))
|
||||
|
||||
(defn ref->property-value-contents
|
||||
"Given a ref or refs from a pulled query e.g. `{:db/id X}`, gets a readable
|
||||
name for the property values of a ref type property"
|
||||
[db ref]
|
||||
(if (or (set? ref) (sequential? ref))
|
||||
(set (map #(ref->property-value-content db %) ref))
|
||||
(ref->property-value-content db ref)))
|
||||
|
||||
(defn get-closed-value-entity-by-name
|
||||
"Given a property, finds one of its closed values by name or nil if none
|
||||
found. Works for all closed value types"
|
||||
@@ -752,16 +718,6 @@
|
||||
[property]
|
||||
(= (:db/cardinality property) :db.cardinality/many))
|
||||
|
||||
(defn properties-by-name
|
||||
"Given a block from a query result, returns a map of its properties indexed by
|
||||
property names"
|
||||
[db block]
|
||||
(->> (properties block)
|
||||
(map (fn [[k v]]
|
||||
[(:block/title (d/entity db k))
|
||||
(ref->property-value-contents db v)]))
|
||||
(into {})))
|
||||
|
||||
(defn public-built-in-property?
|
||||
"Indicates whether built-in property can be seen and edited by users"
|
||||
[entity]
|
||||
|
||||
@@ -51,20 +51,19 @@
|
||||
"Given a properties map in the format of db-property/built-in-properties, builds their properties tx"
|
||||
[built-in-properties]
|
||||
(mapcat
|
||||
(fn [[db-ident {:keys [attribute schema title closed-values properties] :as m}]]
|
||||
(fn [[db-ident {:keys [attribute schema title closed-values properties]}]]
|
||||
(let [db-ident (or attribute db-ident)
|
||||
prop-name (or title (name (:name m)))
|
||||
schema' (schema->qualified-property-keyword schema)
|
||||
[property & others] (if closed-values
|
||||
(db-property-build/build-closed-values
|
||||
db-ident
|
||||
prop-name
|
||||
title
|
||||
{:db/ident db-ident :schema schema' :closed-values closed-values}
|
||||
{})
|
||||
[(sqlite-util/build-new-property
|
||||
db-ident
|
||||
schema'
|
||||
{:title prop-name})])
|
||||
{:title title})])
|
||||
pvalue-tx-m (->property-value-tx-m
|
||||
(merge property
|
||||
;; This config is for :logseq.property/default-value and may need to
|
||||
|
||||
10
deps/db/test/logseq/db/sqlite/build_test.cljs
vendored
10
deps/db/test/logseq/db/sqlite/build_test.cljs
vendored
@@ -54,17 +54,17 @@
|
||||
[{:page {:block/title "page1"}
|
||||
:blocks [{:block/title "some todo"
|
||||
:build/properties {:logseq.property/status :logseq.property/status.doing}}
|
||||
{:block/title "some slide"
|
||||
:build/properties {:logseq.property/background-image "https://placekitten.com/200/300"}}]}])]
|
||||
{:block/title "rojo"
|
||||
:build/properties {:logseq.property/background-color "red"}}]}])]
|
||||
(is (= :logseq.property/status.doing
|
||||
(->> (db-test/find-block-by-content @conn "some todo")
|
||||
:logseq.property/status
|
||||
:db/ident))
|
||||
"built-in property with closed value is created and correctly associated to a block")
|
||||
|
||||
(is (= "https://placekitten.com/200/300"
|
||||
(->> (db-test/find-block-by-content @conn "some slide")
|
||||
:logseq.property/background-image
|
||||
(is (= "red"
|
||||
(->> (db-test/find-block-by-content @conn "rojo")
|
||||
:logseq.property/background-color
|
||||
db-property/property-value-content))
|
||||
"built-in :default property is created and correctly associated to a block")))
|
||||
|
||||
|
||||
@@ -29,7 +29,8 @@
|
||||
[logseq.graph-parser.block :as gp-block]
|
||||
[logseq.graph-parser.extract :as extract]
|
||||
[logseq.graph-parser.property :as gp-property]
|
||||
[promesa.core :as p]))
|
||||
[promesa.core :as p]
|
||||
[logseq.db.common.property-util :as db-property-util]))
|
||||
|
||||
(defn- add-missing-timestamps
|
||||
"Add updated-at or created-at timestamps if they doesn't exist"
|
||||
@@ -405,38 +406,36 @@
|
||||
(when (and prev-type (not= prev-type prop-type))
|
||||
{:type {:from prev-type :to prop-type}})))
|
||||
|
||||
(def built-in-property-name-to-idents
|
||||
"Map of all built-in keyword property names to their idents. Using in-memory property
|
||||
names because these are legacy names already in a user's file graph"
|
||||
(merge (->> (dissoc db-property/built-in-properties :logseq.property/publishing-public?)
|
||||
(map (fn [[k v]]
|
||||
[(:name v) k]))
|
||||
(into {}))
|
||||
;; TODO: Move 3 remaining :name config from built-in-properties to here
|
||||
{:public :logseq.property/publishing-public?}))
|
||||
(def built-in-property-file-to-db-idents
|
||||
"Map of built-in property file ids to their db graph idents"
|
||||
(->> (keys db-property/built-in-properties)
|
||||
(map (fn [k]
|
||||
[(db-property-util/get-file-pid k) k]))
|
||||
(into {})))
|
||||
|
||||
(def all-built-in-property-names
|
||||
"All built-in property names as a set of keywords"
|
||||
(-> built-in-property-name-to-idents keys set
|
||||
(def all-built-in-property-file-ids
|
||||
"All built-in property file ids as a set of keywords"
|
||||
(-> built-in-property-file-to-db-idents keys set
|
||||
;; built-in-properties that map to new properties
|
||||
(set/union #{:filters :query-table :query-properties :query-sort-by :query-sort-desc :hl-stamp :file :file-path})))
|
||||
|
||||
;; TODO: Review whether this should be using :block/title instead of file graph ids
|
||||
(def all-built-in-names
|
||||
"All built-in properties and classes as a set of keywords"
|
||||
(set/union all-built-in-property-names
|
||||
(set/union all-built-in-property-file-ids
|
||||
(set (->> db-class/built-in-classes
|
||||
vals
|
||||
(map #(-> % :title string/lower-case keyword))))))
|
||||
|
||||
(def file-built-in-property-names
|
||||
"File-graph built-in property names that are supported. Expressed as set of keywords"
|
||||
#{:alias :tags :background-color :background-image :heading
|
||||
#{:alias :tags :background-color :heading
|
||||
:query-table :query-properties :query-sort-by :query-sort-desc
|
||||
:ls-type :hl-type :hl-color :hl-page :hl-stamp :hl-value :file :file-path
|
||||
:logseq.order-list-type :logseq.tldraw.page :logseq.tldraw.shape
|
||||
:icon :public :exclude-from-graph-view :filters})
|
||||
|
||||
(assert (set/subset? file-built-in-property-names all-built-in-property-names)
|
||||
(assert (set/subset? file-built-in-property-names all-built-in-property-file-ids)
|
||||
"All file-built-in properties are used in db graph")
|
||||
|
||||
(def query-table-special-keys
|
||||
@@ -518,7 +517,7 @@
|
||||
:ls-type
|
||||
[[:logseq.property/ls-type (keyword prop-value)]]
|
||||
;; else
|
||||
[[(built-in-property-name-to-idents prop) prop-value]]))))
|
||||
[[(built-in-property-file-to-db-idents prop) prop-value]]))))
|
||||
(into {}))]
|
||||
(cond-> m
|
||||
(and (contains? props :query-sort-desc) (:query-sort-by props))
|
||||
@@ -661,7 +660,7 @@
|
||||
;; Not supported as they have been ignored for a long time and cause invalid built-in pages
|
||||
:now :later :doing :done :canceled :cancelled :in-progress :todo :wait :waiting
|
||||
;; deprecated in db graphs
|
||||
:macros :logseq.query/nlp-date
|
||||
:background-image :macros :logseq.query/nlp-date
|
||||
:card-last-interval :card-repeats :card-last-reviewed :card-next-schedule
|
||||
:card-ease-factor :card-last-score
|
||||
:logseq.color :logseq.table.borders :logseq.table.stripes :logseq.table.max-width
|
||||
|
||||
@@ -67,7 +67,6 @@ const common = {
|
||||
'node_modules/html2canvas/dist/html2canvas.min.js',
|
||||
'node_modules/interactjs/dist/interact.min.js',
|
||||
'node_modules/photoswipe/dist/umd/*.js',
|
||||
'node_modules/reveal.js/dist/reveal.js',
|
||||
'node_modules/shepherd.js/dist/js/shepherd.min.js',
|
||||
'node_modules/marked/marked.min.js',
|
||||
'node_modules/@highlightjs/cdn-assets/highlight.min.js',
|
||||
@@ -103,7 +102,6 @@ const common = {
|
||||
]).pipe(gulp.dest(path.join(outputPath, 'js', 'pdfjs', 'cmaps'))),
|
||||
() => gulp.src([
|
||||
'node_modules/inter-ui/inter.css',
|
||||
'node_modules/reveal.js/dist/theme/fonts/source-sans-pro/**',
|
||||
]).pipe(gulp.dest(path.join(outputPath, 'css'))),
|
||||
() => gulp.src('node_modules/inter-ui/Inter (web)/*.*').
|
||||
pipe(gulp.dest(path.join(outputPath, 'css', 'Inter (web)'))),
|
||||
|
||||
@@ -426,8 +426,7 @@
|
||||
["Advanced Query" (advanced-query-steps) "Create an advanced query block" :icon/query]
|
||||
(when-not db?
|
||||
["Zotero" (zotero-steps) "Import Zotero journal article" :icon/circle-letter-z])
|
||||
(when-not db?
|
||||
["Query function" [[:editor/input "{{function }}" {:backward-pos 2}]] "Create a query function" :icon/queryCode])
|
||||
["Query function" [[:editor/input "{{function }}" {:backward-pos 2}]] "Create a query function" :icon/queryCode]
|
||||
["Calculator"
|
||||
(calc-steps)
|
||||
"Insert a calculator" :icon/calculator]
|
||||
@@ -474,7 +473,7 @@
|
||||
commands)
|
||||
|
||||
;; Allow user to modify or extend, should specify how to extend.
|
||||
|
||||
|
||||
(state/get-commands)
|
||||
(when-let [plugin-commands (seq (some->> (state/get-plugins-slash-commands)
|
||||
(mapv #(vec (concat % [nil :icon/puzzle])))))]
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
[datascript.core :as d]
|
||||
[logseq.common.util :as common-util]
|
||||
[logseq.db :as ldb]
|
||||
[logseq.db.common.property-util :as db-property-util]
|
||||
[logseq.db.common.entity-plus :as entity-plus]
|
||||
[logseq.db.sqlite.create-graph :as sqlite-create-graph]
|
||||
[logseq.graph-parser.db :as gp-db]))
|
||||
@@ -85,7 +84,7 @@
|
||||
db-based? (entity-plus/db-based-graph? db)
|
||||
created-ats (map :block/created-at full-pages)
|
||||
|
||||
;; build up nodes
|
||||
;; build up nodes
|
||||
full-pages'
|
||||
(cond->> full-pages
|
||||
created-at-filter
|
||||
@@ -94,7 +93,9 @@
|
||||
(remove ldb/journal?)
|
||||
(not excluded-pages?)
|
||||
(remove (fn [p] (true?
|
||||
(get p (db-property-util/get-pid-2 db :logseq.property/exclude-from-graph-view))))))
|
||||
(if db-based?
|
||||
(get p :logseq.property/exclude-from-graph-view)
|
||||
(get-in p [:block/properties :exclude-from-graph-view]))))))
|
||||
links (concat relation tagged-pages namespaces)
|
||||
linked (set (mapcat identity links))
|
||||
build-in-pages (->> (if db-based? sqlite-create-graph/built-in-pages-names gp-db/built-in-pages-names)
|
||||
|
||||
@@ -1272,7 +1272,6 @@
|
||||
(if (and block (:block/title block))
|
||||
(let [content-cp (block-content config'
|
||||
block nil (:block/uuid block)
|
||||
(:slide? config)
|
||||
nil)
|
||||
display-type (:logseq.property.node/display-type block)]
|
||||
(if (and display-type (not (contains? #{:quote :math} display-type)))
|
||||
@@ -2271,7 +2270,6 @@
|
||||
block-ast-title (:block.temp/ast-title block)
|
||||
config (assoc config :block block)
|
||||
level (:level config)
|
||||
slide? (boolean (:slide? config))
|
||||
block-ref? (:block-ref? config)
|
||||
block-type (or (keyword (pu/lookup block :logseq.property/ls-type)) :default)
|
||||
html-export? (:html-export? config)
|
||||
@@ -2339,12 +2337,10 @@
|
||||
(concat
|
||||
(when (config/local-file-based-graph? (state/get-current-repo))
|
||||
[(when (and (not pre-block?)
|
||||
(not html-export?)
|
||||
(not slide?))
|
||||
(not html-export?))
|
||||
(file-block/block-checkbox block (str "mr-1 cursor")))
|
||||
(when (and (not pre-block?)
|
||||
(not html-export?)
|
||||
(not slide?))
|
||||
(not html-export?))
|
||||
(file-block/marker-switch block))
|
||||
(file-block/marker-cp block)
|
||||
(file-block/priority-cp block)])
|
||||
@@ -2648,13 +2644,12 @@
|
||||
(state/set-selection-start-block! block-id)))))))))
|
||||
|
||||
(rum/defc dnd-separator-wrapper < rum/reactive
|
||||
[block children block-id slide? top? block-content?]
|
||||
[block children block-id top? block-content?]
|
||||
(let [dragging? (rum/react *dragging?)
|
||||
drag-to-block (rum/react *drag-to-block)]
|
||||
(when (and
|
||||
(= block-id drag-to-block)
|
||||
dragging?
|
||||
(not slide?)
|
||||
(not (:block/pre-block? block)))
|
||||
(let [move-to (rum/react *move-to)]
|
||||
(when-not
|
||||
@@ -2696,9 +2691,9 @@
|
||||
[state block tag config popup-opts]
|
||||
(let [*hover? (::hover? state)
|
||||
*hover-container? (::hover-container? state)]
|
||||
[:div.block-tag.items-center.relative.px-1
|
||||
[:div.block-tag.items-center.relative
|
||||
{:key (str "tag-" (:db/id tag))
|
||||
:class (if @*hover? "bg-gray-03 rounded" "")
|
||||
:class (if @*hover? "bg-gray-03 rounded pr-1" "px-1")
|
||||
:on-mouse-over #(reset! *hover-container? true)
|
||||
:on-mouse-out #(reset! *hover-container? false)}
|
||||
[:div.flex.items-center
|
||||
@@ -2727,7 +2722,7 @@
|
||||
"Remove tag"))])
|
||||
popup-opts))}
|
||||
(if (and @*hover? (not (ldb/private-tags (:db/ident tag))))
|
||||
[:a.inline-flex.text-muted-foreground.mr-1
|
||||
[:a.inline-flex.text-muted-foreground
|
||||
{:title "Remove this tag"
|
||||
:style {:margin-top 1}
|
||||
:on-pointer-down
|
||||
@@ -2872,7 +2867,7 @@
|
||||
(clock/seconds->days:hours:minutes:seconds time-spent))]))))
|
||||
|
||||
(rum/defc ^:large-vars/cleanup-todo block-content < rum/reactive
|
||||
[config {:block/keys [uuid] :as block} edit-input-id block-id slide? *show-query?]
|
||||
[config {:block/keys [uuid] :as block} edit-input-id block-id *show-query?]
|
||||
(let [repo (state/get-current-repo)
|
||||
db-based? (config/db-based-graph? (state/get-current-repo))
|
||||
scheduled (when-not db-based? (:block/scheduled block))
|
||||
@@ -2940,7 +2935,7 @@
|
||||
[:div.block-content.inline
|
||||
(cond-> {:id (str "block-content-" uuid)
|
||||
:key (str "block-content-" uuid)}
|
||||
(not slide?)
|
||||
true
|
||||
(merge attrs))
|
||||
|
||||
[:<>
|
||||
@@ -2974,7 +2969,6 @@
|
||||
(let [hidden? (property-file/properties-hidden? (:block/properties block))]
|
||||
(not hidden?))
|
||||
(not (and block-ref? (or (seq ast-title) (seq ast-body))))
|
||||
(not (:slide? config))
|
||||
(not= block-type :whiteboard-shape)
|
||||
(not (:table-block-title? config)))
|
||||
(properties-cp config block))
|
||||
@@ -2989,18 +2983,19 @@
|
||||
(rum/defc block-refs-count < rum/static
|
||||
[block block-refs-count' *hide-block-refs?]
|
||||
(when (> block-refs-count' 0)
|
||||
(shui/button {:variant :ghost
|
||||
:title "Open block references"
|
||||
:class "px-1 py-0 w-5 h-5 opacity-70 hover:opacity-100"
|
||||
:size :sm
|
||||
:on-click (fn [e]
|
||||
(if (gobj/get e "shiftKey")
|
||||
(state/sidebar-add-block!
|
||||
(state/get-current-repo)
|
||||
(:db/id block)
|
||||
:block-ref)
|
||||
(swap! *hide-block-refs? not)))}
|
||||
[:span.text-sm block-refs-count'])))
|
||||
[:div.h-6
|
||||
(shui/button {:variant :ghost
|
||||
:title "Open block references"
|
||||
:class "px-1 py-0 w-5 h-5 opacity-70 hover:opacity-100"
|
||||
:size :sm
|
||||
:on-click (fn [e]
|
||||
(if (gobj/get e "shiftKey")
|
||||
(state/sidebar-add-block!
|
||||
(state/get-current-repo)
|
||||
(:db/id block)
|
||||
:block-ref)
|
||||
(swap! *hide-block-refs? not)))}
|
||||
[:span.text-sm block-refs-count'])]))
|
||||
|
||||
(rum/defc block-left-menu < rum/reactive
|
||||
[_config {:block/keys [uuid] :as _block}]
|
||||
@@ -3020,7 +3015,7 @@
|
||||
[:div.more (ui/icon "dots-circle-horizontal" {:size 18})])]])
|
||||
|
||||
(rum/defc block-content-with-error
|
||||
[config block edit-input-id block-id slide? *show-query? editor-box]
|
||||
[config block edit-input-id block-id *show-query? editor-box]
|
||||
(let [[editing? set-editing!] (hooks/use-state false)
|
||||
query (:logseq.property/query block)]
|
||||
(ui/catch-error
|
||||
@@ -3048,7 +3043,7 @@
|
||||
(editor-handler/unhighlight-blocks!)
|
||||
(state/set-editing! edit-input-id content block "" {:db (db/get-db)
|
||||
:container-id (:container-id config)}))}})])
|
||||
(block-content config block edit-input-id block-id slide? *show-query?))))
|
||||
(block-content config block edit-input-id block-id *show-query?))))
|
||||
|
||||
(rum/defcs ^:large-vars/cleanup-todo block-content-or-editor < rum/reactive
|
||||
(rum/local false ::hover?)
|
||||
@@ -3058,7 +3053,6 @@
|
||||
(or (:block/format block) :markdown))
|
||||
editor-box (state/get-component :editor/box)
|
||||
editor-id (str "editor-" edit-input-id)
|
||||
slide? (:slide? config)
|
||||
block-reference-only? (some->
|
||||
(:block/title block)
|
||||
string/trim
|
||||
@@ -3089,8 +3083,8 @@
|
||||
:format format}
|
||||
edit-input-id
|
||||
config))]
|
||||
[:div.flex.flex-1.w-full.block-content-wrapper {:style {:display (if (:slide? config) "block" "flex")}}
|
||||
(block-content-with-error config block edit-input-id block-id slide? *show-query? editor-box)
|
||||
[:div.flex.flex-1.w-full.block-content-wrapper {:style {:display "flex"}}
|
||||
(block-content-with-error config block edit-input-id block-id *show-query? editor-box)
|
||||
|
||||
(when (and (not hide-block-refs-count?)
|
||||
(not named?)
|
||||
@@ -3110,14 +3104,16 @@
|
||||
{:on-pointer-down (fn [e]
|
||||
(util/stop e)
|
||||
(editor-handler/edit-block! block :max))}
|
||||
svg/edit])])])
|
||||
svg/edit])])
|
||||
|
||||
(when-not (or (:table? config) (:property? config) (:page-title? config))
|
||||
(block-refs-count block refs-count *hide-block-refs?))])
|
||||
|
||||
(when-not (:table-block-title? config)
|
||||
[:div.flex.flex-row.items-center.self-start.gap-1
|
||||
(when (and db-based? (not table?)) (block-positioned-properties config block :block-right))
|
||||
|
||||
(when-not (or (:table? config) (:property? config) (:page-title? config))
|
||||
(block-refs-count block refs-count *hide-block-refs?))
|
||||
(when (and db-based? (not table?))
|
||||
[:div.opacity-70.hover:opacity-100
|
||||
(block-positioned-properties config block :block-right)])
|
||||
|
||||
(when-not (or (:block-ref? config) (:table? config) (:gallery-view? config)
|
||||
(:property? config))
|
||||
@@ -3519,7 +3515,6 @@
|
||||
breadcrumb-show? (:breadcrumb-show? config)
|
||||
*show-left-menu? (::show-block-left-menu? container-state)
|
||||
*show-right-menu? (::show-block-right-menu? container-state)
|
||||
slide? (boolean (:slide? config))
|
||||
doc-mode? (:document/mode? config)
|
||||
embed? (:embed? config)
|
||||
page-embed? (:page-embed? config)
|
||||
@@ -3587,7 +3582,7 @@
|
||||
level
|
||||
(assoc :level level)
|
||||
|
||||
(not slide?)
|
||||
true
|
||||
(merge attrs)
|
||||
|
||||
(or reference? (and embed? (not page-embed?)))
|
||||
@@ -3606,7 +3601,7 @@
|
||||
|
||||
;; only render this for the first block in each container
|
||||
(when (and top? (not (or table? property?)))
|
||||
(dnd-separator-wrapper block children block-id slide? true false))
|
||||
(dnd-separator-wrapper block children block-id true false))
|
||||
|
||||
(when-not (:hide-title? config)
|
||||
[:div.block-main-container.flex.flex-row.gap-1
|
||||
@@ -3627,7 +3622,7 @@
|
||||
:on-mouse-leave (fn [_e]
|
||||
(block-mouse-leave *control-show? block-id doc-mode?))}
|
||||
|
||||
(when (and (not slide?) (not in-whiteboard?) (not property?) (not (:table-block-title? config)))
|
||||
(when (and (not in-whiteboard?) (not property?) (not (:table-block-title? config)))
|
||||
(let [edit? (or editing?
|
||||
(= uuid (:block/uuid (state/get-edit-block))))]
|
||||
(block-control (assoc config :hide-bullet? (:page-title? config))
|
||||
@@ -3719,7 +3714,7 @@
|
||||
(dissoc :original-block :data))]
|
||||
(block-children config' block children collapsed?)))
|
||||
|
||||
(when-not (or in-whiteboard? table? property?) (dnd-separator-wrapper block children block-id slide? false false))]))
|
||||
(when-not (or in-whiteboard? table? property?) (dnd-separator-wrapper block children block-id false false))]))
|
||||
|
||||
(rum/defc block-container-inner
|
||||
[container-state repo config* block opts]
|
||||
@@ -4041,7 +4036,7 @@
|
||||
(cond
|
||||
(nil? inside-portal?) nil
|
||||
|
||||
(or (:slide? config) inside-portal?)
|
||||
inside-portal?
|
||||
(highlight/highlight (str (random-uuid))
|
||||
{:class (str "language-" language)
|
||||
:data-lang language}
|
||||
@@ -4134,8 +4129,7 @@
|
||||
(->elem :div.is-paragraph (map-inline config l)))
|
||||
|
||||
["Horizontal_Rule"]
|
||||
(when-not (:slide? config)
|
||||
[:hr])
|
||||
[:hr]
|
||||
["Heading" h]
|
||||
(block-container config h)
|
||||
["List" l]
|
||||
|
||||
@@ -963,6 +963,10 @@ html.is-mac {
|
||||
.block-title-wrap {
|
||||
@apply overflow-hidden h-6 whitespace-nowrap text-ellipsis;
|
||||
}
|
||||
|
||||
.jtrigger {
|
||||
@apply px-1;
|
||||
}
|
||||
}
|
||||
|
||||
.positioned-properties.block-below {
|
||||
|
||||
@@ -3,14 +3,30 @@
|
||||
(:require [clojure.walk :as walk]
|
||||
[frontend.extensions.sci :as sci]
|
||||
[frontend.handler.common :as common-handler]
|
||||
[frontend.handler.db-based.property.util :as db-pu]
|
||||
[goog.string :as gstring]
|
||||
[goog.string.format]
|
||||
[frontend.state :as state]
|
||||
[frontend.config :as config]))
|
||||
[frontend.config :as config]
|
||||
[datascript.core :as d]
|
||||
[logseq.db.frontend.property :as db-property]
|
||||
[frontend.db.conn :as db-conn]))
|
||||
|
||||
(defn- properties-by-name
|
||||
"Given a block from a query result, returns a map of its properties indexed by
|
||||
property names"
|
||||
[db block]
|
||||
(->> (db-property/properties block)
|
||||
(map (fn [[k v]]
|
||||
[(:block/title (d/entity db k))
|
||||
;; For now just support cardinality :one
|
||||
(when-not (set? v)
|
||||
(some->> (:db/id v)
|
||||
(d/entity db)
|
||||
db-property/property-value-content))]))
|
||||
(into {})))
|
||||
|
||||
(defn- normalize-query-function
|
||||
[ast repo result]
|
||||
[ast* repo result]
|
||||
(let [ast (walk/prewalk
|
||||
(fn [f]
|
||||
(if (and (list? f)
|
||||
@@ -25,26 +41,21 @@
|
||||
(first f)
|
||||
(list 'map (second f) 'result)))
|
||||
f))
|
||||
ast)]
|
||||
ast*)
|
||||
db-based-graph? (config/db-based-graph? repo)
|
||||
;; These keyword aliases should be the same as those used in the query-table for sorting
|
||||
special-file-graph-keywords
|
||||
{:block :block/title
|
||||
:page :block/name
|
||||
:created-at :block/created-at
|
||||
:updated-at :block/updated-at}]
|
||||
(walk/postwalk
|
||||
(fn [f]
|
||||
(cond
|
||||
(keyword? f)
|
||||
;; These keyword aliases should be the same as those used in the query-table for sorting
|
||||
(case f
|
||||
:block
|
||||
:block/title
|
||||
|
||||
:page
|
||||
:block/name
|
||||
|
||||
:created-at
|
||||
:block/created-at
|
||||
|
||||
:updated-at
|
||||
:block/updated-at
|
||||
|
||||
(let [prop-key (if (config/db-based-graph? repo) (name f) f)
|
||||
(if-let [kw (and (not db-based-graph?) (get special-file-graph-keywords f))]
|
||||
kw
|
||||
(let [prop-key (if db-based-graph? (name f) f)
|
||||
vals (map #(get-in % [:block/properties prop-key]) result)
|
||||
int? (some integer? vals)]
|
||||
`(~'fn [~'b]
|
||||
@@ -65,9 +76,12 @@
|
||||
(mapcat val query-result*)
|
||||
query-result*)
|
||||
repo (state/get-current-repo)
|
||||
db (db-conn/get-db repo)
|
||||
query-result' (if (config/db-based-graph? repo)
|
||||
(map #(assoc % :block/properties (db-pu/properties-by-name repo %)) query-result)
|
||||
query-result)
|
||||
(->> query-result
|
||||
(map #(d/entity db (:db/id %)))
|
||||
(map #(hash-map :block/properties (properties-by-name db %))))
|
||||
query-result)
|
||||
fn-string (-> (gstring/format "(fn [result] %s)" (first arguments))
|
||||
(common-handler/safe-read-string "failed to parse function")
|
||||
(normalize-query-function repo query-result')
|
||||
|
||||
@@ -106,16 +106,6 @@
|
||||
{:title (t :page/delete)
|
||||
:options {:on-click #(delete-page-confirm! page)}})
|
||||
|
||||
(when (and (not (mobile-util/native-platform?))
|
||||
(not whiteboard?)
|
||||
(state/get-current-page))
|
||||
{:title (t :page/slide-view)
|
||||
:options {:on-click (fn []
|
||||
(state/sidebar-add-block!
|
||||
repo
|
||||
(:db/id page)
|
||||
:page-slide-view))}})
|
||||
|
||||
;; TODO: In the future, we'd like to extract file-related actions
|
||||
;; (such as open-in-finder & open-with-default-app) into a sub-menu of
|
||||
;; this one. However this component doesn't yet exist. PRs are welcome!
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
[frontend.db :as db]
|
||||
[frontend.db.async :as db-async]
|
||||
[frontend.db.rtc.debug-ui :as rtc-debug-ui]
|
||||
[frontend.extensions.slide :as slide]
|
||||
[frontend.handler.editor :as editor-handler]
|
||||
[frontend.handler.route :as route-handler]
|
||||
[frontend.handler.ui :as ui-handler]
|
||||
@@ -25,7 +24,6 @@
|
||||
[logseq.shui.ui :as shui]
|
||||
[medley.core :as medley]
|
||||
[promesa.core :as p]
|
||||
[reitit.frontend.easy :as rfe]
|
||||
[rum.core :as rum]))
|
||||
|
||||
(rum/defc toggle
|
||||
@@ -129,13 +127,6 @@
|
||||
[repo new-value block-type]))})
|
||||
(str init-key))]
|
||||
|
||||
:page-slide-view
|
||||
(when entity
|
||||
[[:a.page-title {:href (rfe/href :page {:name (str (:block/uuid entity))})}
|
||||
(:block/title entity)]
|
||||
[:div.ml-2.slide.mt-2
|
||||
(slide/slide entity)]])
|
||||
|
||||
:shortcut-settings
|
||||
[[:.flex.items-center (ui/icon "command" {:class "text-md mr-2"}) (t :help/shortcuts)]
|
||||
(shortcut-settings)]
|
||||
|
||||
@@ -29,8 +29,7 @@
|
||||
get-block-immediate-children get-block-page
|
||||
get-file file-exists? get-files-full
|
||||
get-latest-journals get-page get-case-page get-page-alias-names
|
||||
get-page-blocks-no-cache get-page-format
|
||||
journal-page? page? sub-block
|
||||
get-page-format journal-page? page? sub-block
|
||||
page-empty? page-exists? get-alias-source-page
|
||||
has-children? whiteboard-page?])
|
||||
|
||||
|
||||
@@ -1,129 +0,0 @@
|
||||
(ns frontend.extensions.slide
|
||||
(:require [cljs-bean.core :as bean]
|
||||
[clojure.string :as string]
|
||||
[frontend.components.block :as block]
|
||||
[frontend.config :as config]
|
||||
[frontend.context.i18n :refer [t]]
|
||||
[frontend.db :as db]
|
||||
[frontend.db-mixins :as db-mixins]
|
||||
[frontend.db.conn :as conn]
|
||||
[frontend.handler.db-based.property.util :as db-pu]
|
||||
[frontend.loader :as loader]
|
||||
[frontend.modules.outliner.tree :as outliner-tree]
|
||||
[frontend.state :as state]
|
||||
[frontend.ui :as ui]
|
||||
[logseq.db :as ldb]
|
||||
[logseq.db.frontend.property :as db-property]
|
||||
[rum.core :as rum]))
|
||||
|
||||
(defn loaded? []
|
||||
js/window.Reveal)
|
||||
|
||||
(defn- with-properties
|
||||
[m block]
|
||||
(let [repo (state/get-current-repo)
|
||||
db-based? (config/db-based-graph? repo)
|
||||
properties (if db-based?
|
||||
(as-> (db-property/properties block) properties
|
||||
(->> properties
|
||||
(keep (fn [[k v]]
|
||||
;; Don't inject hidden props like created-from-property
|
||||
(when-not (:logseq.property/hide? (db/entity repo k))
|
||||
[k
|
||||
(if (:db/id v)
|
||||
;; Can't use db-property-util/lookup b/c vals aren't entities
|
||||
(db-property/ref->property-value-contents (conn/get-db) v)
|
||||
v)])))
|
||||
(into {})))
|
||||
(:block/properties block))]
|
||||
(if (seq properties)
|
||||
(merge m
|
||||
(update-keys
|
||||
properties
|
||||
(fn [k]
|
||||
(-> (str "data-" (if db-based? (db-pu/get-property-name k) (name k)))
|
||||
(string/replace "data-data-" "data-")))))
|
||||
m)))
|
||||
|
||||
(defonce *loading? (atom false))
|
||||
|
||||
(defn render!
|
||||
[]
|
||||
(let [deck (js/window.Reveal.
|
||||
(js/document.querySelector ".reveal")
|
||||
(bean/->js
|
||||
{:embedded true
|
||||
:controls true
|
||||
:history false
|
||||
:center true
|
||||
:transition "slide"
|
||||
:keyboardCondition "focused"}))]
|
||||
(.initialize deck)))
|
||||
|
||||
;; reveal.js doesn't support multiple nested sections yet.
|
||||
;; https://github.com/hakimel/reveal.js/issues/1440
|
||||
(rum/defc block-container
|
||||
[config block level]
|
||||
(let [children (:block/children block)
|
||||
has-children? (seq children)
|
||||
children (when has-children?
|
||||
(map (fn [block]
|
||||
(block-container config block (inc level))) children))
|
||||
block-el (block/block-container config (dissoc block :block/children))
|
||||
dom-attrs (with-properties {:key (str "slide-block-" (:block/uuid block))} block)]
|
||||
(if has-children?
|
||||
[:section dom-attrs
|
||||
[:section.relative
|
||||
block-el]
|
||||
children]
|
||||
[:section dom-attrs block-el])))
|
||||
|
||||
(defn slide-content
|
||||
[loading? style config blocks]
|
||||
[:div
|
||||
[:p.text-sm
|
||||
(t :page/slide-view-tip-go-fullscreen)]
|
||||
[:div.reveal {:style style}
|
||||
(when loading?
|
||||
[:div.ls-center (ui/loading "")])
|
||||
[:div.slides
|
||||
(map #(block-container config % 1) blocks)]]])
|
||||
|
||||
(rum/defc slide < rum/reactive db-mixins/query
|
||||
{:did-mount (fn [state]
|
||||
(if (loaded?)
|
||||
(do
|
||||
(reset! *loading? false)
|
||||
(render!))
|
||||
(do
|
||||
(reset! *loading? true)
|
||||
(loader/load
|
||||
(config/asset-uri (if config/publishing? "static/js/reveal.js" "/static/js/reveal.js"))
|
||||
(fn []
|
||||
(reset! *loading? false)
|
||||
(render!)))))
|
||||
state)}
|
||||
[page]
|
||||
(let [page-name (:block/title page)
|
||||
loading? (rum/react *loading?)
|
||||
journal? (ldb/journal? page)
|
||||
repo (state/get-current-repo)
|
||||
blocks (-> (db/get-page-blocks-no-cache repo (:db/id page))
|
||||
(outliner-tree/blocks->vec-tree (:db/id page)))
|
||||
blocks (if (and journal? (not (config/db-based-graph? repo)))
|
||||
(rest blocks)
|
||||
blocks)
|
||||
blocks (map (fn [block]
|
||||
(update block :block/children
|
||||
(fn [children]
|
||||
(->>
|
||||
(mapcat
|
||||
(fn [x]
|
||||
(tree-seq map? :block/children x))
|
||||
children)
|
||||
(map #(dissoc % :block/children)))))) blocks)
|
||||
config {:id "slide-reveal-js"
|
||||
:slide? true
|
||||
:sidebar? true
|
||||
:page-name page-name}]
|
||||
(slide-content loading? {:height 400} config blocks)))
|
||||
@@ -1,39 +0,0 @@
|
||||
html[data-theme=light] {
|
||||
#right-sidebar .reveal {
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
color: initial;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.reveal {
|
||||
color: var(--ls-primary-text-color);
|
||||
background: var(--ls-slide-background-color);
|
||||
|
||||
pre.code {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.hljs {
|
||||
background: none;
|
||||
}
|
||||
|
||||
section img {
|
||||
margin: 1rem auto;
|
||||
}
|
||||
|
||||
.progress span {
|
||||
display: block;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
background-color: currentColor;
|
||||
transition: transform 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
||||
transform-origin: 0 0;
|
||||
transform: scaleX(0);
|
||||
}
|
||||
}
|
||||
@@ -5,11 +5,6 @@
|
||||
[frontend.state :as state]
|
||||
[logseq.db.frontend.property :as db-property]))
|
||||
|
||||
(defn get-property-name
|
||||
"Get a property's name given its id"
|
||||
[id]
|
||||
(:block/title (db-utils/entity id)))
|
||||
|
||||
(defn get-property-value
|
||||
"Get a property's name given its id"
|
||||
[e]
|
||||
@@ -17,16 +12,10 @@
|
||||
(db-property/property-value-content e)
|
||||
e))
|
||||
|
||||
(defn properties-by-name
|
||||
"Given a block from a query result, returns a map of its properties indexed by property names"
|
||||
[repo block]
|
||||
(let [db (conn/get-db repo)]
|
||||
(db-property/properties-by-name db block)))
|
||||
|
||||
(defn readable-properties
|
||||
"Given a DB graph's properties, returns a readable properties map with keys as
|
||||
property names and property values dereferenced where possible. Has some
|
||||
overlap with db-property/properties-by-name"
|
||||
overlap with block-macros/properties-by-name"
|
||||
([properties] (readable-properties properties {:original-key? true}))
|
||||
([properties {:keys [original-key? key-fn]
|
||||
:or {key-fn identity}}]
|
||||
|
||||
@@ -3295,11 +3295,6 @@
|
||||
(when (state/editing?)
|
||||
(keydown-backspace-handler false e)))
|
||||
|
||||
(defn- slide-focused?
|
||||
[]
|
||||
(some-> (first (dom/by-class "reveal"))
|
||||
(dom/has-class? "focused")))
|
||||
|
||||
(defn- in-page-preview?
|
||||
[]
|
||||
(some-> js/document.activeElement
|
||||
@@ -3312,7 +3307,6 @@
|
||||
(when (and (not (auto-complete?))
|
||||
(or (in-page-preview?)
|
||||
(not (in-shui-popup?)))
|
||||
(not (slide-focused?))
|
||||
(not (state/get-timestamp-block)))
|
||||
(util/stop e)
|
||||
(cond
|
||||
|
||||
@@ -779,10 +779,10 @@
|
||||
#?(:cljs
|
||||
(defn get-blocks-noncollapse
|
||||
([]
|
||||
(->> (d/sel "div:not(.reveal) .ls-block")
|
||||
(->> (d/sel "div .ls-block")
|
||||
(filter (fn [b] (some? (gobj/get b "offsetParent"))))))
|
||||
([blocks-container]
|
||||
(->> (d/sel blocks-container "div:not(.reveal) .ls-block")
|
||||
(->> (d/sel blocks-container "div .ls-block")
|
||||
(filter (fn [b] (some? (gobj/get b "offsetParent"))))))))
|
||||
|
||||
#?(:cljs
|
||||
|
||||
@@ -428,8 +428,6 @@
|
||||
:page/open-in-finder "Obrir ubicació del arxiu"
|
||||
:page/open-with-default-app "Obrir amb la aplicació preestablerta"
|
||||
:page/page-already-exists "¡La pàgina “{1}” ja existeix!"
|
||||
:page/slide-view "Veure com diapositives"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Consell: pressiona "] [:code "f"] [:span.opacity-70 " per anar a pantalla completa"]])
|
||||
:page/something-went-wrong "Alguna cosa ha sortit malament"
|
||||
:page/step "Pas {1}"
|
||||
:page/try "Intentar"
|
||||
|
||||
@@ -130,8 +130,6 @@
|
||||
:page/logseq-is-having-a-problem "Logseq má problém. Chcete-li se pokusit uvést jej zpět do funkčního stavu, vyzkoušejte prosím následující bezpečné kroky v uvedeném pořadí:"
|
||||
:page/step "Krok {1}"
|
||||
:page/try "Zkusit"
|
||||
:page/slide-view "Zobrazit jjako snímky"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tip: stiskněte "] [:code "f"] [:span.opacity-70 " pro celou obrazovku"]])
|
||||
:page/delete-confirmation "Jste si jisti, že chcete tuto stránku a její soubor odstranit?"
|
||||
:page/open-in-finder "Otevřít v adresáři"
|
||||
:page/open-with-default-app "Otevřít pomocí výchozí aplikace"
|
||||
|
||||
@@ -244,8 +244,6 @@
|
||||
:page/open-in-finder "Im Verzeichnis öffnen"
|
||||
:page/open-with-default-app "Mit Standard-Anwendung öffnen"
|
||||
:page/page-already-exists "Die Seite “{1}” existiert bereits!"
|
||||
:page/slide-view "Als Slides anzeigen"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tipp: Drücken Sie "] [:code "f"] [:span.opacity-70 ", um zum Vollbild zu wechseln"]])
|
||||
:page/something-went-wrong "Es ist etwas schief gelaufen."
|
||||
:page/step "Schritt {1}"
|
||||
:page/try "Versuch"
|
||||
|
||||
@@ -137,8 +137,6 @@
|
||||
:page/logseq-is-having-a-problem "Logseq is having a problem. To try to get it back to a working state, please try the following safe steps in order:"
|
||||
:page/step "Step {1}"
|
||||
:page/try "Try"
|
||||
:page/slide-view "View as slides"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tip: press "] [:code "f"] [:span.opacity-70 " to go fullscreen"]])
|
||||
:page/delete-confirmation "Are you sure you want to delete this page and its file?"
|
||||
:page/db-delete-confirmation "Are you sure you want to delete this page?"
|
||||
:page/open-in-finder "Open in directory"
|
||||
|
||||
@@ -427,8 +427,6 @@
|
||||
:page/open-in-finder "Abrir ubicación del archivo"
|
||||
:page/open-with-default-app "Abrir con la aplicación predeterminada"
|
||||
:page/page-already-exists "¡La página “{1}” ya existe!"
|
||||
:page/slide-view "Ver como diapositivas"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Consejo: presiona "] [:code "f"] [:span.opacity-70 " para ir a pantalla completa"]])
|
||||
:page/something-went-wrong "Algo malió sal"
|
||||
:page/step "Paso {1}"
|
||||
:page/try "Intentar"
|
||||
|
||||
@@ -106,8 +106,6 @@
|
||||
:page/logseq-is-having-a-problem "لاگسیک دچار مشکلی شده است. برای بازگرداندن آن به حالت قابل استفاده لطفا گامهای زیر را به ترتیب انجام دهید:"
|
||||
:page/step "گام {1}"
|
||||
:page/try "امتحان کنید"
|
||||
:page/slide-view "نمایش به صورت اسلاید"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "نکته: دکمه "] [:code "f"] [:span.opacity-70 " را برای رفتن به حالت تمام صفحه بفشارید"]])
|
||||
:page/delete-confirmation "مطمئنید که میخواید این برگه به همراه پروندهاش را پاک کنید؟"
|
||||
:page/open-in-finder "باز کردن در پوشه"
|
||||
:page/open-with-default-app "باز کردن با برنامه پیشفرض"
|
||||
|
||||
@@ -504,7 +504,6 @@
|
||||
:on-boarding/quick-tour-journal-page-title "📆 Page du journal quotidien"
|
||||
:on-boarding/quick-tour-left-sidebar-desc "Ouvrir le panneau latéral gauche pour explorer des éléments du menu impor…"
|
||||
:on-boarding/quick-tour-left-sidebar-title "👀 Panneau latéral gauche"
|
||||
:page/slide-view-tip-go-fullscreen "(fn [] [[:span.opacity-70 \"Conseil: appuyer \"] [:code \"f\"] [:span.opacity-70 \" pour entrer en mode plein écran\"]])"
|
||||
:bug-report/inspector-page-placeholder "Appuyer longuement ici pour coller si vous êtes sur mobile"
|
||||
:bug-report/inspector-page-tip "Quelque chose ne va pas ? Pas de problème, cliquez pour retourner à…"
|
||||
:bug-report/main-desc "Pouvez-vous nous aider en signalant un bogue ? Nous…"
|
||||
@@ -632,7 +631,6 @@
|
||||
:page/illegal-page-name "Nom de page interdit !"
|
||||
:page/logseq-is-having-a-problem "Logseq a un problème. Pour essayer de le ravoir…"
|
||||
:page/page-already-exists "Page “{1}” existe déjà !"
|
||||
:page/slide-view "Visualiser en diapositives"
|
||||
:page/something-went-wrong "Quelque chose s'est mal passé"
|
||||
:page/step "Étape {1}"
|
||||
:page/try "Essayer"
|
||||
|
||||
@@ -125,8 +125,6 @@
|
||||
:page/logseq-is-having-a-problem "Logseq mengalami masalah. Untuk mencoba mengembalikannya ke keadaan yang berfungsi, silakan coba langkah-langkah aman berikut ini secara berurutan:"
|
||||
:page/step "Langkah {1}"
|
||||
:page/try "Coba"
|
||||
:page/slide-view "Tampilkan sebagai slide"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tip: tekan "] [:code "f"] [:span.opacity-70 " untuk masuk ke mode layar penuh"]])
|
||||
:page/delete-confirmation "Apakah Anda yakin ingin menghapus halaman ini beserta berkasnya?"
|
||||
:page/open-in-finder "Buka dalam direktori"
|
||||
:page/open-with-default-app "Buka dengan aplikasi default"
|
||||
|
||||
@@ -509,8 +509,6 @@
|
||||
:page/illegal-page-name "Nome di pagina non ammesso!"
|
||||
:page/logseq-is-having-a-problem "Logseq sta riscontrando un problema. Per tentare di farlo tornare a funzionare esegue i seguenti passi in ordine:"
|
||||
:page/page-already-exists "La pagina “{1}” esiste già!"
|
||||
:page/slide-view "Visualizza come diapositive"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Suggerimento: premi "] [:code "f"] [:span.opacity-70 " per andare in schermo intero"]])
|
||||
:page/something-went-wrong "Qualcosa è andato storto"
|
||||
:page/step "Passo {1}"
|
||||
:page/try "Prova"
|
||||
|
||||
@@ -134,8 +134,6 @@
|
||||
:page/logseq-is-having-a-problem "Logseqになにか問題があります。きちんと動く状態に戻すため、以下の項目を上から順番に実行してください:"
|
||||
:page/step "ステップ{1}"
|
||||
:page/try "試す"
|
||||
:page/slide-view "スライドとして見る"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "お役立ち情報:"] [:code "f"] [:span.opacity-70 "を押すことでフルスクリーンにできます"]])
|
||||
:page/delete-confirmation "このページとページのファイルを削除してもよいですか?"
|
||||
:page/open-in-finder "ディレクトリで開く"
|
||||
:page/open-with-default-app "既定のアプリで開く"
|
||||
|
||||
@@ -385,6 +385,5 @@
|
||||
:settings-page/preferred-pasting-file-hint "활성화하면, 인터넷으로부터 이미지를 붙여넣기할 때 이미지를 다운로드한 뒤 삽입합니다. 비활성화하면, 이미지의 링크를 붙여넣습니다."
|
||||
:settings-page/auto-expand-block-refs "확대 시 블록 참조 펼치기"
|
||||
:settings-page/auto-expand-block-refs-tip "이 설정은 블록을 확대할 때 블록 참조를 자동으로 펼칠지를 결정합니다."
|
||||
:page/slide-view "슬라이드로 보기"
|
||||
:settings-page/tab-keymap "단축키"
|
||||
}
|
||||
|
||||
@@ -624,7 +624,6 @@
|
||||
:on-boarding/tour-whiteboard-btn-next "Neste"
|
||||
:page/illegal-page-name "Ulovlig sidenavn!"
|
||||
:page/page-already-exists "Siden “{1}” eksisterer fra før!"
|
||||
:page/slide-view "Vis som lysbilder"
|
||||
:page/whiteboard-to-journal-error "Whiteboard sider kan ikke bli navnet om til dagboktiter!"
|
||||
:plugin/auto-check-for-updates "Se etter oppdateringer automatisk"
|
||||
:plugin/installed-plugin "Innstallert utvidelse: {1}"
|
||||
@@ -668,7 +667,6 @@
|
||||
:export-save-to-file "Lagre til fil"
|
||||
:export-transparent-background "Transparent bakgrunn"
|
||||
:bug-report/clipboard-inspector-title "Utklippstavle datainspektør"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tips: trykk "] [:code "f"] [:span.opacity-70 " for fullskjerm"]])
|
||||
:query/config-property-settings "Egenskapsinnstillinger for denne spørringen:"
|
||||
:search-item/no-result "Ingen matchende resultat"
|
||||
:settings-permission/start-granting "Gi tillatelse"
|
||||
|
||||
@@ -534,8 +534,6 @@
|
||||
:page/illegal-page-name "Nieprawidłowa nazwa strony!"
|
||||
:page/logseq-is-having-a-problem "Logseq ma problem. Żeby przywrócić go do działającego stanu wykonaj po kolei następujące bezpieczne kroki:"
|
||||
:page/page-already-exists "Strona “{1}” już istnieje!"
|
||||
:page/slide-view "Pokaż jako slajdy"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Wskazówka: wciśnij "] [:code "f"] [:span.opacity-70 " żeby otworzyć na pełnym ekranie"]])
|
||||
:page/something-went-wrong "Coś poszło nie tak"
|
||||
:page/step "Step (1)"
|
||||
:page/try "Spróbuj"
|
||||
|
||||
@@ -130,8 +130,6 @@
|
||||
:page/logseq-is-having-a-problem "Logseq está com um problema. Para tentar fazê-lo voltar a funcionar, siga as etapas seguras a seguir:"
|
||||
:page/step "Etapa {1}"
|
||||
:page/try "Tentar"
|
||||
:page/slide-view "Visualizar como slides"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Dica: pressione "] [:code "f"] [:span.opacity-70 " para ir para tela cheia"]])
|
||||
:page/delete-confirmation "Tem certeza de que deseja excluir esta página e seu arquivo?"
|
||||
:page/open-in-finder "Abrir no diretório"
|
||||
:page/open-with-default-app "Abrir com o aplicativo padrão"
|
||||
|
||||
@@ -130,8 +130,6 @@
|
||||
:page/logseq-is-having-a-problem "Logseq má problém. Skúste tieto bezpečné kroky, aby ste ho dostali do funkčného stavu:"
|
||||
:page/step "Krok {1}"
|
||||
:page/try "Vyskúšať"
|
||||
:page/slide-view "Zobraziť ako prezentáciu"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tip: stlačte "] [:code "f"] [:span.opacity-70 " pre celú obrazovku"]])
|
||||
:page/delete-confirmation "Naozaj chcete odstrániť túto stránku a jej súbor?"
|
||||
:page/open-in-finder "Otvoriť v adresári"
|
||||
:page/open-with-default-app "Otvoriť v predvolenej aplikácii"
|
||||
|
||||
@@ -134,8 +134,6 @@
|
||||
:page/logseq-is-having-a-problem "Logseq'te bir sorun var. Tekrar çalışır duruma getirmek için lütfen aşağıdaki güvenli adımları sırayla deneyin:"
|
||||
:page/step "{1}. Adım"
|
||||
:page/try "Deneyin"
|
||||
:page/slide-view "Slayt olarak görüntüle"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "İpucu: Tam ekrana geçmek için "] [:code "f"] [:span.opacity-70 " tuşuna basın"]])
|
||||
:page/delete-confirmation "Bu sayfayı ve dosyasını silmek istediğinizden emin misiniz?"
|
||||
:page/open-in-finder "Dizini aç"
|
||||
:page/open-with-default-app "Varsayılan uygulamayla aç"
|
||||
|
||||
@@ -79,8 +79,6 @@
|
||||
:help/title-terms "条款"
|
||||
:linked-references/filter-search "在链接的页面内搜索"
|
||||
:page/copy-page-url "复制页面 URL"
|
||||
:page/slide-view "幻灯片视图"
|
||||
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "小技巧: 按 "] [:code "f"] [:span.opacity-70 " 进入全屏"]])
|
||||
:plugin/contribute "✨编写和提交新插件"
|
||||
:right-side-bar/show-journals "显示日记"
|
||||
:select/default-prompt "请选择"
|
||||
|
||||
@@ -7,8 +7,6 @@
|
||||
@import "packages/ui/src/index.css"; /* Tailwind base imported here */
|
||||
@import "resources/css/shui.css";
|
||||
@import "inter-ui/inter.css";
|
||||
@import "reveal.js/dist/reveal.css";
|
||||
@import "reveal.js/dist/theme/black.css";
|
||||
@import "photoswipe/dist/photoswipe.css";
|
||||
@import "shepherd.js/dist/css/shepherd.css";
|
||||
@import "packages/amplify/dist/amplify.css";
|
||||
|
||||
Reference in New Issue
Block a user