Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Smart Capture Form fields preference added #252

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/forty-dingos-move.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'mexit': patch
'mexit-webapp': patch
---

Smart Capture Preference
85 changes: 76 additions & 9 deletions apps/extension/src/Components/Form/index.tsx
Original file line number Diff line number Diff line change
@@ -1,27 +1,36 @@
import React, { useEffect, useRef, useState } from 'react'

import { SubmitHandler, useForm } from 'react-hook-form'
import { useTheme } from 'styled-components'

import { MexIcon } from '@workduck-io/mex-components'
import { tinykeys } from '@workduck-io/tinykeys'

import { mog, NodeEditorContent } from '@mexit/core'
import { FlexBetween } from '@mexit/shared'

import { useSaveChanges } from '../../Hooks/useSaveChanges'
import { useSputlitStore } from '../../Stores/useSputlitStore'
import { useUserPreferenceStore } from '../../Stores/userPreferenceStore'
import { FormBuilder } from '../../Types/Form'
import { formToBlocks } from '../../Utils/getProfileData'
import { Title } from '../Action/styled'
import { Dialog } from '../Floating/Dialog'
import NoteSelector from '../Floating/NoteSelector'
import { Controls } from '../Screenshot/Screenshot.style'
import Field from './Field'
import { StyledForm, StyledRowItem } from './styled'
import { ExcludeFormFieldsContainer, StyledForm, StyledRowItem, UserPreferedFieldsContainer } from './styled'

interface FormProps {
config: FormBuilder
page: string
}

const Form: React.FC<FormProps> = ({ config }) => {
const Form: React.FC<FormProps> = ({ page, config }) => {
const { register, handleSubmit } = useForm()
const [data, setData] = useState<any>()
const exludedFields = useUserPreferenceStore((s) => s.smartCaptureExcludedFields?.[page])

const [isSaving, setIsSaving] = useState(false)
const noteSelectorRef = useRef()
const savingNoteRef = useRef()
Expand All @@ -45,11 +54,13 @@ const Form: React.FC<FormProps> = ({ config }) => {
}

const onNodeSelect = async (nodeId: string) => {
const formData = config.map((item) => ({ ...item, value: data?.[item.label] }))
const formData = config
.filter((i) => !exludedFields?.find((f) => f == i.id))
.map((item) => ({ ...item, value: data?.[item.label] }))

const convertToTable = useSputlitStore.getState().smartCaptureSaveType === 'tabular'

const blocks = formToBlocks(formData, convertToTable) as NodeEditorContent
// mog('Block are ready to save', { blocks })

try {
if (blocks) {
Expand Down Expand Up @@ -83,16 +94,72 @@ const Form: React.FC<FormProps> = ({ config }) => {
<div style={{ zIndex: 30 }} id="smart-capture-saving" ref={savingNoteRef} />
<div style={{ zIndex: 20 }} id="smart-capture" ref={noteSelectorRef} />
<StyledForm id="wd-mex-smart-capture-form" onSubmit={handleSubmit(onSubmit)}>
{config.map((item) => {
<UserPreferedFields
page={page}
fields={config.filter((i) => !exludedFields?.find((f) => f == i.id))}
register={register}
/>
<ExludedFormFields
page={page}
fields={config.filter((i) => exludedFields?.find((f) => f === i.id))}
register={register}
/>
</StyledForm>
</>
)
}

const ExludedFormFields = ({ page, register, fields }) => {
const removeFromExcludedFields = useUserPreferenceStore((s) => s.removeExcludedSmartCaptureField)
const theme = useTheme()

const onRemoveField = (id: string) => {
removeFromExcludedFields(page, id)
}

if (fields?.length > 0)
return (
<ExcludeFormFieldsContainer>
<Controls>
<MexIcon icon="ph:textbox-fill" height={20} width={20} color={theme.colors.primary} />
<Title>Additional Fields</Title>
</Controls>
{fields.map((field) => {
return (
<StyledRowItem>
<label>{item.label}</label>
<Field item={item} register={register} />
<FlexBetween>
<label>{field.label}</label>
<MexIcon icon="akar-icons:plus" onClick={() => onRemoveField(field.id)} />
</FlexBetween>
<Field item={field} register={register} />
</StyledRowItem>
)
})}
</StyledForm>
</>
</ExcludeFormFieldsContainer>
)
}

const UserPreferedFields = ({ page, fields, register }) => {
const excludeFieldFromForm = useUserPreferenceStore((s) => s.excludeSmartCaptureField)

const onAddField = (id: string) => {
excludeFieldFromForm(page, id)
}

return (
<UserPreferedFieldsContainer>
{fields.map((field) => {
return (
<StyledRowItem>
<FlexBetween>
<label>{field.label}</label>
<MexIcon icon="clarity:window-close-line" onClick={() => onAddField(field.id)} />
</FlexBetween>
<Field item={field} register={register} />
</StyledRowItem>
)
})}
</UserPreferedFieldsContainer>
)
}

Expand Down
14 changes: 14 additions & 0 deletions apps/extension/src/Components/Form/styled.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import styled from 'styled-components'

import { TextAreaBlock } from '@mexit/shared'

import { Controls } from '../Screenshot/Screenshot.style'

export const StyledForm = styled.form`
display: flex;
flex-direction: column;
Expand All @@ -21,3 +23,15 @@ export const StyledRowItem = styled.div`
export const StyledTextAreaBlock = styled(TextAreaBlock)`
margin-top: ${({ theme }) => theme.spacing.tiny} !important;
`

export const UserPreferedFieldsContainer = styled.section`
margin-bottom: ${({ theme }) => theme.spacing.medium};
`

export const ExcludeFormFieldsContainer = styled.section`
border-top: 2px solid ${({ theme }) => theme.colors.gray[8]};

${Controls} {
margin: ${({ theme }) => theme.spacing.medium} 0;
}
`
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const SmartCapture = () => {
return (
<SmartCaptureContainer>
<SourceHeader title={`${data.page} Profile`} source={data.source} />
<Form config={data.data} />
<Form page={data.page} config={data.data} />
</SmartCaptureContainer>
)
}
Expand Down
Loading