1
0
Fork 0

feat(shared): Apply control restrictions to sets

This commit is contained in:
joostdecock 2023-04-30 18:29:56 +02:00
parent 3642242835
commit e56016ed95
11 changed files with 137 additions and 111 deletions

View file

@ -10,9 +10,9 @@ import {
connectHighlight, connectHighlight,
connectSearchBox, connectSearchBox,
} from 'react-instantsearch-dom' } from 'react-instantsearch-dom'
import { freeSewingConfig } from 'site/freesewing.config.mjs' import { siteConfig } from 'site/site.config.mjs'
const searchClient = algoliasearch(freeSewingConfig.algolia.app, freeSewingConfig.algolia.key) const searchClient = algoliasearch(siteConfig.algolia.app, siteConfig.algolia.key)
const Hits = (props) => { const Hits = (props) => {
// When we hit enter in the text field, we want to navigate to the result // When we hit enter in the text field, we want to navigate to the result
@ -206,7 +206,7 @@ export const Search = (props) => {
} }
return ( return (
<InstantSearch indexName={freeSewingConfig.algolia.index} searchClient={searchClient}> <InstantSearch indexName={siteConfig.algolia.index} searchClient={searchClient}>
<CustomSearchBox {...stateProps} /> <CustomSearchBox {...stateProps} />
</InstantSearch> </InstantSearch>
) )

View file

@ -4,7 +4,7 @@ import get from 'lodash.get'
import { prebuildNavigation as pbn } from 'site/prebuild/navigation.mjs' import { prebuildNavigation as pbn } from 'site/prebuild/navigation.mjs'
import { useTranslation } from 'next-i18next' import { useTranslation } from 'next-i18next'
import orderBy from 'lodash.orderby' import orderBy from 'lodash.orderby'
import { freeSewingConfig as conf } from 'site/freesewing.config.mjs' import { freeSewingConfig as conf } from 'shared/config/freesewing.config.mjs'
import { useAccount } from 'shared/hooks/use-account.mjs' import { useAccount } from 'shared/hooks/use-account.mjs'
/* /*

View file

@ -3,12 +3,12 @@ import { appWithTranslation } from 'next-i18next'
import React from 'react' import React from 'react'
import Bugsnag from '@bugsnag/js' import Bugsnag from '@bugsnag/js'
import BugsnagPluginReact from '@bugsnag/plugin-react' import BugsnagPluginReact from '@bugsnag/plugin-react'
import { freeSewingConfig } from 'site/freesewing.config.mjs' import { siteConfig } from 'site/site.config.mjs'
import { Toaster as DefaultToaster } from 'react-hot-toast' import { Toaster as DefaultToaster } from 'react-hot-toast'
import { ContextWrapper } from 'shared/components/wrappers/context.mjs' import { ContextWrapper } from 'shared/components/wrappers/context.mjs'
Bugsnag.start({ Bugsnag.start({
apiKey: freeSewingConfig.bugsnag.key, apiKey: siteConfig.bugsnag.key,
collectUserIp: false, collectUserIp: false,
plugins: [new BugsnagPluginReact()], plugins: [new BugsnagPluginReact()],
}) })

View file

@ -3,6 +3,7 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
// Components // Components
import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs' import { PageWrapper, ns as pageNs } from 'shared/components/wrappers/page.mjs'
import { Popout } from 'shared/components/popout.mjs' import { Popout } from 'shared/components/popout.mjs'
import { Collapse } from 'shared/components/collapse.mjs'
// Translation namespaces used on this page // Translation namespaces used on this page
const namespaces = [...new Set(pageNs)] const namespaces = [...new Set(pageNs)]
@ -17,6 +18,30 @@ const p = (
const TypographyPage = ({ page }) => ( const TypographyPage = ({ page }) => (
<PageWrapper {...page}> <PageWrapper {...page}>
<Collapse title="test" color="primary">
test
</Collapse>
<Collapse title="test" color="secondary">
test
</Collapse>
<Collapse title="test" color="accent">
test
</Collapse>
<Collapse title="test" color="neutral">
test
</Collapse>
<Collapse title="test" color="success">
test
</Collapse>
<Collapse title="test" color="info">
test
</Collapse>
<Collapse title="test" color="warning">
test
</Collapse>
<Collapse title="test" color="error">
test
</Collapse>
<div className="text-primary mdx max-w-prose text-base-content max-w-prose text-base xl:pl-4"> <div className="text-primary mdx max-w-prose text-base-content max-w-prose text-base xl:pl-4">
<p>This typography page shows an overview of different elements and how they are styled.</p> <p>This typography page shows an overview of different elements and how they are styled.</p>
<p>It&apos;s a good starting point for theme development.</p> <p>It&apos;s a good starting point for theme development.</p>

11
sites/org/site.config.mjs Normal file
View file

@ -0,0 +1,11 @@
export const siteConfig = {
algolia: {
app: 'MA0Y5A2PF0', // Application ID
index: 'canary_freesewing.dev',
key: '589c7a7e4d9c95a4f12868581259bf3a', // Search-only API key
},
bugsnag: {
key: '1b3a900d6ebbfd071975e39b534e1ff5',
},
languages: ['en', 'es', 'de', 'fr', 'nl'],
}

View file

@ -10,7 +10,7 @@ import { LoadingContext } from 'shared/context/loading-context.mjs'
// Components // Components
import { BackToAccountButton, Choice } from './shared.mjs' import { BackToAccountButton, Choice } from './shared.mjs'
// Config // Config
import { freeSewingConfig as conf } from 'site/freesewing.config.mjs' import { siteConfig as conf } from 'site/freesewing.config.mjs'
export const ns = ['account', 'locales', 'toast'] export const ns = ['account', 'locales', 'toast']

View file

@ -2,7 +2,7 @@ import { useAccount } from 'shared/hooks/use-account.mjs'
import { useTranslation } from 'next-i18next' import { useTranslation } from 'next-i18next'
import Link from 'next/link' import Link from 'next/link'
import { PageLink } from 'shared/components/page-link.mjs' import { PageLink } from 'shared/components/page-link.mjs'
import { freeSewingConfig as conf } from 'site/freesewing.config.mjs' import { freeSewingConfig as conf } from 'shared/config/freesewing.config.mjs'
export const ns = ['account'] export const ns = ['account']

View file

@ -7,6 +7,7 @@ import orderBy from 'lodash.orderby'
import { measurements, isDegreeMeasurement } from 'config/measurements.mjs' import { measurements, isDegreeMeasurement } from 'config/measurements.mjs'
import { measurementAsMm, formatMm } from 'shared/utils.mjs' import { measurementAsMm, formatMm } from 'shared/utils.mjs'
import { measurements as designMeasurements } from 'site/prebuild/design-measurements.mjs' import { measurements as designMeasurements } from 'site/prebuild/design-measurements.mjs'
import { freeSewingConfig as conf } from 'shared/config/freesewing.config.mjs'
// Hooks // Hooks
import { useDropzone } from 'react-dropzone' import { useDropzone } from 'react-dropzone'
import { useAccount } from 'shared/hooks/use-account.mjs' import { useAccount } from 'shared/hooks/use-account.mjs'
@ -641,49 +642,88 @@ const EditMeasurementsSet = (props) => {
return ( return (
<div className="p-4"> <div className="p-4">
<div className="flex flex-row gap-4 text-sm items-center justify-center"> {/* Meta info */}
<div className="flex flex-row gap-2 items-center"> {props.account.control > 2 ? (
<b>{t('permalink')}:</b> <div className="flex flex-row gap-4 text-sm items-center justify-center mb-2">
{mset.public ? ( <div className="flex flex-row gap-2 items-center">
<PageLink href={`/sets/${mset.id}`} txt={`/sets/${mset.id}`} /> <b>{t('permalink')}:</b>
) : ( {mset.public ? (
<NoIcon className="w-4 h-4 text-error" /> <PageLink href={`/sets/${mset.id}`} txt={`/sets/${mset.id}`} />
)} ) : (
<NoIcon className="w-4 h-4 text-error" />
)}
</div>
<div>
<b>{t('created')}</b>: <Timeago date={mset.createdAt} />
</div>
<div>
<b>{t('updated')}</b>: <Timeago date={mset.updatedAt} />
</div>
</div> </div>
<div> ) : null}
<b>{t('created')}</b>: <Timeago date={mset.createdAt} />
{/* JSON & YAML links */}
{props.account.control > 3 ? (
<div className="flex flex-row gap-4 text-sm items-center justify-center">
<a
className="badge badge-secondary font-bold"
href={`${conf.backend}/sets/${mset.id}.json`}
>
JSON
</a>
<a
className="badge badge-success font-bold"
href={`${conf.backend}/sets/${mset.id}.yaml`}
>
YAML
</a>
</div> </div>
<div> ) : null}
<b>{t('updated')}</b>: <Timeago date={mset.updatedAt} />
</div>
</div>
<EditSectionTitle title={t('data')} /> <EditSectionTitle title={t('data')} />
{/* Name is always shown */}
<EditRow title={t('name')} field="name" {...props}> <EditRow title={t('name')} field="name" {...props}>
{mset.name} {mset.name}
</EditRow> </EditRow>
<EditRow title={t('image')} field="img" {...props}>
<img src={mset.img} className="w-10 mask mask-squircle bg-neutral aspect-square" /> {/* img: Control level determines whether or not to show this */}
</EditRow> {props.account.control >= conf.account.sets.img ? (
<EditRow title={t('public')} field="public" {...props}> <EditRow title={t('image')} field="img" {...props}>
<div className="flex flex-row gap-2"> <img src={mset.img} className="w-10 mask mask-squircle bg-neutral aspect-square" />
{mset.public ? ( </EditRow>
<> ) : null}
<OkIcon className="h-6 w-6 text-success" /> <span>{t('publicSet')}</span>
</> {/* public: Control level determines whether or not to show this */}
) : ( {props.account.control >= conf.account.sets.public ? (
<> <EditRow title={t('public')} field="public" {...props}>
<NoIcon className="h-6 w-6 text-error" /> <span>{t('privateSet')}</span> <div className="flex flex-row gap-2">
</> {mset.public ? (
)} <>
</div> <OkIcon className="h-6 w-6 text-success" /> <span>{t('publicSet')}</span>
</EditRow> </>
<EditRow title={t('units')} field="imperial" {...props}> ) : (
{mset.imperial ? t('imperialUnits') : t('metricUnits')} <>
</EditRow> <NoIcon className="h-6 w-6 text-error" /> <span>{t('privateSet')}</span>
<EditRow title={t('notes')} field="notes" {...props}> </>
<Markdown>{mset.notes}</Markdown> )}
</EditRow> </div>
</EditRow>
) : null}
{/* units: Control level determines whether or not to show this */}
{props.account.control >= conf.account.sets.units ? (
<EditRow title={t('units')} field="imperial" {...props}>
{mset.imperial ? t('imperialUnits') : t('metricUnits')}
</EditRow>
) : null}
{/* notes: Control level determines whether or not to show this */}
{props.account.control >= conf.account.sets.notes ? (
<EditRow title={t('notes')} field="notes" {...props}>
<Markdown>{mset.notes}</Markdown>
</EditRow>
) : null}
<EditSectionTitle title={t('measies')} /> <EditSectionTitle title={t('measies')} />
<div className="flex flex-row items-center justify-center"> <div className="flex flex-row items-center justify-center">

