diff --git a/src/clj/auto_ap/parse/csv.clj b/src/clj/auto_ap/parse/csv.clj index 50e2b59c..2b4fd429 100644 --- a/src/clj/auto_ap/parse/csv.clj +++ b/src/clj/auto_ap/parse/csv.clj @@ -29,6 +29,9 @@ (str/includes? (str header) "Status") :ledyard + + (str/includes? (str header) "Due Date") + :ledyard :else nil)] diff --git a/src/clj/auto_ap/ssr/components/aside.clj b/src/clj/auto_ap/ssr/components/aside.clj index 045d7840..629975e8 100644 --- a/src/clj/auto_ap/ssr/components/aside.clj +++ b/src/clj/auto_ap/ssr/components/aside.clj @@ -151,7 +151,7 @@ :hx-boost "true"} "Import")) - (when (can? (:identity request) + #_(when (can? (:identity request) {:subject :invoice :activity :import}) (menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes diff --git a/src/clj/auto_ap/ssr/components/page.clj b/src/clj/auto_ap/ssr/components/page.clj index b51a40b6..952bd3ae 100644 --- a/src/clj/auto_ap/ssr/components/page.clj +++ b/src/clj/auto_ap/ssr/components/page.clj @@ -8,10 +8,13 @@ (defn page- [{:keys [nav page-specific client clients client-selection identity app-params request] :or {app-params {}} } & children] [:div#app {"_" (hiccup/raw " - on notification from body put event.detail.value into #notification-details then add .htmx-added to #notification-holder then remove .hidden from #notification-holder then wait 30ms then remove .htmx-added from #notification-holder - on htmx:responseError put event.detail.xhr.response into #error-details then add .htmx-added to #error-holder then remove .hidden from #error-holder then wait 30ms then remove .htmx-added from #error-holder" + on notification from body put event.detail.value into #notification-details then add .htmx-added to #notification-holder then remove .hidden from #notification-holder then wait 30ms then remove .htmx-added from #notification-holder " ) - :x-data (hx/json {:leftNavShow true}) + + :x-data (hx/json {:leftNavShow true + :showError false + :errorDetails ""}) + "@htmx:response-error.camel" "errorDetails = $event.detail.xhr.response; showError=true;" } (navbar- {:client-selection client-selection :clients clients @@ -40,22 +43,28 @@ [:div {:class "p-4 text-lg w-full" :role "alert"} [:div.text-sm [:pre#notification-details.text-xs]]]]]] - [:div#error-holder.hidden + [:div#error-holder.z-50 {:x-show "showError" + + } [:div.fixed.top-0.right-0.left-0.z-30.mx-auto.max-w-screen-lg.w-screen-lg.my-0.pt-8.rounded-lg [:div.relative [:button.absolute.right-2.top-2.w-6.h-6.z-50.text-red-600 - {"_" (hiccup/raw "on click add .hidden to #error-holder")} + { "@click" "showError=false"} svg/filled-x]] - [:div.m-4.overflow-auto.z-30.flex.center-items.justify-center.text-red-800.bg-red-50.dark:bg-gray-800.dark:text-red-400.border-red-300.rounded-lg.border.transition-all.duration-500.fade-in.slide-up.max-h-96 - + [:div.m-4.overflow-auto.z-30.flex.center-items.justify-center.text-red-800.bg-red-50.dark:bg-gray-800.dark:text-red-400.border-red-300.rounded-lg.border.max-h-96 + {:x-show "showError" + "x-transition:enter" "transition duration-300" + "x-transition:enter-start" "opacity-0" + "x-transition:enter-end" "opacity-100"} + [:div {:class "p-4 mb-4 text-lg w-full" :role "alert"} [:div.inline-block.w-8.h-8.mr-2 svg/alert] [:span.font-medium "Oh, drat! An unexpected error has occurred."] - [:div.text-sm + [:div.text-sm {:x-data (hx/json {"expandError" false})} [:p "Integreat staff have been notified and are looking into it. "] - [:p "To see error details, " [:a.underline {:href "#" :data-collapse-toggle "error-details"} "click here"] "."] - [:pre#error-details.text-xs.hidden]]]]]] + [:p "To see error details, " [:a.underline.cursor-pointer {"@click" "expandError=true"} "click here"] "."] + [:pre#error-details.text-xs {:x-show "expandError" :x-text "errorDetails"}]]]]]] (into [:div.p-4] children)]] diff --git a/src/clj/auto_ap/ssr/grid_page_helper.clj b/src/clj/auto_ap/ssr/grid_page_helper.clj index ba77ab4d..e09077cb 100644 --- a/src/clj/auto_ap/ssr/grid_page_helper.clj +++ b/src/clj/auto_ap/ssr/grid_page_helper.clj @@ -293,7 +293,8 @@ (apply com/breadcrumbs {} (:breadcrumbs grid-spec)) (when (:above-grid grid-spec) ( (:above-grid grid-spec) request)) - [:div {:x-data (hx/json {:selected [] :all_selected false}) + [:div {:x-data (hx/json {:selected [] :all_selected false :type (:entity-name grid-spec)}) + "x-on:copy" "if (selected.length > 0) {$clipboard(JSON.stringify({'type': type, 'selected': selected}))}" "x-on:client-selected.document" "selected=[]; all_selected=false" "x-bind:hx-vals" "JSON.stringify({selected: $data.selected, 'all-selected': $data.all_selected})" :x-init "$watch('selected', s=> $dispatch('selectedChanged', {selected: s, all_selected: all_selected}) ); diff --git a/src/clj/auto_ap/ssr/ui.clj b/src/clj/auto_ap/ssr/ui.clj index faf7c079..f27ea6d7 100644 --- a/src/clj/auto_ap/ssr/ui.clj +++ b/src/clj/auto_ap/ssr/ui.clj @@ -55,6 +55,7 @@ [:script {:src "https://unpkg.com/dropzone@5.9.3/dist/min/dropzone.min.js"}] [:link {:rel "stylesheet" :href "https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" :type "text/css"}] [:script {:defer true :src "/js/alpine-vals.js"}] + [:script {:defer true :src "https://cdn.jsdelivr.net/npm/@ryangjchandler/alpine-clipboard@2.x.x/dist/alpine-clipboard.js"}] [:script {:defer true :src "https://cdn.jsdelivr.net/npm/@alpinejs/focus@3.x.x/dist/cdn.min.js"}] [:script {:defer true :src "https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"}] [:script {:src "https://cdn.jsdelivr.net/npm/signature_pad@4.1.7/dist/signature_pad.umd.min.js"}] diff --git a/src/cljc/auto_ap/routes/invoice.cljc b/src/cljc/auto_ap/routes/invoice.cljc index 03cc19a2..5ec8cd1c 100644 --- a/src/cljc/auto_ap/routes/invoice.cljc +++ b/src/cljc/auto_ap/routes/invoice.cljc @@ -31,13 +31,7 @@ ["/" [#"\d+" :db/id]] {:delete ::delete "/unvoid" ::unvoid "/edit" ::edit-wizard} - "/table" ::table - - "/glimpse" {"" {:get :invoice-glimpse - :post :invoice-glimpse-upload - ["/" [#"\w+" :textract-invoice-id]] {:get :invoice-glimpse-textract-invoice - "/create" {:post :invoice-glimpse-create-invoice} - "/update" {:patch :invoice-glimpse-update-textract-invoice}}}}}) + "/table" ::table }) (def legacy-routes {"" ::legacy-invoices "import" ::legacy-import-invoices