Compare commits
2 Commits
26bee398a6
...
bac2d9a202
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bac2d9a202 | ||
|
|
81620521e7 |
93
index.html
93
index.html
@@ -3,11 +3,87 @@
|
|||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||||
|
<title>QuixPOS * Management Interface</title>
|
||||||
|
|
||||||
|
<!-- Primary Meta Tags -->
|
||||||
|
<meta name="title" content="QuixPOS * Management Interface" />
|
||||||
|
<meta name="description"
|
||||||
|
content="QuixPOS * Point-of-Sale- und Warenwirtschaftssystem. Schnelle Kassenabwicklung, intelligente Artikelverwaltung, Aufträge und Bestandsführung." />
|
||||||
|
<meta name="keywords"
|
||||||
|
content="QuixPOS, POS, Kassensystem, Warenwirtschaft, ERP, Artikelverwaltung, Lagerverwaltung, Kasse, Point of Sale" />
|
||||||
|
<meta name="author" content="QuixPOS" />
|
||||||
|
<meta name="robots" content="index, follow" />
|
||||||
|
<meta name="theme-color" content="#1d4ed8" />
|
||||||
|
|
||||||
|
<!-- Icons -->
|
||||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||||
<link rel="apple-touch-icon" href="/icons/icon-192.png" />
|
<link rel="apple-touch-icon" href="/icons/icon-192.png" />
|
||||||
<meta name="theme-color" content="#1d4ed8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
<!-- Open Graph / Facebook / LinkedIn / WhatsApp -->
|
||||||
<title>Dashfront</title>
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:site_name" content="QuixPOS" />
|
||||||
|
<meta property="og:title" content="QuixPOS * Management Interface" />
|
||||||
|
<meta property="og:description"
|
||||||
|
content="Webbasiertes Point-of-Sale- und Warenwirtschaftssystem. Schnelle Kassenabwicklung, intelligente Artikelverwaltung und Bestandsführung." />
|
||||||
|
<meta property="og:image" content="/og-image.png" />
|
||||||
|
<meta property="og:image:secure_url" content="/og-image.png" />
|
||||||
|
<meta property="og:image:type" content="image/png" />
|
||||||
|
<meta property="og:image:width" content="1200" />
|
||||||
|
<meta property="og:image:height" content="630" />
|
||||||
|
<meta property="og:image:alt" content="QuixPOS * Point-of-Sale & Warenwirtschaftssystem" />
|
||||||
|
<meta property="og:locale" content="de_DE" />
|
||||||
|
|
||||||
|
<!-- Twitter / X -->
|
||||||
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<meta name="twitter:title" content="QuixPOS * Management Interface" />
|
||||||
|
<meta name="twitter:description"
|
||||||
|
content="Webbasiertes Point-of-Sale- und Warenwirtschaftssystem. Schnelle Kassenabwicklung, intelligente Artikelverwaltung und Bestandsführung." />
|
||||||
|
<meta name="twitter:image" content="/og-image.png" />
|
||||||
|
<meta name="twitter:image:alt" content="QuixPOS * Point-of-Sale & Warenwirtschaftssystem" />
|
||||||
|
|
||||||
|
<!-- Structured Data: JSON-LD -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@graph": [
|
||||||
|
{
|
||||||
|
"@type": "WebApplication",
|
||||||
|
"@id": "#webapp",
|
||||||
|
"name": "QuixPOS",
|
||||||
|
"alternateName": "QuixPOS Management Interface",
|
||||||
|
"applicationCategory": "BusinessApplication",
|
||||||
|
"operatingSystem": "All",
|
||||||
|
"browserRequirements": "Requires modern JavaScript browser (Chrome, Firefox, Safari, Edge)",
|
||||||
|
"description": "Webbasiertes Point-of-Sale- und Warenwirtschaftssystem. Schnelle Kassenabwicklung, intelligente Artikelverwaltung, Aufträge und Bestandsführung.",
|
||||||
|
"image": "/og-image.png",
|
||||||
|
"screenshot": "/og-image.png",
|
||||||
|
"softwareVersion": "1.0",
|
||||||
|
"offers": {
|
||||||
|
"@type": "Offer",
|
||||||
|
"price": "0",
|
||||||
|
"priceCurrency": "EUR"
|
||||||
|
},
|
||||||
|
"featureList": [
|
||||||
|
"Point of Sale Kassenbetrieb",
|
||||||
|
"Artikel- & Barcodeverwaltung",
|
||||||
|
"Lager- & Lieferantenmanagement",
|
||||||
|
"Angebote & Bestellwesen",
|
||||||
|
"Kundenverwaltung & Preisgruppen"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "Organization",
|
||||||
|
"@id": "#organization",
|
||||||
|
"name": "QuixPOS",
|
||||||
|
"logo": "/quixpos-logo.png",
|
||||||
|
"image": "/og-image.png",
|
||||||
|
"description": "Point-of-Sale & Warenwirtschaftssystem"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
/* First-paint colors. Mirrored from src/colors.js (MAIN_BACKGROUND /
|
/* First-paint colors. Mirrored from src/colors.js (MAIN_BACKGROUND /
|
||||||
THEME_COLOR) because this file must paint before the JS bundle loads.
|
THEME_COLOR) because this file must paint before the JS bundle loads.
|
||||||
@@ -32,6 +108,17 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
<noscript>
|
||||||
|
<div
|
||||||
|
style="font-family:system-ui,-apple-system,sans-serif;max-width:440px;margin:60px auto;padding:32px 24px;text-align:center;background:#ffffff;border-radius:16px;box-shadow:0 8px 30px rgba(0,0,0,0.12);color:#1e293b;">
|
||||||
|
<img src="/quixpos-logo.png" alt="QuixPOS Logo" width="96" height="96"
|
||||||
|
style="border-radius:16px;margin-bottom:16px;box-shadow:0 4px 12px rgba(0,0,0,0.08);" />
|
||||||
|
<h1 style="margin:0 0 6px;font-size:26px;font-weight:700;color:#0f2f35;">QuixPOS</h1>
|
||||||
|
<p style="margin:0 0 12px;font-size:16px;font-weight:600;color:#0f766e;">Management Interface</p>
|
||||||
|
<p style="margin:0;font-size:13px;color:#94a3b8;">Bitte aktivieren Sie JavaScript, um das Management Interface zu
|
||||||
|
nutzen.</p>
|
||||||
|
</div>
|
||||||
|
</noscript>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
|
|||||||
BIN
public/og-image.png
Normal file
BIN
public/og-image.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 200 KiB |
BIN
public/quixpos-logo.png
Normal file
BIN
public/quixpos-logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
@@ -29,6 +29,7 @@ class LoginPage extends PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
document.title = 'QuixPOS * Management Interface Login';
|
||||||
this.unsubscribe = authAutomat.subscribe(this, ['status', 'googleClientId']);
|
this.unsubscribe = authAutomat.subscribe(this, ['status', 'googleClientId']);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,9 +66,9 @@ class LoginPage extends PureComponent {
|
|||||||
href: window.location.href,
|
href: window.location.href,
|
||||||
dashHost: window.__dashHost
|
dashHost: window.__dashHost
|
||||||
? {
|
? {
|
||||||
isDashNative: window.__dashHost.isDashNative,
|
isDashNative: window.__dashHost.isDashNative,
|
||||||
googleSignIn: window.__dashHost.googleSignIn,
|
googleSignIn: window.__dashHost.googleSignIn,
|
||||||
}
|
}
|
||||||
: null,
|
: null,
|
||||||
error: err,
|
error: err,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -254,20 +254,11 @@ export default class ArticleSupplierTab extends PureComponent {
|
|||||||
<Box
|
<Box
|
||||||
sx={{
|
sx={{
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
justifyContent: 'space-between',
|
justifyContent: 'flex-end',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
mb: 2,
|
mb: 2,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Box>
|
|
||||||
<Typography variant="subtitle1" sx={{ fontWeight: 600 }}>
|
|
||||||
Zugeordnete Lieferanten ({assignedSuppliers.length})
|
|
||||||
</Typography>
|
|
||||||
<Typography variant="caption" color="text.secondary">
|
|
||||||
Bezugsquellen, Lieferanten-Artikelnr. und Konditionen für diesen Artikel
|
|
||||||
</Typography>
|
|
||||||
</Box>
|
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
size="small"
|
size="small"
|
||||||
variant="contained"
|
variant="contained"
|
||||||
@@ -279,200 +270,166 @@ export default class ArticleSupplierTab extends PureComponent {
|
|||||||
</Button>
|
</Button>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
{/* Content Table or Empty State */}
|
{/* Content Table */}
|
||||||
{assignedSuppliers.length === 0 ? (
|
<Table
|
||||||
<Box
|
size="small"
|
||||||
sx={{
|
sx={{
|
||||||
display: 'flex',
|
'& td': { verticalAlign: 'middle' },
|
||||||
flexDirection: 'column',
|
'& th': { fontWeight: 600, color: 'text.secondary', fontSize: '0.8rem' },
|
||||||
alignItems: 'center',
|
}}
|
||||||
justifyContent: 'center',
|
>
|
||||||
py: 6,
|
<TableHead>
|
||||||
px: 2,
|
<TableRow>
|
||||||
borderRadius: 2,
|
<TableCell sx={{ width: 60, pl: 1 }}>Reihe</TableCell>
|
||||||
border: `1px dashed ${SORT_GHOST_BG}`,
|
<TableCell>Lieferant</TableCell>
|
||||||
bgcolor: TINT_FAINT,
|
<TableCell>Lief.-Art.-Nr.</TableCell>
|
||||||
textAlign: 'center',
|
<TableCell align="right">VPE (PU)</TableCell>
|
||||||
}}
|
<TableCell align="right">Lagerbestand</TableCell>
|
||||||
>
|
<TableCell align="right">Einkaufspreis</TableCell>
|
||||||
<LocalShippingOutlinedIcon sx={{ fontSize: 48, mb: 1.5, color: 'text.secondary', opacity: 0.6 }} />
|
<TableCell align="right" sx={{ width: 100, pr: 1 }}>
|
||||||
<Typography variant="subtitle2" sx={{ fontWeight: 600, mb: 0.5 }}>
|
Aktionen
|
||||||
Noch keine Lieferanten zugewiesen
|
</TableCell>
|
||||||
</Typography>
|
</TableRow>
|
||||||
<Typography variant="body2" color="text.secondary" sx={{ maxWidth: 380, mb: 2 }}>
|
</TableHead>
|
||||||
Weise diesem Artikel Lieferanten zu, um Einkaufspreise, VPE und Artikelnummern für Wareneingänge zu hinterlegen.
|
<TableBody>
|
||||||
</Typography>
|
{assignedSuppliers.map((row, index) => {
|
||||||
<Button
|
const isBusy = busyId === row.id;
|
||||||
variant="outlined"
|
const netPrice = row.price?.net;
|
||||||
startIcon={<AddIcon />}
|
const taxRate = row.price?.taxRate;
|
||||||
onClick={this.handleOpenAdd}
|
|
||||||
size="small"
|
|
||||||
sx={{ textTransform: 'none' }}
|
|
||||||
>
|
|
||||||
Jetzt Lieferant zuweisen
|
|
||||||
</Button>
|
|
||||||
</Box>
|
|
||||||
) : (
|
|
||||||
<Table
|
|
||||||
size="small"
|
|
||||||
sx={{
|
|
||||||
'& td': { verticalAlign: 'middle' },
|
|
||||||
'& th': { fontWeight: 600, color: 'text.secondary', fontSize: '0.8rem' },
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<TableHead>
|
|
||||||
<TableRow>
|
|
||||||
<TableCell sx={{ width: 60, pl: 1 }}>Reihe</TableCell>
|
|
||||||
<TableCell>Lieferant</TableCell>
|
|
||||||
<TableCell>Lief.-Art.-Nr.</TableCell>
|
|
||||||
<TableCell align="right">VPE (PU)</TableCell>
|
|
||||||
<TableCell align="right">Lagerbestand</TableCell>
|
|
||||||
<TableCell align="right">Einkaufspreis</TableCell>
|
|
||||||
<TableCell align="right" sx={{ width: 100, pr: 1 }}>
|
|
||||||
Aktionen
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
</TableHead>
|
|
||||||
<TableBody>
|
|
||||||
{assignedSuppliers.map((row, index) => {
|
|
||||||
const isBusy = busyId === row.id;
|
|
||||||
const netPrice = row.price?.net;
|
|
||||||
const taxRate = row.price?.taxRate;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TableRow
|
<TableRow
|
||||||
key={row.id}
|
key={row.id}
|
||||||
hover
|
hover
|
||||||
sx={{
|
sx={{
|
||||||
opacity: isBusy ? 0.5 : 1,
|
opacity: isBusy ? 0.5 : 1,
|
||||||
transition: 'opacity 0.2s',
|
transition: 'opacity 0.2s',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{/* Sort Order & Reorder Controls */}
|
{/* Sort Order & Reorder Controls */}
|
||||||
<TableCell sx={{ pl: 1 }}>
|
<TableCell sx={{ pl: 1 }}>
|
||||||
<Stack direction="row" spacing={0.5} alignItems="center">
|
<Stack direction="row" spacing={0.5} alignItems="center">
|
||||||
<Typography variant="caption" sx={{ minWidth: 16, fontWeight: 700, color: 'text.secondary' }}>
|
<Typography variant="caption" sx={{ minWidth: 16, fontWeight: 700, color: 'text.secondary' }}>
|
||||||
{index + 1}
|
{index + 1}
|
||||||
|
</Typography>
|
||||||
|
<Box sx={{ display: 'flex', flexDirection: 'column' }}>
|
||||||
|
<Tooltip title="Nach oben">
|
||||||
|
<span>
|
||||||
|
<IconButton
|
||||||
|
size="small"
|
||||||
|
disabled={index === 0 || isBusy}
|
||||||
|
onClick={() => this.handleMove(index, -1)}
|
||||||
|
sx={{ p: 0.2 }}
|
||||||
|
>
|
||||||
|
<ArrowUpwardIcon sx={{ fontSize: 13 }} />
|
||||||
|
</IconButton>
|
||||||
|
</span>
|
||||||
|
</Tooltip>
|
||||||
|
<Tooltip title="Nach unten">
|
||||||
|
<span>
|
||||||
|
<IconButton
|
||||||
|
size="small"
|
||||||
|
disabled={index === assignedSuppliers.length - 1 || isBusy}
|
||||||
|
onClick={() => this.handleMove(index, 1)}
|
||||||
|
sx={{ p: 0.2 }}
|
||||||
|
>
|
||||||
|
<ArrowDownwardIcon sx={{ fontSize: 13 }} />
|
||||||
|
</IconButton>
|
||||||
|
</span>
|
||||||
|
</Tooltip>
|
||||||
|
</Box>
|
||||||
|
</Stack>
|
||||||
|
</TableCell>
|
||||||
|
|
||||||
|
{/* Supplier Name */}
|
||||||
|
<TableCell sx={{ fontWeight: 600 }}>
|
||||||
|
{row.supplierName ?? `Lieferant #${row.entityId}`}
|
||||||
|
</TableCell>
|
||||||
|
|
||||||
|
{/* Supplier SKU */}
|
||||||
|
<TableCell>
|
||||||
|
{row.sku ? (
|
||||||
|
<Typography variant="body2" sx={{ fontFamily: 'monospace', fontWeight: 500 }}>
|
||||||
|
{row.sku}
|
||||||
|
</Typography>
|
||||||
|
) : (
|
||||||
|
<Typography variant="body2" color="text.secondary">
|
||||||
|
—
|
||||||
|
</Typography>
|
||||||
|
)}
|
||||||
|
</TableCell>
|
||||||
|
|
||||||
|
{/* PU / VPE */}
|
||||||
|
<TableCell align="right">
|
||||||
|
<Typography variant="body2">{row.pu ?? 1}</Typography>
|
||||||
|
</TableCell>
|
||||||
|
|
||||||
|
{/* Stock */}
|
||||||
|
<TableCell align="right">
|
||||||
|
{row.stock != null ? (
|
||||||
|
<Chip
|
||||||
|
size="small"
|
||||||
|
label={`${row.stock} Stk`}
|
||||||
|
color={row.stock > 0 ? 'success' : 'default'}
|
||||||
|
variant="outlined"
|
||||||
|
sx={{ fontWeight: 500, height: 22, fontSize: '0.75rem' }}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<Typography variant="body2" color="text.secondary">
|
||||||
|
—
|
||||||
|
</Typography>
|
||||||
|
)}
|
||||||
|
</TableCell>
|
||||||
|
|
||||||
|
{/* Purchase Price Net & Tax */}
|
||||||
|
<TableCell align="right">
|
||||||
|
{netPrice != null ? (
|
||||||
|
<Box>
|
||||||
|
<Typography variant="body2" sx={{ fontWeight: 600 }}>
|
||||||
|
{formatPrice(netPrice)}
|
||||||
</Typography>
|
</Typography>
|
||||||
<Box sx={{ display: 'flex', flexDirection: 'column' }}>
|
{taxRate != null ? (
|
||||||
<Tooltip title="Nach oben">
|
<Typography variant="caption" color="text.secondary">
|
||||||
<span>
|
zzgl. {taxRate} % MwSt.
|
||||||
<IconButton
|
|
||||||
size="small"
|
|
||||||
disabled={index === 0 || isBusy}
|
|
||||||
onClick={() => this.handleMove(index, -1)}
|
|
||||||
sx={{ p: 0.2 }}
|
|
||||||
>
|
|
||||||
<ArrowUpwardIcon sx={{ fontSize: 13 }} />
|
|
||||||
</IconButton>
|
|
||||||
</span>
|
|
||||||
</Tooltip>
|
|
||||||
<Tooltip title="Nach unten">
|
|
||||||
<span>
|
|
||||||
<IconButton
|
|
||||||
size="small"
|
|
||||||
disabled={index === assignedSuppliers.length - 1 || isBusy}
|
|
||||||
onClick={() => this.handleMove(index, 1)}
|
|
||||||
sx={{ p: 0.2 }}
|
|
||||||
>
|
|
||||||
<ArrowDownwardIcon sx={{ fontSize: 13 }} />
|
|
||||||
</IconButton>
|
|
||||||
</span>
|
|
||||||
</Tooltip>
|
|
||||||
</Box>
|
|
||||||
</Stack>
|
|
||||||
</TableCell>
|
|
||||||
|
|
||||||
{/* Supplier Name */}
|
|
||||||
<TableCell sx={{ fontWeight: 600 }}>
|
|
||||||
{row.supplierName ?? `Lieferant #${row.entityId}`}
|
|
||||||
</TableCell>
|
|
||||||
|
|
||||||
{/* Supplier SKU */}
|
|
||||||
<TableCell>
|
|
||||||
{row.sku ? (
|
|
||||||
<Typography variant="body2" sx={{ fontFamily: 'monospace', fontWeight: 500 }}>
|
|
||||||
{row.sku}
|
|
||||||
</Typography>
|
|
||||||
) : (
|
|
||||||
<Typography variant="body2" color="text.secondary">
|
|
||||||
—
|
|
||||||
</Typography>
|
|
||||||
)}
|
|
||||||
</TableCell>
|
|
||||||
|
|
||||||
{/* PU / VPE */}
|
|
||||||
<TableCell align="right">
|
|
||||||
<Typography variant="body2">{row.pu ?? 1}</Typography>
|
|
||||||
</TableCell>
|
|
||||||
|
|
||||||
{/* Stock */}
|
|
||||||
<TableCell align="right">
|
|
||||||
{row.stock != null ? (
|
|
||||||
<Chip
|
|
||||||
size="small"
|
|
||||||
label={`${row.stock} Stk`}
|
|
||||||
color={row.stock > 0 ? 'success' : 'default'}
|
|
||||||
variant="outlined"
|
|
||||||
sx={{ fontWeight: 500, height: 22, fontSize: '0.75rem' }}
|
|
||||||
/>
|
|
||||||
) : (
|
|
||||||
<Typography variant="body2" color="text.secondary">
|
|
||||||
—
|
|
||||||
</Typography>
|
|
||||||
)}
|
|
||||||
</TableCell>
|
|
||||||
|
|
||||||
{/* Purchase Price Net & Tax */}
|
|
||||||
<TableCell align="right">
|
|
||||||
{netPrice != null ? (
|
|
||||||
<Box>
|
|
||||||
<Typography variant="body2" sx={{ fontWeight: 600 }}>
|
|
||||||
{formatPrice(netPrice)}
|
|
||||||
</Typography>
|
</Typography>
|
||||||
{taxRate != null ? (
|
) : null}
|
||||||
<Typography variant="caption" color="text.secondary">
|
</Box>
|
||||||
zzgl. {taxRate} % MwSt.
|
) : (
|
||||||
</Typography>
|
<Typography variant="body2" color="text.secondary">
|
||||||
) : null}
|
—
|
||||||
</Box>
|
</Typography>
|
||||||
) : (
|
)}
|
||||||
<Typography variant="body2" color="text.secondary">
|
</TableCell>
|
||||||
—
|
|
||||||
</Typography>
|
|
||||||
)}
|
|
||||||
</TableCell>
|
|
||||||
|
|
||||||
{/* Actions */}
|
{/* Actions */}
|
||||||
<TableCell align="right" sx={{ pr: 1 }}>
|
<TableCell align="right" sx={{ pr: 1 }}>
|
||||||
<Stack direction="row" spacing={0.5} justifyContent="flex-end">
|
<Stack direction="row" spacing={0.5} justifyContent="flex-end">
|
||||||
<Tooltip title="Bearbeiten">
|
<Tooltip title="Bearbeiten">
|
||||||
<IconButton
|
<IconButton
|
||||||
size="small"
|
size="small"
|
||||||
onClick={() => this.handleOpenEdit(row)}
|
onClick={() => this.handleOpenEdit(row)}
|
||||||
disabled={isBusy}
|
disabled={isBusy}
|
||||||
>
|
>
|
||||||
<EditOutlinedIcon fontSize="small" />
|
<EditOutlinedIcon fontSize="small" />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip title="Entfernen">
|
<Tooltip title="Entfernen">
|
||||||
<IconButton
|
<IconButton
|
||||||
size="small"
|
size="small"
|
||||||
color="error"
|
color="error"
|
||||||
onClick={() => this.handleDelete(row)}
|
onClick={() => this.handleDelete(row)}
|
||||||
disabled={isBusy}
|
disabled={isBusy}
|
||||||
>
|
>
|
||||||
<DeleteOutlineOutlinedIcon fontSize="small" />
|
<DeleteOutlineOutlinedIcon fontSize="small" />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</Stack>
|
</Stack>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</TableBody>
|
</TableBody>
|
||||||
</Table>
|
</Table>
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Add / Edit Dialog */}
|
{/* Add / Edit Dialog */}
|
||||||
<ArticleSupplierDialog
|
<ArticleSupplierDialog
|
||||||
|
|||||||
@@ -184,8 +184,8 @@ function nginxHeadersPreviewPlugin() {
|
|||||||
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
|
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
|
||||||
res.setHeader('Pragma', 'no-cache');
|
res.setHeader('Pragma', 'no-cache');
|
||||||
res.setHeader('Expires', '0');
|
res.setHeader('Expires', '0');
|
||||||
} else if (/^\/(manifest\.webmanifest|favicon\.svg|icons\/.*)$/.test(url)) {
|
} else if (/^\/(manifest\.webmanifest|favicon\.svg|icons\/.*|og-image\.png|quixpos-logo\.png)$/.test(url)) {
|
||||||
// 1 hour for web manifest & icons
|
// 1 hour for web manifest & icons / social share assets
|
||||||
res.setHeader('Cache-Control', 'public, max-age=3600');
|
res.setHeader('Cache-Control', 'public, max-age=3600');
|
||||||
res.setHeader('Vary', 'Accept-Encoding');
|
res.setHeader('Vary', 'Accept-Encoding');
|
||||||
} else if (url.startsWith('/assets/')) {
|
} else if (url.startsWith('/assets/')) {
|
||||||
|
|||||||
Reference in New Issue
Block a user