mirror of https://github.com/logseq/logseq
Merge branch 'master' into dev/malli-schema&kondo-config
commit
c19787f099
|
@ -6,8 +6,8 @@ android {
|
||||||
applicationId "com.logseq.app"
|
applicationId "com.logseq.app"
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 49
|
versionCode 50
|
||||||
versionName "0.8.15"
|
versionName "0.8.16"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
aaptOptions {
|
aaptOptions {
|
||||||
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
|
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
|
||||||
|
|
|
@ -515,7 +515,7 @@
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 0.8.15;
|
MARKETING_VERSION = 0.8.16;
|
||||||
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq;
|
PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
@ -542,7 +542,7 @@
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 0.8.15;
|
MARKETING_VERSION = 0.8.16;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq;
|
PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
|
||||||
|
@ -567,7 +567,7 @@
|
||||||
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||||
MARKETING_VERSION = 0.8.15;
|
MARKETING_VERSION = 0.8.16;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq.ShareViewController;
|
PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq.ShareViewController;
|
||||||
|
@ -594,7 +594,7 @@
|
||||||
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||||
MARKETING_VERSION = 0.8.15;
|
MARKETING_VERSION = 0.8.16;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq.ShareViewController;
|
PRODUCT_BUNDLE_IDENTIFIER = com.logseq.logseq.ShareViewController;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "Logseq",
|
"name": "Logseq",
|
||||||
"productName": "Logseq",
|
"productName": "Logseq",
|
||||||
"version": "0.8.15",
|
"version": "0.8.16",
|
||||||
"main": "electron.js",
|
"main": "electron.js",
|
||||||
"author": "Logseq",
|
"author": "Logseq",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
(ns frontend.components.bug-report
|
||||||
|
(:require [rum.core :as rum]
|
||||||
|
[frontend.ui :as ui]
|
||||||
|
[frontend.components.header :as header]
|
||||||
|
[frontend.util :as util]
|
||||||
|
[reitit.frontend.easy :as rfe]
|
||||||
|
[clojure.string :as string]
|
||||||
|
[frontend.handler.notification :as notification]))
|
||||||
|
|
||||||
|
(defn parse-clipboard-data-transfer
|
||||||
|
"parse dataTransfer
|
||||||
|
|
||||||
|
input: dataTransfer
|
||||||
|
|
||||||
|
output: {:types {:type :data} :items {:kind :type} :files {:name :size :type}}"
|
||||||
|
[data]
|
||||||
|
(let [items (.-items data)
|
||||||
|
types (.-types data)
|
||||||
|
files (.-files data)]
|
||||||
|
(conj
|
||||||
|
{:items (->> items
|
||||||
|
(map (fn [item] {:kind (.-kind item) :type (.-type item)}))
|
||||||
|
(conj))}
|
||||||
|
{:types (->> types
|
||||||
|
(map (fn [type] {:type type :data (.getData data type)}))
|
||||||
|
(conj))}
|
||||||
|
{:files (->> files
|
||||||
|
(map (fn [file] {:name (.-name file) :type (.-type file) :size (.-size file)}))
|
||||||
|
(conj))})))
|
||||||
|
|
||||||
|
(rum/defc clipboard-data-inspector
|
||||||
|
"bug report tool for clipboard"
|
||||||
|
[]
|
||||||
|
(let [[result set-result!] (rum/use-state {})
|
||||||
|
[step set-step!] (rum/use-state 0)
|
||||||
|
paste-handler! (fn [e]
|
||||||
|
(let [clipboard-data (.-clipboardData e)
|
||||||
|
result (parse-clipboard-data-transfer clipboard-data)
|
||||||
|
result (into {} result)]
|
||||||
|
(set-result! result)
|
||||||
|
(set-step! 1)))
|
||||||
|
|
||||||
|
copy-result-to-clipboard! (fn [result]
|
||||||
|
(util/copy-to-clipboard! result)
|
||||||
|
(notification/show! "Copied to clipboard!"))
|
||||||
|
|
||||||
|
reset-step! (fn []
|
||||||
|
(set-step! 0)
|
||||||
|
(set-result! {}))]
|
||||||
|
|
||||||
|
(rum/use-effect!
|
||||||
|
(fn []
|
||||||
|
(cond (= step 0) (js/addEventListener "paste" paste-handler!))
|
||||||
|
(fn [] (cond (= step 0) (js/removeEventListener "paste" paste-handler!))))
|
||||||
|
[step]) ;; when step === 0
|
||||||
|
|
||||||
|
[:div.flex.flex-col
|
||||||
|
(when (= step 0)
|
||||||
|
(list [:div.mx-auto "Press Ctrl+V / ⌘+V to inspect your clipboard data"]
|
||||||
|
[:div.mx-auto "or click here to paste if you are using the mobile version"]
|
||||||
|
;; for mobile
|
||||||
|
[:input.form-input.is-large.transition.duration-150.ease-in-out {:type "text" :placeholder "Long press here to paste if you are on mobile"}]
|
||||||
|
[:div.flex.justify-between.items-center.mt-2
|
||||||
|
[:div "Something wrong? No problem, click to go back to the previous step."]
|
||||||
|
(ui/button "Go back" :on-click #(util/open-url (rfe/href :bug-report)))]))
|
||||||
|
|
||||||
|
(when (= step 1)
|
||||||
|
(list
|
||||||
|
[:div "Here is the data read from clipboard."]
|
||||||
|
[:div.flex.justify-between.items-center.mt-2
|
||||||
|
[:div "If this is okay to share, click the copy button."]
|
||||||
|
(ui/button "Copy the result" :on-click #(copy-result-to-clipboard! (js/JSON.stringify (clj->js result) nil 2)))]
|
||||||
|
[:div.flex.justify-between.items-center.mt-2
|
||||||
|
[:div "Now you can report the result pasted to your clipboard. Please paste the result in the 'Additional Context' section and state where you copied the original content from. Thanks!"]
|
||||||
|
(ui/button "Create an issue" :href header/bug-report-url)]
|
||||||
|
[:div.flex.justify-between.items-center.mt-2
|
||||||
|
[:div "Something wrong? No problem, click to go back to the previous step."]
|
||||||
|
(ui/button "Go back" :on-click reset-step!)]
|
||||||
|
|
||||||
|
[:pre.whitespace-pre-wrap [:code (js/JSON.stringify (clj->js result) nil 2)]]))]))
|
||||||
|
|
||||||
|
(rum/defc bug-report-tool-route
|
||||||
|
[route-match]
|
||||||
|
(let [name (get-in route-match [:parameters :path :tool])]
|
||||||
|
[:div.flex.flex-col ;; container
|
||||||
|
[:h1.text-2xl.mx-auto.mb-4 (ui/icon "clipboard") " " (-> name (string/replace #"-" " ") (string/capitalize))]
|
||||||
|
(cond ;; TODO any fallback?
|
||||||
|
(= name "clipboard-data-inspector")
|
||||||
|
(clipboard-data-inspector))]))
|
||||||
|
|
||||||
|
(rum/defc report-item-button
|
||||||
|
[title description icon-name {:keys [on-click]}]
|
||||||
|
[:a.cp__bug-report-item-button.flex.items-center.px-4.py-2.my-2.rounded-lg {:on-click on-click}
|
||||||
|
[(ui/icon icon-name)
|
||||||
|
[:div.flex.flex-col.ml-2
|
||||||
|
[:div title]
|
||||||
|
[:div.opacity-60 description]]]])
|
||||||
|
|
||||||
|
(rum/defc bug-report
|
||||||
|
[]
|
||||||
|
[:div.flex.flex-col
|
||||||
|
[:div.flex.flex-col.items-center
|
||||||
|
[:div.flex.items-center.mb-2
|
||||||
|
(ui/icon "bug")
|
||||||
|
[:h1.text-3xl.ml-2 "Bug report"]]
|
||||||
|
[:div.opacity-60 "Can you help us out by submitting a bug report? We'll get it sorted out as soon as we can."]]
|
||||||
|
[:div.cp__bug-report-reporter.rounded-lg.p-8.mt-8
|
||||||
|
[:h1.text-2xl "Is the bug you encountered related to these features?"]
|
||||||
|
[:div.opacity-60 "You can use these handy tools to give us additional information."]
|
||||||
|
(report-item-button "Clipboard helper"
|
||||||
|
"Inspect and collect clipboard data"
|
||||||
|
"clipboard"
|
||||||
|
{:on-click #(util/open-url (rfe/href :bug-report-tools {:tool "clipboard-data-inspector"}))})
|
||||||
|
[:div.py-2] ;; divider
|
||||||
|
[:div.flex.flex-col
|
||||||
|
[:h1.text-2xl "Or..."]
|
||||||
|
[:div.opacity-60 "If there are no tools available for you to gather additional information, please report the bug directly."]
|
||||||
|
(report-item-button "Submit a bug report" "Help Make Logseq Better!" "message-report" {:on-click #(util/open-url header/bug-report-url)})]]])
|
|
@ -0,0 +1,7 @@
|
||||||
|
.cp__bug-report-reporter {
|
||||||
|
background-color: var(--ls-tertiary-background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cp__bug-report-item-button {
|
||||||
|
background-color: var(--ls-quaternary-background-color);
|
||||||
|
}
|
|
@ -70,6 +70,7 @@
|
||||||
(str "https://github.com/logseq/logseq/issues/new?"
|
(str "https://github.com/logseq/logseq/issues/new?"
|
||||||
"title=&"
|
"title=&"
|
||||||
"template=bug_report.yaml&"
|
"template=bug_report.yaml&"
|
||||||
|
"labels=from:in-app&"
|
||||||
"platform="
|
"platform="
|
||||||
(js/encodeURIComponent platform))))
|
(js/encodeURIComponent platform))))
|
||||||
|
|
||||||
|
@ -120,9 +121,7 @@
|
||||||
|
|
||||||
{:title [:div.flex-row.flex.justify-between.items-center
|
{:title [:div.flex-row.flex.justify-between.items-center
|
||||||
[:span (t :help/bug)]]
|
[:span (t :help/bug)]]
|
||||||
:options {:href bug-report-url
|
:options {:href (rfe/href :bug-report)}
|
||||||
:title "Fire a bug report on Github"
|
|
||||||
:target "_blank"}
|
|
||||||
:icon (ui/icon "bug")}
|
:icon (ui/icon "bug")}
|
||||||
|
|
||||||
(when (and (state/sub :auth/id-token) (user-handler/logged-in?))
|
(when (and (state/sub :auth/id-token) (user-handler/logged-in?))
|
||||||
|
|
|
@ -170,7 +170,9 @@
|
||||||
[:string (when-let [updated-at (:block/updated-at item)]
|
[:string (when-let [updated-at (:block/updated-at item)]
|
||||||
(date/int->local-time-2 updated-at))]
|
(date/int->local-time-2 updated-at))]
|
||||||
|
|
||||||
[:string (get-in item [:block/properties-text-values column])])]
|
[:string (or (get-in item [:block/properties-text-values column])
|
||||||
|
;; Fallback to property relationships for page blocks
|
||||||
|
(get-in item [:block/properties column]))])]
|
||||||
[:td.whitespace-nowrap {:on-mouse-down (fn [] (reset! select? false))
|
[:td.whitespace-nowrap {:on-mouse-down (fn [] (reset! select? false))
|
||||||
:on-mouse-move (fn [] (reset! select? true))
|
:on-mouse-move (fn [] (reset! select? true))
|
||||||
:on-mouse-up (fn []
|
:on-mouse-up (fn []
|
||||||
|
|
|
@ -29,21 +29,20 @@
|
||||||
|
|
||||||
(defn inflate-asset
|
(defn inflate-asset
|
||||||
[original-path]
|
[original-path]
|
||||||
(let [filename (util/node-path.basename original-path)
|
(let [filename (util/node-path.basename original-path)
|
||||||
web-link? (string/starts-with? original-path "http")
|
web-link? (string/starts-with? original-path "http")
|
||||||
ext-name (util/get-file-ext filename)
|
ext-name (util/get-file-ext filename)
|
||||||
url (assets-handler/normalize-asset-resource-url original-path)]
|
url (assets-handler/normalize-asset-resource-url original-path)
|
||||||
(when-let [key
|
filekey (util/safe-sanitize-file-name (subs filename 0 (- (count filename) (inc (count ext-name)))))]
|
||||||
(if web-link?
|
(when-let [key (and (not (string/blank? filekey))
|
||||||
(str (hash url))
|
(if web-link?
|
||||||
(and
|
(str filekey "__" (hash url)) filekey))]
|
||||||
(= ext-name "pdf")
|
|
||||||
(subs filename 0 (- (count filename) 4))))]
|
{:key key
|
||||||
{:key key
|
:identity (subs key (- (count key) 15))
|
||||||
:identity (subs key (- (count key) 15))
|
:filename filename
|
||||||
:filename filename
|
:url url
|
||||||
:url url
|
:hls-file (str "assets/" key ".edn")
|
||||||
:hls-file (str "assets/" key ".edn")
|
|
||||||
:original-path original-path})))
|
:original-path original-path})))
|
||||||
|
|
||||||
(defn resolve-area-image-file
|
(defn resolve-area-image-file
|
||||||
|
|
|
@ -183,6 +183,7 @@
|
||||||
(-> filename
|
(-> filename
|
||||||
(subs 0 (if local-asset? (- len 15) len))
|
(subs 0 (if local-asset? (- len 15) len))
|
||||||
(string/replace #"^hls__" "")
|
(string/replace #"^hls__" "")
|
||||||
|
(string/replace #"__[-\d]+$" "")
|
||||||
(string/replace "_" " ")
|
(string/replace "_" " ")
|
||||||
(string/trimr))
|
(string/trimr))
|
||||||
filename))))
|
filename))))
|
||||||
|
|
|
@ -146,7 +146,7 @@
|
||||||
;; refresh remote graph list by pub login event
|
;; refresh remote graph list by pub login event
|
||||||
(when (user-uuid) (state/pub-event! [:user/fetch-info-and-graphs]))))))
|
(when (user-uuid) (state/pub-event! [:user/fetch-info-and-graphs]))))))
|
||||||
|
|
||||||
(defn login-callback [code]
|
(defn ^:export login-callback [code]
|
||||||
(state/set-state! [:ui/loading? :login] true)
|
(state/set-state! [:ui/loading? :login] true)
|
||||||
(go
|
(go
|
||||||
(let [resp (<! (http/get (str "https://" config/API-DOMAIN "/auth_callback?code=" code)
|
(let [resp (<! (http/get (str "https://" config/API-DOMAIN "/auth_callback?code=" code)
|
||||||
|
|
|
@ -10,8 +10,9 @@
|
||||||
[frontend.components.search :as search]
|
[frontend.components.search :as search]
|
||||||
[frontend.components.settings :as settings]
|
[frontend.components.settings :as settings]
|
||||||
[frontend.components.shortcut :as shortcut]
|
[frontend.components.shortcut :as shortcut]
|
||||||
[frontend.components.whiteboard :as whiteboard]
|
[frontend.components.whiteboard :as whiteboard]
|
||||||
[frontend.extensions.zotero :as zotero]))
|
[frontend.extensions.zotero :as zotero]
|
||||||
|
[frontend.components.bug-report :as bug-report]))
|
||||||
|
|
||||||
;; http://localhost:3000/#?anchor=fn.1
|
;; http://localhost:3000/#?anchor=fn.1
|
||||||
(def routes
|
(def routes
|
||||||
|
@ -78,6 +79,14 @@
|
||||||
["/import"
|
["/import"
|
||||||
{:name :import
|
{:name :import
|
||||||
:view setups/importer}]
|
:view setups/importer}]
|
||||||
|
|
||||||
|
["/bug-report"
|
||||||
|
{:name :bug-report
|
||||||
|
:view bug-report/bug-report}]
|
||||||
|
|
||||||
|
["/bug-report-tool/:tool"
|
||||||
|
{:name :bug-report-tools
|
||||||
|
:view bug-report/bug-report-tool-route}]
|
||||||
|
|
||||||
["/all-journals"
|
["/all-journals"
|
||||||
{:name :all-journals
|
{:name :all-journals
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
(ns ^:no-doc frontend.version)
|
(ns ^:no-doc frontend.version)
|
||||||
|
|
||||||
(defonce version "0.8.15")
|
(defonce version "0.8.16")
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
(are [x y] (= y (pdf-utils/fix-local-asset-pagename x))
|
(are [x y] (= y (pdf-utils/fix-local-asset-pagename x))
|
||||||
"2015_Book_Intertwingled_1659920114630_0" "2015 Book Intertwingled"
|
"2015_Book_Intertwingled_1659920114630_0" "2015 Book Intertwingled"
|
||||||
"hls__2015_Book_Intertwingled_1659920114630_0" "2015 Book Intertwingled"
|
"hls__2015_Book_Intertwingled_1659920114630_0" "2015 Book Intertwingled"
|
||||||
"hls/2015_Book_Intertwingled_1659920114630_0" "hls/2015 Book Intertwingled"))
|
"hls/2015_Book_Intertwingled_1659920114630_0" "hls/2015 Book Intertwingled"
|
||||||
|
"hls__sicp__-1234567" "sicp"))
|
||||||
(testing "non matched filenames"
|
(testing "non matched filenames"
|
||||||
(are [x y] (= y (pdf-utils/fix-local-asset-pagename x))
|
(are [x y] (= y (pdf-utils/fix-local-asset-pagename x))
|
||||||
"foo" "foo"
|
"foo" "foo"
|
||||||
|
|
Loading…
Reference in New Issue