| @@ -1,8 +1,42 @@ | |||
| %card { | |||
| background-color: white; | |||
| border: 1px solid #ebebeb; | |||
| border: 1px solid var(--card-outline); | |||
| overflow: hidden; | |||
| border-radius: 20px; | |||
| display: flex; | |||
| margin: 20px auto; | |||
| } | |||
| %commonIonInput { | |||
| font-size: 14px; | |||
| color: var(--black); | |||
| --padding-top: 5px; | |||
| --padding-end: 0; | |||
| --padding-bottom: 5px; | |||
| --padding-start: 0px; | |||
| } | |||
| %formSubmitIonButton { | |||
| width: calc(50% - 10px); | |||
| display: block; | |||
| margin: 0 auto; | |||
| height: 40px; | |||
| font-size: 13px; | |||
| letter-spacing: 0.5px; | |||
| &.cancel { | |||
| --border-width: 1px; | |||
| --border-color: var(--black); | |||
| color: var(--black); | |||
| } | |||
| &.approve { | |||
| --background: var(--teal); | |||
| } | |||
| &.disabled { | |||
| pointer-events: none; | |||
| filter: grayscale(100%); | |||
| } | |||
| } | |||
| @@ -98,25 +98,38 @@ | |||
| left: 0; | |||
| top: 0; | |||
| z-index: 2; | |||
| background-color: rgba(0, 0, 0, 0.6); | |||
| background-color: rgba(0, 0, 0, 0); | |||
| width: 100%; | |||
| height: 100vh; | |||
| display: flex; | |||
| align-items: flex-end; | |||
| justify-content: stretch; | |||
| overflow: auto; | |||
| transform: translateY(50vh); | |||
| animation: popFromBottom 0.3s forwards; | |||
| @keyframes popFromBottom { | |||
| 0% { | |||
| transform: translateY(50vh); | |||
| } 50% { | |||
| transform: translateY(0vh); | |||
| background-color: rgba(0, 0, 0, 0); | |||
| } 100% { | |||
| background-color: rgba(0, 0, 0, 0.6); | |||
| transform: translateY(0vh); | |||
| } | |||
| } | |||
| .cardDetails { | |||
| border-top-right-radius: 30px; | |||
| border-top-left-radius: 30px; | |||
| background-color: white; | |||
| padding: 15px; | |||
| width: 100%; | |||
| } | |||
| header { | |||
| position: relative; | |||
| margin-bottom: 30px; | |||
| padding: 15px; | |||
| ion-button { | |||
| width: 30px; | |||
| @@ -139,6 +152,9 @@ | |||
| } | |||
| ul { | |||
| padding: 15px; | |||
| border-bottom: 1px solid var(--card-outline); | |||
| li { | |||
| display: flex; | |||
| align-items: center; | |||
| @@ -162,4 +178,34 @@ | |||
| } | |||
| } | |||
| } | |||
| } | |||
| .form { | |||
| padding: 0 15px; | |||
| .inputHolder { | |||
| display: block; | |||
| margin: 15px 0; | |||
| label { | |||
| text-align: left; | |||
| font-size: 11px; | |||
| color: var(--grey); | |||
| font-weight: 500; | |||
| letter-spacing: 0.5px; | |||
| } | |||
| ion-input { | |||
| @extend %commonIonInput; | |||
| } | |||
| } | |||
| .buttonsHolder { | |||
| margin: 15px 0; | |||
| display: flex; | |||
| ion-button { | |||
| @extend %formSubmitIonButton; | |||
| } | |||
| } | |||
| } | |||
| @@ -27,6 +27,13 @@ type OwnProps = { | |||
| export const InvoiceCard: React.FC<OwnProps> = (props) => { | |||
| const [showDetails, setShowDetails] = useState<boolean>(false); | |||
| const [formInputs, setFormInputs] = useState<{ | |||
| dateOfPayment: string, | |||
| referenceNumber: string, | |||
| }>({ | |||
| dateOfPayment: props.invoice.dateOfPayment ? props.invoice.dateOfPayment.toString() : '', | |||
| referenceNumber: props.invoice.referenceNumber ? props.invoice.referenceNumber : '', | |||
| }); | |||
| let statusClass = ''; | |||
| @@ -94,17 +101,26 @@ export const InvoiceCard: React.FC<OwnProps> = (props) => { | |||
| <section className={styles.form}> | |||
| <div className={styles.inputHolder}> | |||
| <label> Payment Date </label> | |||
| <IonDatetime value={props.invoice.dateOfPayment?.toString()} mode={'ios'} placeholder={'DD/MM/YYYY'} displayFormat={'DD/MM/YYYY'}></IonDatetime> | |||
| <IonDatetime value={formInputs.dateOfPayment} mode={'ios'} placeholder={'DD/MM/YYYY'} displayFormat={'DD/MM/YYYY'} | |||
| onIonChange={(e) => setFormInputs({ | |||
| dateOfPayment: e.detail.value? e.detail.value.toString() : '', | |||
| referenceNumber: formInputs.referenceNumber, | |||
| })}></IonDatetime> | |||
| </div> | |||
| <div className={styles.inputHolder}> | |||
| <label> Reference No. </label> | |||
| <IonInput placeholder={'Enter here'} value={props.invoice.referenceNumber? props.invoice.referenceNumber: ''}></IonInput> | |||
| <IonInput placeholder={'Enter here'} value={formInputs.referenceNumber} | |||
| onIonChange={(e) => setFormInputs({ | |||
| dateOfPayment: formInputs.dateOfPayment, | |||
| referenceNumber: e.detail.value? e.detail.value.toString() : '', | |||
| })}></IonInput> | |||
| </div> | |||
| {props.invoice.status !== 'cancelled' && props.invoice.status !== 'paid' && <div className={styles.buttonsHolder}> | |||
| <IonButton fill={'outline'} shape={'round'}> Cancel Invoice </IonButton> | |||
| <IonButton fill={'solid'} shape={'round'}> Paid </IonButton> | |||
| <IonButton fill={'outline'} className={styles.cancel} shape={'round'}> Cancel Invoice </IonButton> | |||
| <IonButton fill={'solid'} className={styles.approve + ' ' + (formInputs.dateOfPayment && formInputs.referenceNumber ? '' : styles.disabled)} shape={'round'} | |||
| onClick={() => setShowDetails(false)}> Paid </IonButton> | |||
| </div>} | |||
| </section> | |||
| </section> | |||
| @@ -86,7 +86,7 @@ http://ionicframework.com/docs/theming/ */ | |||
| --light-grey: #bcbcbc; | |||
| --lighter-grey: #fafafa; | |||
| --warning: #ce7f01; | |||
| --card-outline: #ebebeb; | |||
| @@ -124,7 +124,16 @@ ion-button { | |||
| --padding-start: 0px; | |||
| --padding-end: 0px; | |||
| --padding-top: 0px; | |||
| --padding-right: 0px; | |||
| --padding-bottom: 0px; | |||
| margin: 0px; | |||
| margin-inline: 0px; | |||
| text-transform: none; | |||
| font-size: 12px; | |||
| --box-shadow: none; | |||
| } | |||
| ion-datetime { | |||
| padding: 5px 0px; | |||
| font-size: 14px; | |||
| color: var(--black); | |||
| } | |||