Commit 76f28be1 authored by Filip Šenk's avatar Filip Šenk
Browse files

Merge branch '1067-initial-setup' into 'main'

Add inject patter import/export for milestones, questionnaires and injects

Closes #1067

See merge request inject/frontend!911
parents dccb465d 3971cf97
Loading
Loading
Loading
Loading
+15 −11
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ const buttonWrapper = css`
  gap: 0.5rem;
`

type AssignPatternsProps = {
type ExportInjectPatternsProps = {
  onClick: () => void
  selected: boolean
  injectPattern: InjectPattern
@@ -36,7 +36,7 @@ type AssignPatternsProps = {
  setSelectedNodes: Dispatch<SetStateAction<TreeNode[]>>
}

export const AssignPatterns: FC<AssignPatternsProps> = ({
export const ExportInjectPatterns: FC<ExportInjectPatternsProps> = ({
  onClick,
  selected,
  injectPattern,
@@ -62,9 +62,13 @@ export const AssignPatterns: FC<AssignPatternsProps> = ({
      const children = getSelectedRec(injectPattern.begin, injectPattern.end.id)

      if (children.length <= 1) {
        notify('Wrongly selected begin and end', JSON.stringify(''), {
        notify(
          'Wrongly selected begin and end. No injects or questionnaires were found between these 2 milestones.',
          JSON.stringify(''),
          {
            intent: 'warning',
        })
          }
        )
      } else {
        setSelectedNodes(children)
      }
@@ -90,7 +94,7 @@ export const AssignPatterns: FC<AssignPatternsProps> = ({
                  text={
                    injectPattern.begin
                      ? getNodeName(injectPattern.begin)
                      : 'Select a begin'
                      : 'Select the start milestone'
                  }
                  fill
                  active={injectPattern.beginSelect}
@@ -103,7 +107,7 @@ export const AssignPatterns: FC<AssignPatternsProps> = ({
                  text={
                    injectPattern.end
                      ? getNodeName(injectPattern.end)
                      : 'Select a end'
                      : 'Select the end milestone'
                  }
                  active={!injectPattern.beginSelect}
                  intent={!injectPattern.beginSelect ? 'success' : 'none'}
@@ -115,13 +119,13 @@ export const AssignPatterns: FC<AssignPatternsProps> = ({

                <div className={buttonWrapper}>
                  <Button
                    fill
                    intent={'primary'}
                    disabled={!injectPattern.begin || !injectPattern.end}
                    onClick={handleDownload}
                    icon='download'
                    alignText='left'
                  >
                    Export Inject Pattern
                    Export
                  </Button>
                </div>
              </div>
@@ -133,7 +137,7 @@ export const AssignPatterns: FC<AssignPatternsProps> = ({
        <Button
          title='Download Inject Pattern'
          active={opened}
          icon='download'
          icon='git-new-branch'
          alignText='left'
          fill
          minimal={!selected}
@@ -141,7 +145,7 @@ export const AssignPatterns: FC<AssignPatternsProps> = ({
            setOpened(prev => !prev)
          }}
        >
          Inject Pattern
          Export Inject Pattern
        </Button>
      </Popover>
    </div>
+2 −2
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@ import type {
  TreeMode,
} from '../../routes/create/tree-view'
import GroupedSelect from '../Select/GroupedSelect'
import { AssignPatterns } from './InjectPatterns/AssignPatterns'
import { ExportInjectPatterns } from './InjectPatterns/ExportInjectPatterns'
import { AssignLearningActivity } from './Objectives/AssignLearningActivity'
import { Settings } from './Settings'
import { ZOOM_STORAGE_KEY } from './utils'
@@ -118,7 +118,7 @@ export const SettingsNavbar: FC<SettingsNavbarProps> = ({
            selected={mode === 'objectives'}
            onUpdate={() => setSelectedNodes([])}
          />
          <AssignPatterns
          <ExportInjectPatterns
            injectPattern={injectPattern}
            onClick={() => setMode('pattern')}
            selected={mode === 'pattern'}
+9 −5
Original line number Diff line number Diff line
@@ -458,6 +458,7 @@ export const loadInjectPattern = async (zip: JSZip, parentNode?: TreeNode) => {
    }
    if (tableName === 'questionnaires') {
      questionnaires = records.map(normalizeQuestionnaire)

      continue
    }
    if (tableName === 'milestones') {
@@ -556,6 +557,7 @@ export const loadInjectPattern = async (zip: JSZip, parentNode?: TreeNode) => {
  const questionnaireNamesSet = new Set(
    (await db.questionnaires.toArray()).map(questionnaire => questionnaire.name)
  )

  const changedQuestionnaires = questionnaires.map(questionnaire => {
    let name = questionnaire.name
    let index = 0
@@ -613,7 +615,7 @@ export const loadInjectPattern = async (zip: JSZip, parentNode?: TreeNode) => {
      }
    })

    return { ...questionnaire, control, questions, repeatable }
    return { ...questionnaire, name, control, questions, repeatable }
  })

  const milestonesWithoutStarting = changedMilestones.map(
@@ -673,14 +675,16 @@ export const exportInjectPattern = async (
    .filter(node => node.type === TreeNodeTypes.QUESTIONNAIRE)
    .map(node => node.data)

  const fileSet = new Set(
  const fileSet = new Set([
    ...injects
      .map(inject => inject.alternatives[0].content?.attachments)
      .filter(notEmpty),
      .filter(notEmpty)
      .flat(),
    ...questionnaires
      .map(questionnaire => questionnaire.content?.attachments)
      .filter(notEmpty)
  )
      .flat(),
  ])

  const files = await db.files.filter(file => fileSet.has(file.name)).toArray()
  const fileMapping: Array<{ name: string; content: string | Blob }> = []
@@ -706,7 +710,7 @@ export const exportInjectPattern = async (
    })

    fileMapping.push({
      name: `${TABLE_TO_FILE.questionnaire}.yml`,
      name: `${TABLE_TO_FILE.questionnaires}.yml`,
      content: yamlContent,
    })
  }