gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-merchant-backoffice] branch master updated: added search by date


From: gnunet
Subject: [taler-merchant-backoffice] branch master updated: added search by date
Date: Tue, 23 Mar 2021 22:04:19 +0100

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository merchant-backoffice.

The following commit(s) were added to refs/heads/master by this push:
     new 38b872b  added search by date
38b872b is described below

commit 38b872bd8cd388cbb1d09369a7f5e78535dcc213
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Tue Mar 23 18:04:04 2021 -0300

    added search by date
---
 packages/frontend/src/AdminRoutes.tsx              |   5 +-
 packages/frontend/src/ApplicationReadyRoutes.tsx   |   5 +-
 .../frontend/src/components/exception/loading.tsx  |  27 +-
 .../frontend/src/components/form/DatePicker.tsx    | 329 +++++++++++++++++++++
 packages/frontend/src/declaration.d.ts             |   1 -
 packages/frontend/src/hooks/backend.ts             |  25 +-
 .../frontend/src/paths/admin/create/CreatePage.tsx |   4 +-
 packages/frontend/src/paths/admin/create/index.tsx |   6 +-
 .../src/paths/instance/orders/create/index.tsx     |  21 ++
 .../src/paths/instance/orders/list/Table.tsx       |   5 +-
 .../src/paths/instance/orders/list/index.tsx       |  88 ++++--
 .../src/paths/instance/orders/update/index.tsx     |  21 ++
 .../src/paths/instance/products/create/index.tsx   |  21 ++
 .../src/paths/instance/products/list/index.tsx     |  21 ++
 .../src/paths/instance/products/update/index.tsx   |  21 ++
 .../src/paths/instance/tips/create/index.tsx       |  21 ++
 .../src/paths/instance/tips/list/index.tsx         |  21 ++
 .../src/paths/instance/tips/update/index.tsx       |  21 ++
 .../src/paths/instance/transfers/create/index.tsx  |  21 ++
 .../src/paths/instance/transfers/list/index.tsx    |  21 ++
 .../src/paths/instance/transfers/update/index.tsx  |  21 ++
 packages/frontend/src/scss/_custom-calendar.scss   | 244 +++++++++++++++
 packages/frontend/src/scss/_loading.scss           |  35 +++
 packages/frontend/src/scss/main.scss               |  38 +--
 packages/frontend/src/utils/constants.ts           |   7 +-
 packages/frontend/src/utils/table.ts               |  19 ++
 26 files changed, 974 insertions(+), 95 deletions(-)

diff --git a/packages/frontend/src/AdminRoutes.tsx 
b/packages/frontend/src/AdminRoutes.tsx
index aefe6a0..d7d0dc3 100644
--- a/packages/frontend/src/AdminRoutes.tsx
+++ b/packages/frontend/src/AdminRoutes.tsx
@@ -27,10 +27,7 @@ export enum AdminPaths {
   instance_id_route = '/instance/:id/:rest*',
 }
 