View file

@ -1,13 +1,6 @@
export const freeSewingConfig = { export const freeSewingConfig = {
algolia: {
app: 'MA0Y5A2PF0', // Application ID
index: 'canary_freesewing.dev',
key: '589c7a7e4d9c95a4f12868581259bf3a', // Search-only API key
},
bugsnag: {
key: '1b3a900d6ebbfd071975e39b534e1ff5',
},
monorepo: 'https://github.com/freesewing/freesewing', monorepo: 'https://github.com/freesewing/freesewing',
backend: process.env.NEXT_PUBLIC_BACKEND,
maxWidth: 2800, maxWidth: 2800,
account: { account: {
fields: { fields: {
@ -36,6 +29,12 @@ export const freeSewingConfig = {
apikeys: 4, apikeys: 4,
}, },
}, },
sets: {
name: 1,
img: 2,
public: 3,
units: 2,
notes: 2,
},
}, },
languages: ['en', 'es', 'de', 'fr', 'nl'],
} }

View file

@ -1,58 +0,0 @@
/* URL to strapi for blog, showcase, and newsletter posts */
export const strapiHost = 'https://posts.freesewing.org'
/* URL to FreeSewing's monorepo on Github */
export const monorepo = 'https://github.com/freesewing/freesewing'
/* Default theme */
export const defaultTheme = 'light'
/* A list of all measurements used by FreeSewing */
export const measurements = [
'ankle',
'biceps',
'bustFront',
'bustPointToUnderbust',
'bustSpan',
'chest',
'crossSeam',
'crossSeamFront',
'crotchDepth',
'heel',
'head',
'highBust',
'highBustFront',
'hips',
'hpsToBust',
'hpsToWaistBack',
'hpsToWaistFront',
'inseam',
'knee',
'neck',
'seat',
'seatBack',
'shoulderSlope',
'shoulderToElbow',
'shoulderToShoulder',
'shoulderToWrist',
'underbust',
'upperLeg',
'waist',
'waistBack',
'waistToArmhole',
'waistToFloor',
'waistToHips',
'waistToKnee',
'waistToSeat',
'waistToUnderbust',
'waistToUpperLeg',
'wrist',
]
/* A list of measurments that are degrees (rather than mm) */
export const degreeMeasurements = ['shoulderSlope']
/* Helper method to determine whether a measurement uses degrees */
export const isDegreeMeasurement = (measie) => degreeMeasurements.indexOf(measie) !== -1

View file

@ -43,4 +43,13 @@
<div className="bg-violet-400"></div> <div className="bg-violet-400"></div>
<div className="bg-purple-400"></div> <div className="bg-purple-400"></div>
<!-- Collapse colors -->
<button className="bg-primary text-primary-content">primary</button>
<button className="bg-secondary text-secondary-content">secondary</button>
<button className="bg-accent text-accent-content">accent</button>
<button className="bg-neutral text-neutral-content">neutral</button>
<button className="bg-success text-success-content">success</button>
<button className="bg-info text-info-content">info</button>
<button className="bg-warning text-warning-content">warning</button>
<button className="bg-error text-error-content">error</button>