-interface Props {
-  // pushNotification: (n: Notification) => void;
-}
-export function AdminRoutes({ }: Props): VNode {
+export function AdminRoutes(): VNode {
   const i18n = useMessageTemplate();
   
   return <Router>
diff --git a/packages/frontend/src/ApplicationReadyRoutes.tsx 
b/packages/frontend/src/ApplicationReadyRoutes.tsx
index c16caf2..607a6fe 100644
--- a/packages/frontend/src/ApplicationReadyRoutes.tsx
+++ b/packages/frontend/src/ApplicationReadyRoutes.tsx
@@ -28,9 +28,8 @@ import LoginPage from './paths/login';
 import { INSTANCE_ID_LOOKUP } from './utils/constants';
 import { NotYetReadyAppMenu, Menu, NotificationCard } from './components/menu';
 import { useMessageTemplate } from 'preact-messages';
-interface Props {
-}
-export function ApplicationReadyRoutes({ }: Props): VNode {
+
+export function ApplicationReadyRoutes(): VNode {
   const i18n = useMessageTemplate();
   const { url: backendURL, changeBackend, updateToken, clearAllTokens } = 
useBackendContext();
 
diff --git a/packages/frontend/src/components/exception/loading.tsx 
b/packages/frontend/src/components/exception/loading.tsx
index aa73453..40c7c7b 100644
--- a/packages/frontend/src/components/exception/loading.tsx
+++ b/packages/frontend/src/components/exception/loading.tsx
@@ -1,9 +1,32 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from "preact";
 
 export function Loading(): VNode {
-  return <div class="columns is-centered is-vcentered" 
style={{height:'calc(100% - 3rem)',position:'absolute', width:'100%'}}>
+  return <div class="columns is-centered is-vcentered" style={{ height: 
'calc(100% - 3rem)', position: 'absolute', width: '100%' }}>
     <div class="column is-one-fifth">
-      <div class="lds-ring"><div></div><div></div><div></div><div></div></div>
+      <div class="lds-ring">
+        <div /><div /><div /><div />
+      </div>
     </div>
   </div>
 }
\ No newline at end of file
diff --git a/packages/frontend/src/components/form/DatePicker.tsx 
b/packages/frontend/src/components/form/DatePicker.tsx
new file mode 100644
index 0000000..0a95094
--- /dev/null
+++ b/packages/frontend/src/components/form/DatePicker.tsx
@@ -0,0 +1,329 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
+import { h, Component } from "preact";
+
+interface Props {
+  closeFunction?: () => void;
+  dateReceiver?: (d: Date) => void;
+  opened?: boolean;
+}
+interface State {
+  displayedMonth: number;
+  displayedYear: number;
+  selectYearMode: boolean;
+  currentDate: Date;
+}
+
+// inspired by https://codepen.io/m4r1vs/pen/MOOxyE
+export class DatePicker extends Component<Props, State> {
+
+  closeDatePicker() {
+    this.props.closeFunction && this.props.closeFunction(); // Function gets 
passed by parent
+  }
+
+  /**
+  * Gets fired when a day gets clicked.
+  * @param {object} e The event thrown by the <span /> element clicked
+  */
+  dayClicked(e: any) {
+
+    const element = e.target; // the actual element clicked
+
+    if (element.innerHTML === '') return false; // don't continue if <span /> 
empty
+
+    // get date from clicked element (gets attached when rendered)
+    const date = new Date(element.getAttribute('data-value'));
+
+    // update the state
+    this.setState({ currentDate: date });
+    this.passDateToParent(date)
+  }
+
+  /**
+  * returns days in month as array
+  * @param {number} month the month to display
+  * @param {number} year the year to display
+  */
+  getDaysByMonth(month: number, year: number) {
+
+    const calendar = [];
+
+    const date = new Date(year, month, 1); // month to display
+
+    const firstDay = new Date(year, month, 1).getDay(); // first weekday of 
month
+    const lastDate = new Date(year, month + 1, 0).getDate(); // last date of 
month
+
+    let day: number | null = 0;
+
+    // the calendar is 7*6 fields big, so 42 loops
+    for (let i = 0; i < 42; i++) {
+
+      if (i >= firstDay && day !== null) day = day + 1;
+      if (day !== null && day > lastDate) day = null;
+
+      // append the calendar Array
+      calendar.push({
+        day: (day === 0 || day === null) ? null : day, // null or number
+        date: (day === 0 || day === null) ? null : new Date(year, month, day), 
// null or Date()
+        today: (day === now.getDate() && month === now.getMonth() && year === 
now.getFullYear()) // boolean
+      });
+    }
+
+    return calendar;
+  }
+
+  /**
+  * Display previous month by updating state
+  */
+  displayPrevMonth() {
+    if (this.state.displayedMonth <= 0) {
+      this.setState({
+        displayedMonth: 11,
+        displayedYear: this.state.displayedYear - 1
+      });
+    }
+    else {
+      this.setState({
+        displayedMonth: this.state.displayedMonth - 1
+      });
+    }
+  }
+
+  /**
+  * Display next month by updating state
+  */
+  displayNextMonth() {
+    if (this.state.displayedMonth >= 11) {
+      this.setState({
+        displayedMonth: 0,
+        displayedYear: this.state.displayedYear + 1
+      });
+    }
+    else {
+      this.setState({
+        displayedMonth: this.state.displayedMonth + 1
+      });
+    }
+  }
+
+  /**
+  * Display the selected month (gets fired when clicking on the date string)
+  */
+  displaySelectedMonth() {
+    if (this.state.selectYearMode) {
+      this.toggleYearSelector();
+    }
+    else {
+      if (!this.state.currentDate) return false;
+      this.setState({
+        displayedMonth: this.state.currentDate.getMonth(),
+        displayedYear: this.state.currentDate.getFullYear()
+      });
+    }
+  }
+
+  toggleYearSelector() {
+    this.setState({ selectYearMode: !this.state.selectYearMode });
+  }
+
+  changeDisplayedYear(e: any) {
+    const element = e.target;
+    this.toggleYearSelector();
+    this.setState({ displayedYear: parseInt(element.innerHTML, 10), 
displayedMonth: 0 });
+  }
+
+  /**
+  * Pass the selected date to parent when 'OK' is clicked
+  */
+  passSavedDateDateToParent() {
+    this.passDateToParent(this.state.currentDate)
+  }
+  passDateToParent(date: Date) {
+    if (typeof this.props.dateReceiver === 'function') 
this.props.dateReceiver(date);
+    this.closeDatePicker();
+  }
+
+  componentDidUpdate() {
+    if (this.state.selectYearMode) {
+      document.getElementsByClassName('selected')[0].scrollIntoView(); // 
works in every browser incl. IE, replace with scrollIntoViewIfNeeded when 
browsers support it
+    }
+  }
+
+  constructor() {
+    super();
+
+    this.closeDatePicker = this.closeDatePicker.bind(this);
+    this.dayClicked = this.dayClicked.bind(this);
+    this.displayNextMonth = this.displayNextMonth.bind(this);
+    this.displayPrevMonth = this.displayPrevMonth.bind(this);
+    this.getDaysByMonth = this.getDaysByMonth.bind(this);
+    this.changeDisplayedYear = this.changeDisplayedYear.bind(this);
+    this.passDateToParent = this.passDateToParent.bind(this);
+    this.toggleYearSelector = this.toggleYearSelector.bind(this);
+    this.displaySelectedMonth = this.displaySelectedMonth.bind(this);
+
+
+    this.state = {
+      currentDate: now,
+      displayedMonth: now.getMonth(),
+      displayedYear: now.getFullYear(),
+      selectYearMode: false
+    }
+  }
+
+  render() {
+
+    const { currentDate, displayedMonth, displayedYear, selectYearMode } = 
this.state;
+
+    return (
+      <div>
+        <div class={"datePicker " + (this.props.opened && 
"datePicker--opened")} >
+
+          <div class="datePicker--titles">
+            <h3 style={{
+              color: selectYearMode ? 'rgba(255,255,255,.87)' : 
'rgba(255,255,255,.57)'
+            }} 
onClick={this.toggleYearSelector}>{currentDate.getFullYear()}</h3>
+            <h2 style={{
+              color: !selectYearMode ? 'rgba(255,255,255,.87)' : 
'rgba(255,255,255,.57)'
+            }} onClick={this.displaySelectedMonth}>
+              {dayArr[currentDate.getDay()]}, 
{monthArrShort[currentDate.getMonth()]} {currentDate.getDate()}
+            </h2>
+          </div>
+
+          {!selectYearMode && <nav>
+            <span onClick={this.displayPrevMonth} class="icon"><i style={{ 
transform: 'rotate(180deg)' }} class="mdi mdi-forward" /></span>
+            <h4>{monthArrShortFull[displayedMonth]} {displayedYear}</h4>
+            <span onClick={this.displayNextMonth} class="icon"><i class="mdi 
mdi-forward" /></span>
+          </nav>}
+
+          <div class="datePicker--scroll">
+
+            {!selectYearMode && <div class="datePicker--calendar" >
+
+              <div class="datePicker--dayNames">
+                {['S', 'M', 'T', 'W', 'T', 'F', 'S'].map(day => 
<span>{day}</span>)}
+              </div>
+
+              <div onClick={this.dayClicked} class="datePicker--days">
+
+                {/*
+                  Loop through the calendar object returned by 
getDaysByMonth().
+                */}
+
+                {this.getDaysByMonth(this.state.displayedMonth, 
this.state.displayedYear)
+                  .map(
+                    day => {
+                      let selected = false;
+
+                      if (currentDate && day.date) selected = 
(currentDate.toLocaleDateString() === day.date.toLocaleDateString());
+
+                      return (<span
+                        class={(day.today ? 'datePicker--today ' : '') + 
(selected ? 'datePicker--selected' : '')}
+                        disabled={!day.date}
+                        data-value={day.date}
+                      >
+                        {day.day}
+                      </span>)
+                    }
+                  )
+                }
+
+              </div>
+
+            </div>}
+
+            {selectYearMode && <div class="datePicker--selectYear">
+
+              {yearArr.map(year => (
+                <span class={(year === displayedYear) ? 'selected' : ''} 
onClick={this.changeDisplayedYear}>
+                  {year}
+                </span>
+              ))}
+
+            </div>}
+
+            {/* {!selectYearMode && <div class="datePicker--actions">
+              <button onClick={this.closeDatePicker}>CANCEL</button>
+              <button onClick={this.passDateToParent}>OK</button>
+            </div>} */}
+
+          </div>
+        </div>
+
+        <div class="datePicker--background" onClick={this.closeDatePicker} 
style={{
+          display: this.props.opened ? 'block' : 'none'
+        }}
+        />
+
+      </div>
+    )
+  }
+}
+
+
+const monthArrShortFull = [
+  'January',
+  'February',
+  'March',
+  'April',
+  'May',
+  'June',
+  'July',
+  'August',
+  'September',
+  'October',
+  'November',
+  'December'
+]
+
+const monthArrShort = [
+  'Jan',
+  'Feb',
+  'Mar',
+  'Apr',
+  'May',
+  'Jun',
+  'Jul',
+  'Aug',
+  'Sep',
+  'Oct',
+  'Nov',
+  'Dec'
+]
+
+const dayArr = [
+  'Sun',
+  'Mon',
+  'Tue',
+  'Wed',
+  'Thu',
+  'Fri',
+  'Sat'
+]
+
+const now = new Date()
+
+const yearArr: number[] = []
+
+for (let i = 2010; i <= now.getFullYear() + 10; i++) {
+  yearArr.push(i);
+}
diff --git a/packages/frontend/src/declaration.d.ts 
b/packages/frontend/src/declaration.d.ts
index c0e541f..8a882f6 100644
--- a/packages/frontend/src/declaration.d.ts
+++ b/packages/frontend/src/declaration.d.ts
@@ -20,7 +20,6 @@
 */
 
 
-
 type HashCode = string;
 type EddsaPublicKey = string;
 type EddsaSignature = string;
diff --git a/packages/frontend/src/hooks/backend.ts 
b/packages/frontend/src/hooks/backend.ts
index 9721f9f..540ed43 100644
--- a/packages/frontend/src/hooks/backend.ts
+++ b/packages/frontend/src/hooks/backend.ts
@@ -110,9 +110,8 @@ function fetcher(url: string, token: string, backend: 
string) {
 
 type YesOrNo = 'yes' | 'no';
 
-function orderFetcher(url: string, token: string, backend: string, paid?: 
YesOrNo, refunded?: YesOrNo, wired?: YesOrNo, date?: Date, start?: number, 
delta?: number) {
-  //%Y-%m-%d %H:%M:%S
-  return request(`${backend}${url}`, { token, params: { paid, refunded, wired, 
start, delta, date: date? format(date, 'yyyy-MM-dd HH:mm:ss'): undefined } })
+function orderFetcher(url: string, token: string, backend: string, paid?: 
YesOrNo, refunded?: YesOrNo, wired?: YesOrNo, date?: Date, delta?: number) {
+  return request(`${backend}${url}`, { token, params: { paid, refunded, wired, 
delta, date: date? format(date, 'yyyy-MM-dd HH:mm:ss'): undefined } })
 }
 
 function transferFetcher(url: string, token: string, backend: string) {
@@ -472,7 +471,7 @@ export interface InstanceOrderFilter {
   date?: Date;
 }
 
-export function useInstanceOrders(args?: InstanceOrderFilter): 
HttpResponse<MerchantBackend.Orders.OrderHistory> {
+export function useInstanceOrders(args: InstanceOrderFilter, updateFilter: 
(d:Date)=>void): HttpResponse<MerchantBackend.Orders.OrderHistory> {
   const { url: baseUrl, token: baseToken } = useBackendContext();
   const { token: instanceToken, id, admin } = useInstanceContext();
 
@@ -482,18 +481,18 @@ export function useInstanceOrders(args?: 
InstanceOrderFilter): HttpResponse<Merc
     url: `${baseUrl}/instances/${id}`, token: instanceToken
   }
 
-  const [pageBefore, setPageBefore] = useState(0)
+  const [pageBefore, setPageBefore] = useState(1)
   const [pageAfter, setPageAfter] = useState(1)
-  const [start, setStart] = useState<number | undefined>(17);
+
   const totalAfter = pageAfter * PAGE_SIZE;
   const totalBefore = pageBefore * PAGE_SIZE;
 
   const { data:beforeData, error:beforeError } = 
useSWR<MerchantBackend.Orders.OrderHistory, SwrError>(
-    [`/private/orders`, token, url, args?.paid, args?.refunded, args?.wired, 
args?.date, start, totalBefore],
+    [`/private/orders`, token, url, args?.paid, args?.refunded, args?.wired, 
args?.date, totalBefore],
     orderFetcher,
   )
   const { data:afterData, error:afterError } = 
useSWR<MerchantBackend.Orders.OrderHistory, SwrError>(
-    [`/private/orders`, token, url, args?.paid, args?.refunded, args?.wired, 
args?.date, start ? start+1 : undefined, -totalAfter],
+    [`/private/orders`, token, url, args?.paid, args?.refunded, args?.wired, 
args?.date, -totalAfter],
     orderFetcher,
   )
 
@@ -513,9 +512,8 @@ export function useInstanceOrders(args?: 
InstanceOrderFilter): HttpResponse<Merc
     if (totalAfter < MAX_RESULT_SIZE) {
       setPageAfter(pageAfter + 1)
     } else {
-      const from = afterData?.orders?.[PAGE_SIZE]?.row_id
-      console.log('after',start,from)
-      if (from) setStart(from)
+      const from = afterData?.orders?.[PAGE_SIZE]?.timestamp?.t_ms
+      if (from) updateFilter(new Date(from))
     }
   }
 
@@ -523,9 +521,8 @@ export function useInstanceOrders(args?: 
InstanceOrderFilter): HttpResponse<Merc
     if (totalBefore < MAX_RESULT_SIZE) {
       setPageBefore(pageBefore + 1)
     } else {
-      const from = beforeData?.orders?.[PAGE_SIZE-1]?.row_id
-      console.log('prev',start,from)
-      if (from) setStart(from)
+      const from = beforeData?.orders?.[PAGE_SIZE-1]?.timestamp?.t_ms
+      if (from) updateFilter(new Date(from))
     }
   }
 
diff --git a/packages/frontend/src/paths/admin/create/CreatePage.tsx 
b/packages/frontend/src/paths/admin/create/CreatePage.tsx
index 4c26caa..84a6241 100644
--- a/packages/frontend/src/paths/admin/create/CreatePage.tsx
+++ b/packages/frontend/src/paths/admin/create/CreatePage.tsx
@@ -48,7 +48,7 @@ interface KeyValue {
   [key: string]: string;
 }
 
-function with_defaults(id?:string): Partial<Entity> {
+function with_defaults(id?: string): Partial<Entity> {
   return {
     id,
     default_pay_delay: { d_ms: 1000 },
@@ -87,7 +87,7 @@ export function CreatePage({ onCreate, isLoading, onBack, 
forceId }: Props): VNo
         <div class="column is-two-thirds">
           <FormProvider<Entity> errors={errors} object={value} 
valueHandler={valueHandler} >
 
-            <InputWithAddon<Entity> name="id" 
addonBefore={`${backend.url}/private/instances/`} readonly={!!forceId}/>
+            <InputWithAddon<Entity> name="id" 
addonBefore={`${backend.url}/private/instances/`} readonly={!!forceId} />
 
             <Input<Entity> name="name" />
 
diff --git a/packages/frontend/src/paths/admin/create/index.tsx 
b/packages/frontend/src/paths/admin/create/index.tsx
index 023f0b2..7205e12 100644
--- a/packages/frontend/src/paths/admin/create/index.tsx
+++ b/packages/frontend/src/paths/admin/create/index.tsx
@@ -119,12 +119,10 @@ function CreatedSuccessfully({ children, onConfirm }: 
CreatedSuccessfullyProps)
         </div>
         <footer class="card-footer">
           <p class="card-footer-item" style={{ border: 'none' }}>
-            <span>
-            </span>
+            <span />
           </p>
           <p class="card-footer-item" style={{ border: 'none' }}>
-            <span>
-            </span>
+            <span />
           </p>
           <p class="card-footer-item">
             <button class="button is-info" 
onClick={onConfirm}>Continue</button>
diff --git a/packages/frontend/src/paths/instance/orders/create/index.tsx 
b/packages/frontend/src/paths/instance/orders/create/index.tsx
index 2d84be3..f0d2ae0 100644
--- a/packages/frontend/src/paths/instance/orders/create/index.tsx
+++ b/packages/frontend/src/paths/instance/orders/create/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 
 export default function ():VNode {
diff --git a/packages/frontend/src/paths/instance/orders/list/Table.tsx 
b/packages/frontend/src/paths/instance/orders/list/Table.tsx
index 4079faf..6f202d7 100644
--- a/packages/frontend/src/paths/instance/orders/list/Table.tsx
+++ b/packages/frontend/src/paths/instance/orders/list/Table.tsx
@@ -65,9 +65,8 @@ export function CardTable({ instances, onCreate, onUpdate, 
onDelete, selected, o
     <header class="card-header">
       <p class="card-header-title"><span class="icon"><i class="mdi 
mdi-cash-register" /></span><Message id="Orders" /></p>
 
-      <div class="card-header-icon" aria-label="more options">
-
-      </div>
+      <div class="card-header-icon" aria-label="more options" />
+      
       <div class="card-header-icon" aria-label="more options">
         <button class="button is-info" type="button" onClick={onCreate}>
           <span class="icon is-small" ><i class="mdi mdi-plus mdi-36px" 
/></span>
diff --git a/packages/frontend/src/paths/instance/orders/list/index.tsx 
b/packages/frontend/src/paths/instance/orders/list/index.tsx
index 3e488ab..b5a8770 100644
--- a/packages/frontend/src/paths/instance/orders/list/index.tsx
+++ b/packages/frontend/src/paths/instance/orders/list/index.tsx
@@ -1,13 +1,32 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 import { useState } from 'preact/hooks';
 import { useConfigContext } from '../../../../context/backend';
 import { MerchantBackend } from '../../../../declaration';
 import { InstanceOrderFilter, SwrError, useInstanceOrders, useOrderMutateAPI, 
useProductMutateAPI } from '../../../../hooks/backend';
 import { CardTable } from './Table';
-import { FormProvider, FormErrors } from "../../../../components/form/Field"
-import { InputBoolean } from "../../../../components/form/InputBoolean";
-import { InputArray } from '../../../../components/form/InputArray';
-import { format, parse } from 'date-fns';
+import { format } from 'date-fns';
+import { DatePicker } from '../../../../components/form/DatePicker';
 
 interface Props {
   onUnauthorized: () => VNode;
@@ -16,18 +35,13 @@ interface Props {
   onCreate: () => void;
 }
 
-// const fromBooleanToYesAndNo = {
-//   fromBoolean: (b?: boolean) => b === true ? 'yes' : (b === false ? 'no' : 
undefined),
-//   toBoolean: (b: string) => b === 'yes' ? true : (b === 'no' ? false : 
undefined)
-// }
 
 export default function ({ onUnauthorized, onLoadError, onCreate, onNotFound 
}: Props): VNode {
-  // const [filter, setFilter] = useState<InstanceOrderFilter>({paid:'yes'})
-  const date = parse('22/03/2021 11:13:25','dd/MM/yyyyy HH:mm:ss', new Date())
-  const [filter, setFilter] = useState<InstanceOrderFilter>({})
-
+  const [filter, setFilter] = useState<InstanceOrderFilter>({paid:'yes'})
+  const [pickDate, setPickDate] = useState(false)
 
-  const result = useInstanceOrders(filter)
+  const setNewDate = (date:Date) => setFilter(prev => ({...prev,date}))
+  const result = useInstanceOrders(filter, setNewDate)
   const { createOrder, deleteOrder } = useOrderMutateAPI()
   const { currency } = useConfigContext()
 
@@ -46,23 +60,49 @@ export default function ({ onUnauthorized, onLoadError, 
onCreate, onNotFound }:
     filter: []
   }
 
-  const VALUE_REGEX = /d/
-
-  const fields = ['wired','refunded','paid']
-
   const isPaidActive = filter.paid === 'yes' ? "is-active" : ''
   const isRefundedActive = filter.refunded === 'yes' ? "is-active" : ''
   const isNotWiredActive = filter.wired === 'no' ? "is-active" : ''
   const isAllActive = filter.paid === undefined && filter.refunded === 
undefined && filter.wired === undefined ? 'is-active' : ''
 
   return <section class="section is-main-section">
-    <div class="tabs">
-      <ul>
-        <li class={isPaidActive}><a onClick={() => setFilter({paid: 
'yes'})}>Paid</a></li>
-        <li class={isRefundedActive}><a onClick={() => setFilter({refunded: 
'yes'})}>Refunded</a></li>
-        <li class={isNotWiredActive}><a onClick={() => setFilter({wired: 
'no'})}>Not wired</a></li>
-        <li class={isAllActive}><a onClick={() => setFilter({})}>All</a></li>
-      </ul>
+
+    <DatePicker
+      opened={pickDate}
+      closeFunction={() => setPickDate(false)}
+      dateReceiver={setNewDate}
+    />
+
+    <div class="columns">
+      <div class="column">
+        <div class="tabs">
+          <ul>
+            <li class={isPaidActive}><a onClick={() => setFilter({ paid: 'yes' 
})}>Paid</a></li>
+            <li class={isRefundedActive}><a onClick={() => setFilter({ 
refunded: 'yes' })}>Refunded</a></li>
+            <li class={isNotWiredActive}><a onClick={() => setFilter({ wired: 
'no' })}>Not wired</a></li>
+            <li class={isAllActive}><a onClick={() => 
setFilter({})}>All</a></li>
+          </ul>
+        </div>
+      </div>
+      <div class="column ">
+        <div class="buttons is-right">
+          <div class="field has-addons">
+            { filter.date && <div class="control">
+              <a class="button" onClick={() => { setFilter(prev => ({ ...prev, 
date:undefined }) ) }}>
+                <span class="icon"><i class="mdi mdi-close" /></span>
+              </a>
+            </div> }
+            <div class="control">
+              <input class="input" type="text" readonly value={!filter.date ? 
'' : format(filter.date, 'yyyy/MM/dd')} placeholder="pick a date" />
+            </div>
+            <div class="control">
+              <a class="button" onClick={() => { setPickDate(true) }}>
+                <span class="icon"><i class="mdi mdi-calendar" /></span>
+              </a>
+            </div>
+          </div>
+        </div>
+      </div>
     </div>
 
     <CardTable instances={instances}
diff --git a/packages/frontend/src/paths/instance/orders/update/index.tsx 
b/packages/frontend/src/paths/instance/orders/update/index.tsx
index a1f58d3..c1b69e3 100644
--- a/packages/frontend/src/paths/instance/orders/update/index.tsx
+++ b/packages/frontend/src/paths/instance/orders/update/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 
 export default function ():VNode {
diff --git a/packages/frontend/src/paths/instance/products/create/index.tsx 
b/packages/frontend/src/paths/instance/products/create/index.tsx
index cb2a82c..382b58a 100644
--- a/packages/frontend/src/paths/instance/products/create/index.tsx
+++ b/packages/frontend/src/paths/instance/products/create/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 
 export default function ():VNode {
diff --git a/packages/frontend/src/paths/instance/products/list/index.tsx 
b/packages/frontend/src/paths/instance/products/list/index.tsx
index df6a973..3772be3 100644
--- a/packages/frontend/src/paths/instance/products/list/index.tsx
+++ b/packages/frontend/src/paths/instance/products/list/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 import { create } from 'yup/lib/Reference';
 import { SwrError, useInstanceProducts, useProductMutateAPI } from 
'../../../../hooks/backend';
diff --git a/packages/frontend/src/paths/instance/products/update/index.tsx 
b/packages/frontend/src/paths/instance/products/update/index.tsx
index f91bf13..dbd9b1c 100644
--- a/packages/frontend/src/paths/instance/products/update/index.tsx
+++ b/packages/frontend/src/paths/instance/products/update/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 
 export default function ():VNode {
diff --git a/packages/frontend/src/paths/instance/tips/create/index.tsx 
b/packages/frontend/src/paths/instance/tips/create/index.tsx
index 39608c3..b5e645b 100644
--- a/packages/frontend/src/paths/instance/tips/create/index.tsx
+++ b/packages/frontend/src/paths/instance/tips/create/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 
 export default function ():VNode {
diff --git a/packages/frontend/src/paths/instance/tips/list/index.tsx 
b/packages/frontend/src/paths/instance/tips/list/index.tsx
index c8a2dc7..b4a11e1 100644
--- a/packages/frontend/src/paths/instance/tips/list/index.tsx
+++ b/packages/frontend/src/paths/instance/tips/list/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 import { Loading } from '../../../../components/exception/loading';
 import { useConfigContext } from '../../../../context/backend';
diff --git a/packages/frontend/src/paths/instance/tips/update/index.tsx 
b/packages/frontend/src/paths/instance/tips/update/index.tsx
index dc4f045..986ff85 100644
--- a/packages/frontend/src/paths/instance/tips/update/index.tsx
+++ b/packages/frontend/src/paths/instance/tips/update/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 
 export default function ():VNode {
diff --git a/packages/frontend/src/paths/instance/transfers/create/index.tsx 
b/packages/frontend/src/paths/instance/transfers/create/index.tsx
index 797ac19..11c1084 100644
--- a/packages/frontend/src/paths/instance/transfers/create/index.tsx
+++ b/packages/frontend/src/paths/instance/transfers/create/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 
 export default function ():VNode {
diff --git a/packages/frontend/src/paths/instance/transfers/list/index.tsx 
b/packages/frontend/src/paths/instance/transfers/list/index.tsx
index bc0ffca..b7f1b45 100644
--- a/packages/frontend/src/paths/instance/transfers/list/index.tsx
+++ b/packages/frontend/src/paths/instance/transfers/list/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 import { Loading } from '../../../../components/exception/loading';
 import { useConfigContext } from '../../../../context/backend';
diff --git a/packages/frontend/src/paths/instance/transfers/update/index.tsx 
b/packages/frontend/src/paths/instance/transfers/update/index.tsx
index a1f58d3..c1b69e3 100644
--- a/packages/frontend/src/paths/instance/transfers/update/index.tsx
+++ b/packages/frontend/src/paths/instance/transfers/update/index.tsx
@@ -1,3 +1,24 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 import { h, VNode } from 'preact';
 
 export default function ():VNode {
diff --git a/packages/frontend/src/scss/_custom-calendar.scss 
b/packages/frontend/src/scss/_custom-calendar.scss
new file mode 100644
index 0000000..10dbb76
--- /dev/null
+++ b/packages/frontend/src/scss/_custom-calendar.scss
@@ -0,0 +1,244 @@
+:root {
+  --primary-color: #673ab7;
+  --primary-color-light: #9a67ea;
+  --primary-color-dark: #320b86;
+  
+  --secondary-color: #ffc400;
+  --secondary-color-light: #fff64f;
+  --secondary-color-dark: #c79400;
+  
+  --primary-text-color-dark: rgba(0,0,0,.87);
+  --secondary-text-color-dark: rgba(0,0,0,.57);
+  --disabled-text-color-dark: rgba(0,0,0,.13);
+  
+  --primary-text-color-light: rgba(255,255,255,.87);
+  --secondary-text-color-light: rgba(255,255,255,.57);
+  --disabled-text-color-light: rgba(255,255,255,.13);
+  
+  --font-stack: 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+  
+  --primary-card-color: #fff;
+  --primary-background-color: #f2f2f2;
+  
+  --box-shadow-lvl-1: 0 1px 3px rgba(0, 0, 0, 0.12),
+                      0 1px 2px rgba(0, 0, 0, 0.24);
+  --box-shadow-lvl-2: 0 3px 6px rgba(0, 0, 0, 0.16),
+                      0 3px 6px rgba(0, 0, 0, 0.23);
+  --box-shadow-lvl-3: 0 10px 20px rgba(0, 0, 0, 0.19),
+                      0 6px 6px rgba(0, 0, 0, 0.23);
+  --box-shadow-lvl-4: 0 14px 28px rgba(0, 0, 0, 0.25),
+                      0 10px 10px rgba(0, 0, 0, 0.22);
+}
+
+
+.datePicker {
+  text-align: left;
+  background: var(--primary-card-color);
+  border-radius: 3px;
+  z-index: 200;
+  position: fixed;
+  height: auto;
+  max-height: 90vh;
+  width: 90vw;
+  max-width: 448px;
+  transform-origin: top left;
+  transition: transform .22s ease-in-out, opacity .22s ease-in-out;
+  top: 50%;
+  left: 50%;
+  opacity: 0;
+  transform: scale(0) translate(-50%, -50%);
+  user-select: none;
+
+  &.datePicker--opened {
+    opacity: 1;
+    transform: scale(1) translate(-50%, -50%);
+  }
+  
+  .datePicker--titles {
+    border-top-left-radius: 3px;
+    border-top-right-radius: 3px;
+    padding: 24px;
+    height: 100px;
+    background: var(--primary-color);
+
+    h2, h3 {
+      cursor: pointer;
+      color: #fff;
+      line-height: 1;
+      padding: 0;
+      margin: 0;
+      font-size: 32px;
+    }
+
+    h3 {
+      color: rgba(255,255,255,.57);
+      font-size: 18px;
+      padding-bottom: 2px;
+    }
+  }
+
+  nav {
+    padding: 20px;
+    height: 56px;
+
+    h4 {
+      width: calc(100% - 60px);
+      text-align: center;
+      display: inline-block;
+      padding: 0;
+      font-size: 14px;
+      line-height: 24px;
+      margin: 0;
+      position: relative;
+      top: -9px;
+      color: var(--primary-text-color);
+    }
+
+    i {
+      cursor: pointer;
+      color: var(--secondary-text-color);
+      font-size: 26px;
+      user-select: none;
+      border-radius: 50%;
+      
+      &:hover {
+        background: var(--disabled-text-color-dark);
+      }
+    }
+  }
+  
+  .datePicker--scroll {
+    overflow-y: auto;
+    max-height: calc(90vh - 56px - 100px);
+  }
+
+  .datePicker--calendar {
+    padding: 0 20px;
+
+    .datePicker--dayNames {
+      width: 100%;
+      display: grid;
+      text-align: center;
+      
+      // there's probably a better way to do this, but wanted to try out CSS 
grid
+      grid-template-columns: calc(100% / 7) calc(100% / 7) calc(100% / 7) 
calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(100% / 7);
+
+      span {
+        color: var(--secondary-text-color-dark);
+        font-size: 14px;
+        line-height: 42px;
+        display: inline-grid;
+      }
+    }
+
+    .datePicker--days {
+      width: 100%;
+      display: grid;
+      text-align: center;
+      grid-template-columns: calc(100% / 7) calc(100% / 7) calc(100% / 7) 
calc(100% / 7) calc(100% / 7) calc(100% / 7) calc(100% / 7);
+
+      span {
+        color: var(--primary-text-color-dark);
+        line-height: 42px;
+        font-size: 14px;
+        display: inline-grid;
+        transition: color .22s;
+        height: 42px;
+        position: relative;
+        cursor: pointer;
+        user-select: none;
+        border-radius: 50%;
+
+        &::before {
+          content: '';
+          position: absolute;
+          z-index: -1;
+          height: 42px;
+          width: 42px;
+          left: calc(50% - 21px);
+          background: var(--primary-color);
+          border-radius: 50%;
+          transition: transform .22s, opacity .22s;
+          transform: scale(0);
+          opacity: 0;
+        }
+        
+        &[disabled=true] {
+          cursor: unset;
+        }
+
+        &.datePicker--today {
+          font-weight: 700;
+        }
+
+        &.datePicker--selected {
+          color: rgba(255,255,255,.87);
+
+          &:before {
+            transform: scale(1);
+            opacity: 1;
+          }
+        }
+      }
+    }
+  }
+  
+  .datePicker--selectYear {
+    padding: 0 20px;
+    display: block;
+    width: 100%;
+    text-align: center;
+    max-height: 362px;
+    
+    span {
+      display: block;
+      width: 100%;
+      font-size: 24px;
+      margin: 20px auto;
+      cursor: pointer;
+      
+      &.selected {
+        font-size: 42px;
+        color: var(--primary-color);
+      }
+    }
+  }
+
+  div.datePicker--actions {
+    width: 100%;
+    padding: 8px;
+    text-align: right;
+
+    button {
+      margin-bottom: 0;
+      font-size: 15px;
+      cursor: pointer;
+      color: var(--primary-text-color);
+      border: none;
+      margin-left: 8px;
+      min-width: 64px;
+      line-height: 36px;
+      background-color: transparent;
+      appearance: none;
+      padding: 0 16px;
+      border-radius: 3px;
+      transition: background-color .13s;
+
+      &:hover, &:focus {
+        outline: none;
+        background-color: var(--disabled-text-color-dark);
+      }
+    }
+  }
+}
+
+.datePicker--background {
+  z-index: 199;
+  position: fixed;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  background: rgba(0,0,0,.52);
+  animation: fadeIn .22s forwards;
+}
diff --git a/packages/frontend/src/scss/_loading.scss 
b/packages/frontend/src/scss/_loading.scss
new file mode 100644
index 0000000..abd6c78
--- /dev/null
+++ b/packages/frontend/src/scss/_loading.scss
@@ -0,0 +1,35 @@
+.lds-ring {
+  display: inline-block;
+  position: relative;
+  width: 80px;
+  height: 80px;
+}
+.lds-ring div {
+  box-sizing: border-box;
+  display: block;
+  position: absolute;
+  width: 64px;
+  height: 64px;
+  margin: 8px;
+  border: 8px solid black;
+  border-radius: 50%;
+  animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
+  border-color: black transparent transparent transparent;
+}
+.lds-ring div:nth-child(1) {
+  animation-delay: -0.45s;
+}
+.lds-ring div:nth-child(2) {
+  animation-delay: -0.3s;
+}
+.lds-ring div:nth-child(3) {
+  animation-delay: -0.15s;
+}
+@keyframes lds-ring {
+  0% {
+    transform: rotate(0deg);
+  }
+  100% {
+    transform: rotate(360deg);
+  }
+}
diff --git a/packages/frontend/src/scss/main.scss 
b/packages/frontend/src/scss/main.scss
index fe99db8..ac57135 100644
--- a/packages/frontend/src/scss/main.scss
+++ b/packages/frontend/src/scss/main.scss
@@ -41,6 +41,8 @@
 @import "modal";
 @import "footer";
 @import "misc";
+@import "custom-calendar";
+@import "loading";
 
 @import "fonts/nunito.css";
 @import "icons/materialdesignicons-4.9.95.min.css";
@@ -108,42 +110,6 @@ tr:hover .right-sticky {
   background-color: hsl(0, 0%, 95%);
 }
 
-.lds-ring {
-  display: inline-block;
-  position: relative;
-  width: 80px;
-  height: 80px;
-}
-.lds-ring div {
-  box-sizing: border-box;
-  display: block;
-  position: absolute;
-  width: 64px;
-  height: 64px;
-  margin: 8px;
-  border: 8px solid black;
-  border-radius: 50%;
-  animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
-  border-color: black transparent transparent transparent;
-}
-.lds-ring div:nth-child(1) {
-  animation-delay: -0.45s;
-}
-.lds-ring div:nth-child(2) {
-  animation-delay: -0.3s;
-}
-.lds-ring div:nth-child(3) {
-  animation-delay: -0.15s;
-}
-@keyframes lds-ring {
-  0% {
-    transform: rotate(0deg);
-  }
-  100% {
-    transform: rotate(360deg);
-  }
-}
-
 .content-full-size {
   height: calc(100% - 3rem);
   position: absolute;
diff --git a/packages/frontend/src/utils/constants.ts 
b/packages/frontend/src/utils/constants.ts
index 42ea934..148275b 100644
--- a/packages/frontend/src/utils/constants.ts
+++ b/packages/frontend/src/utils/constants.ts
@@ -26,5 +26,8 @@ export const 
AMOUNT_REGEX=/^[a-zA-Z][a-zA-Z]*:[0-9][0-9,]*\.?[0-9,]*$/
 
 export const INSTANCE_ID_LOOKUP = /^\/instances\/([^/]*)\/?$/
 
-export const PAGE_SIZE = 3
-export const MAX_RESULT_SIZE = 4;
\ No newline at end of file
+// how much rows we add every time user hit load more
+export const PAGE_SIZE = 10
+// how bigger can be the result set
+// after this threshold, load more with move the cursor
+export const MAX_RESULT_SIZE = 19;
\ No newline at end of file
diff --git a/packages/frontend/src/utils/table.ts 
b/packages/frontend/src/utils/table.ts
index d9e3d53..87ab600 100644
--- a/packages/frontend/src/utils/table.ts
+++ b/packages/frontend/src/utils/table.ts
@@ -1,4 +1,23 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
 
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
 
 export interface Actions<T extends WithId> {
   element: T;

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]