Darkmod ayarları düzenlendi.
This commit is contained in:
parent
6262baa6f1
commit
6ed1c2dabc
8 changed files with 97 additions and 66 deletions
|
|
@ -240,7 +240,7 @@ const FormEdit = () => {
|
|||
{/* SAĞ TARAF */}
|
||||
{listFormValues.isTenant && (
|
||||
<Badge
|
||||
className="font-semibold"
|
||||
className="font-semibold dark:bg-red-500 dark:text-white"
|
||||
content="Bu bir MULTI TENANT form'dur, veri kaybı olmaması için, sorgularda TENANTID
|
||||
parametresini kullanmayı unutmayınız."
|
||||
innerClass="p-1 bg-red-50 text-red-500"
|
||||
|
|
|
|||
|
|
@ -457,7 +457,7 @@ function FormFields({
|
|||
<Tr
|
||||
className={classNames(
|
||||
'cursor-pointer',
|
||||
field.id === row?.id ? 'bg-sozsoft-active' : '',
|
||||
field.id === row?.id ? 'bg-sozsoft-active dark:bg-gray-600' : '',
|
||||
)}
|
||||
onClick={(e: any) => {
|
||||
setRow(field)
|
||||
|
|
|
|||
|
|
@ -110,10 +110,10 @@ export function WorkflowCanvas({
|
|||
return (
|
||||
<div
|
||||
ref={canvasRef}
|
||||
className="relative max-h-[68vh] min-h-[620px] overflow-auto rounded-lg border border-gray-200"
|
||||
className="relative max-h-[68vh] min-h-[620px] overflow-auto rounded-lg border border-gray-200 bg-white [--grid-color:#edf1f6] dark:border-gray-700 dark:bg-gray-950 dark:[--grid-color:#243244]"
|
||||
style={{
|
||||
backgroundImage:
|
||||
'linear-gradient(#edf1f6 1px, transparent 1px), linear-gradient(90deg, #edf1f6 1px, transparent 1px)',
|
||||
'linear-gradient(var(--grid-color) 1px, transparent 1px), linear-gradient(90deg, var(--grid-color) 1px, transparent 1px)',
|
||||
backgroundSize: '24px 24px',
|
||||
}}
|
||||
tabIndex={0}
|
||||
|
|
@ -121,12 +121,12 @@ export function WorkflowCanvas({
|
|||
onKeyDown={handleKeyDown}
|
||||
>
|
||||
{pendingLink && (
|
||||
<div className="sticky left-2.5 top-2.5 z-50 m-2.5 inline-flex min-h-[34px] items-center rounded-md border border-[#8bb3f1] bg-[#eff6ff] px-3 text-[13px] text-blue-800 shadow-lg">
|
||||
<div className="sticky left-2.5 top-2.5 z-50 m-2.5 inline-flex min-h-[34px] items-center rounded-md border border-[#8bb3f1] bg-[#eff6ff] px-3 text-[13px] text-blue-800 shadow-lg dark:border-blue-500/60 dark:bg-blue-900/40 dark:text-blue-100">
|
||||
{outcomeLabel(pendingLink.outcome)} çıkışı seçildi. Hedef iş akışı adımına tıklayın.
|
||||
</div>
|
||||
)}
|
||||
{currentCriteria.length === 0 && (
|
||||
<div className="sticky left-[18px] top-[18px] z-30 inline-grid max-w-[360px] gap-1 rounded-lg border border-[#cfd6e2] bg-white/95 p-3.5 text-[#475467] shadow-lg">
|
||||
<div className="sticky left-[18px] top-[18px] z-30 inline-grid max-w-[360px] gap-1 rounded-lg border border-[#cfd6e2] bg-white/95 p-3.5 text-[#475467] shadow-lg dark:border-gray-700 dark:bg-gray-900/95 dark:text-gray-300">
|
||||
<span>
|
||||
Üstteki butonlardan adım ekleyin, sonra çıkış etiketleriyle bağlantıları kurun.
|
||||
</span>
|
||||
|
|
@ -293,10 +293,10 @@ function FlowNode({
|
|||
ref={setNodeRef}
|
||||
type="button"
|
||||
className={classNames(
|
||||
'absolute z-40 grid h-32 w-44 touch-none content-start justify-items-start gap-1 rounded-lg border-2 border-[#667085] bg-white p-2.5 text-left text-slate-700 shadow-lg',
|
||||
'absolute z-40 grid h-32 w-44 touch-none content-start justify-items-start gap-1 rounded-lg border-2 border-[#667085] bg-white p-2.5 text-left text-slate-700 shadow-lg dark:border-gray-600 dark:bg-gray-900 dark:text-gray-200',
|
||||
{
|
||||
'border-blue-600 outline outline-[3px] outline-blue-600/20': selected,
|
||||
'border-green-600 bg-green-50 shadow-[0_0_0_4px_rgba(22,163,74,0.18),0_10px_24px_rgba(22,101,52,0.14)]':
|
||||
'border-green-600 bg-green-50 shadow-[0_0_0_4px_rgba(22,163,74,0.18),0_10px_24px_rgba(22,101,52,0.14)] dark:bg-green-900/20':
|
||||
active,
|
||||
'h-[158px] border-amber-600': item.kind === 'Compare',
|
||||
'border-violet-600': item.kind === 'Approval',
|
||||
|
|
@ -330,8 +330,8 @@ function FlowNode({
|
|||
>
|
||||
<span
|
||||
className={classNames('inline-flex items-center gap-1.5 text-xs', {
|
||||
'text-green-800': active,
|
||||
'text-slate-500': !active,
|
||||
'text-green-800 dark:text-green-300': active,
|
||||
'text-slate-500 dark:text-gray-400': !active,
|
||||
})}
|
||||
>
|
||||
<Icon />
|
||||
|
|
@ -340,7 +340,13 @@ function FlowNode({
|
|||
<strong className="break-words text-sm leading-tight [overflow-wrap:anywhere]">
|
||||
{item.title}
|
||||
</strong>
|
||||
<small className={active ? 'text-green-800' : 'text-slate-500'}>{item.id}</small>
|
||||
<small
|
||||
className={
|
||||
active ? 'text-green-800 dark:text-green-300' : 'text-slate-500 dark:text-gray-400'
|
||||
}
|
||||
>
|
||||
{item.id}
|
||||
</small>
|
||||
<div className="mt-0.5 flex max-w-full flex-wrap gap-[3px]">
|
||||
{(getNodeOutcomes(item) as WorkflowOutcome[]).map((outcome) => (
|
||||
<span
|
||||
|
|
@ -348,9 +354,9 @@ function FlowNode({
|
|||
role="button"
|
||||
tabIndex={0}
|
||||
className={classNames(
|
||||
'inline-flex min-h-[19px] max-w-full cursor-crosshair items-center overflow-hidden rounded-full border border-[#cfd6e2] bg-white px-1.5 py-px text-[10px] leading-tight text-[#344054] [text-overflow:ellipsis] [white-space:nowrap]',
|
||||
'inline-flex min-h-[19px] max-w-full cursor-crosshair items-center overflow-hidden rounded-full border border-[#cfd6e2] bg-white px-1.5 py-px text-[10px] leading-tight text-[#344054] [text-overflow:ellipsis] [white-space:nowrap] dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200',
|
||||
{
|
||||
'border-blue-600 bg-[#eaf2ff] text-blue-600':
|
||||
'border-blue-600 bg-[#eaf2ff] text-blue-600 dark:border-blue-400 dark:bg-blue-900/40 dark:text-blue-200':
|
||||
pendingLink?.sourceId === item.id && pendingLink?.outcome === outcome.field,
|
||||
},
|
||||
)}
|
||||
|
|
@ -388,10 +394,10 @@ function FlowNode({
|
|||
<span
|
||||
key={`${outcome.field}-port`}
|
||||
className={classNames(
|
||||
'absolute z-10 h-1 w-1 rounded-full border border-[#475467] bg-white shadow-[0_0_0_1.5px_rgba(255,255,255,0.95)]',
|
||||
'absolute z-10 h-1 w-1 rounded-full border border-[#475467] bg-white shadow-[0_0_0_1.5px_rgba(255,255,255,0.95)] dark:border-gray-300 dark:bg-gray-900 dark:shadow-[0_0_0_1.5px_rgba(17,24,39,0.95)]',
|
||||
portSideClass(side),
|
||||
{
|
||||
'border-blue-600 bg-blue-100':
|
||||
'border-blue-600 bg-blue-100 dark:border-blue-300 dark:bg-blue-800':
|
||||
pendingLink?.sourceId === item.id && pendingLink?.outcome === outcome.field,
|
||||
},
|
||||
)}
|
||||
|
|
@ -407,7 +413,7 @@ function FlowNode({
|
|||
<span
|
||||
key={`${link.key}-incoming-port`}
|
||||
className={classNames(
|
||||
'absolute h-1 w-1 rounded-full border border-slate-500 bg-slate-50 shadow-[0_0_0_1.5px_rgba(255,255,255,0.95)]',
|
||||
'absolute h-1 w-1 rounded-full border border-slate-500 bg-slate-50 shadow-[0_0_0_1.5px_rgba(255,255,255,0.95)] dark:border-gray-300 dark:bg-gray-900 dark:shadow-[0_0_0_1.5px_rgba(17,24,39,0.95)]',
|
||||
portSideClass(side),
|
||||
)}
|
||||
style={getPortStyle(
|
||||
|
|
@ -466,7 +472,7 @@ function Arrow({
|
|||
/>
|
||||
<path
|
||||
className={classNames(
|
||||
'pointer-events-none stroke-white/95 [stroke-linecap:butt] [stroke-linejoin:round] [stroke-width:7] group-hover:stroke-[var(--link-soft)] group-hover:[stroke-width:10] group-focus-visible:stroke-[var(--link-soft)] group-focus-visible:[stroke-width:10]',
|
||||
'pointer-events-none stroke-white/95 [stroke-linecap:butt] [stroke-linejoin:round] [stroke-width:7] group-hover:stroke-[var(--link-soft)] group-hover:[stroke-width:10] group-focus-visible:stroke-[var(--link-soft)] group-focus-visible:[stroke-width:10] dark:stroke-gray-950/95',
|
||||
{ 'stroke-[var(--link-soft)] [stroke-width:10]': isActive },
|
||||
)}
|
||||
d={d}
|
||||
|
|
@ -506,13 +512,13 @@ function ArrowLabel({
|
|||
return (
|
||||
<g
|
||||
className={classNames(linkToneClass(tone), {
|
||||
'[&_text]:text-[11px] [&_text]:font-bold [&_rect]:fill-white [&_rect]:[stroke-width:1.5]':
|
||||
'[&_text]:text-[11px] [&_text]:font-bold [&_rect]:fill-white [&_rect]:[stroke-width:1.5] dark:[&_rect]:fill-gray-900':
|
||||
isActive,
|
||||
})}
|
||||
data-flow-link
|
||||
>
|
||||
<rect
|
||||
className="fill-white/90 stroke-[var(--link-soft)] [stroke-width:1]"
|
||||
className="fill-white/90 stroke-[var(--link-soft)] [stroke-width:1] dark:fill-gray-900/90"
|
||||
x={labelPoint.x - labelWidth / 2}
|
||||
y={labelPoint.y - 12}
|
||||
width={labelWidth}
|
||||
|
|
|
|||
|
|
@ -73,19 +73,17 @@ export function WorkflowCriteria({
|
|||
|
||||
const validColumns = new Set(compareColumnOptions.map((option) => option.value))
|
||||
let changed = false
|
||||
const nextOutcomes = (formValues.compareOutcomes || []).map(
|
||||
(outcome: CompareOutcomeDto) => ({
|
||||
...outcome,
|
||||
conditions: (outcome.conditions || []).map((condition) => {
|
||||
if (validColumns.has(condition.compareColumn)) {
|
||||
return condition
|
||||
}
|
||||
const nextOutcomes = (formValues.compareOutcomes || []).map((outcome: CompareOutcomeDto) => ({
|
||||
...outcome,
|
||||
conditions: (outcome.conditions || []).map((condition) => {
|
||||
if (validColumns.has(condition.compareColumn)) {
|
||||
return condition
|
||||
}
|
||||
|
||||
changed = true
|
||||
return { ...condition, compareColumn: defaultCompareColumn }
|
||||
}),
|
||||
changed = true
|
||||
return { ...condition, compareColumn: defaultCompareColumn }
|
||||
}),
|
||||
)
|
||||
}))
|
||||
|
||||
const nextCompareColumn = validColumns.has(formValues.compareColumn)
|
||||
? formValues.compareColumn
|
||||
|
|
@ -189,7 +187,10 @@ export function WorkflowCriteria({
|
|||
const connectionSummary = criteriaConnectionSummary(item, criteria)
|
||||
|
||||
return (
|
||||
<Tr key={item.id} className={classNames(isSelected && 'bg-blue-50')}>
|
||||
<Tr
|
||||
key={item.id}
|
||||
className={classNames(isSelected && 'bg-blue-50 dark:bg-blue-900/20')}
|
||||
>
|
||||
<Td>
|
||||
<div className="flex-wrap inline-flex xl:flex items-center gap-2">
|
||||
<Button
|
||||
|
|
@ -269,7 +270,10 @@ export function WorkflowCriteria({
|
|||
</FormItem>
|
||||
|
||||
{(formValues.kind === 'Start' || formValues.kind === 'Inform') && (
|
||||
<FormItem label={translate('::App.Listform.ListformField.NextOnStart')} asterisk>
|
||||
<FormItem
|
||||
label={translate('::App.Listform.ListformField.NextOnStart')}
|
||||
asterisk
|
||||
>
|
||||
{targetSelect(
|
||||
formValues.nextOnStart,
|
||||
(value) => setField('nextOnStart', value),
|
||||
|
|
@ -280,14 +284,20 @@ export function WorkflowCriteria({
|
|||
|
||||
{formValues.kind === 'Approval' && (
|
||||
<>
|
||||
<FormItem label={translate('::App.Listform.ListformField.NextOnApprove')} asterisk>
|
||||
<FormItem
|
||||
label={translate('::App.Listform.ListformField.NextOnApprove')}
|
||||
asterisk
|
||||
>
|
||||
{targetSelect(
|
||||
formValues.nextOnApprove,
|
||||
(value) => setField('nextOnApprove', value),
|
||||
true,
|
||||
)}
|
||||
</FormItem>
|
||||
<FormItem label={translate('::App.Listform.ListformField.NextOnReject')} asterisk>
|
||||
<FormItem
|
||||
label={translate('::App.Listform.ListformField.NextOnReject')}
|
||||
asterisk
|
||||
>
|
||||
{targetSelect(
|
||||
formValues.nextOnReject,
|
||||
(value) => setField('nextOnReject', value),
|
||||
|
|
@ -304,7 +314,7 @@ export function WorkflowCriteria({
|
|||
<h6>
|
||||
{translate('::App.Listform.ListformField.CompareOutcomes')}
|
||||
{isLoadingSelectCommandColumns && (
|
||||
<span className="ml-2 text-xs font-normal text-gray-400">
|
||||
<span className="ml-2 text-xs font-normal text-gray-400 dark:text-gray-500">
|
||||
{translate('::App.Listform.ListformField.LoadingColumns')}
|
||||
</span>
|
||||
)}
|
||||
|
|
@ -330,10 +340,17 @@ export function WorkflowCriteria({
|
|||
<div className="grid gap-3">
|
||||
{(formValues.compareOutcomes || []).map(
|
||||
(outcome: CompareOutcomeDto, index: number) => (
|
||||
<div key={index} className="rounded border border-gray-200 p-3">
|
||||
<div
|
||||
key={index}
|
||||
className="rounded border border-gray-200 bg-white p-3 dark:border-gray-700 dark:bg-gray-900"
|
||||
>
|
||||
<div className="flex flex-col-11 items-center gap-2 mb-2">
|
||||
<strong className="flex-[5]">{translate('::App.Listform.ListformField.Status')} {index + 1}</strong>
|
||||
<strong className="flex-[5]">{translate('::App.Listform.ListformField.Connection')}</strong>
|
||||
<strong className="flex-[5]">
|
||||
{translate('::App.Listform.ListformField.Status')} {index + 1}
|
||||
</strong>
|
||||
<strong className="flex-[5]">
|
||||
{translate('::App.Listform.ListformField.Connection')}
|
||||
</strong>
|
||||
<span className="flex-1" />
|
||||
</div>
|
||||
<div className="flex flex-col-11 items-center gap-2">
|
||||
|
|
@ -439,7 +456,7 @@ export function WorkflowCriteria({
|
|||
</div>
|
||||
</Dialog.Body>
|
||||
|
||||
<Dialog.Footer className="flex justify-end gap-2 border-t pt-3 mt-1">
|
||||
<Dialog.Footer className="flex justify-end gap-2 border-t border-gray-200 pt-3 mt-1 dark:border-gray-700">
|
||||
<Button type="button" variant="plain" disabled={busy} onClick={closeDialog}>
|
||||
{translate('::Cancel')}
|
||||
</Button>
|
||||
|
|
@ -463,16 +480,9 @@ export function WorkflowCriteria({
|
|||
|
||||
function isNumericDataType(dataType?: string | null) {
|
||||
const normalized = (dataType || '').toLowerCase()
|
||||
return [
|
||||
'int',
|
||||
'decimal',
|
||||
'numeric',
|
||||
'money',
|
||||
'float',
|
||||
'real',
|
||||
'double',
|
||||
'number',
|
||||
].some((typeName) => normalized.includes(typeName))
|
||||
return ['int', 'decimal', 'numeric', 'money', 'float', 'real', 'double', 'number'].some(
|
||||
(typeName) => normalized.includes(typeName),
|
||||
)
|
||||
}
|
||||
|
||||
function SelectField({
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ export function WorkflowDesigner({
|
|||
return (
|
||||
<div className="min-h-screen">
|
||||
<main className="grid">
|
||||
<section className="relative min-w-0 rounded-lg border border-gray-200 bg-white p-4 max-[1080px]:pr-4">
|
||||
<section className="relative min-w-0 rounded-lg border border-gray-200 bg-white p-4 max-[1080px]:pr-4 dark:border-gray-700 dark:bg-gray-900">
|
||||
<div className="mb-3.5 flex items-center justify-between gap-4 max-[720px]:flex-col max-[720px]:items-stretch">
|
||||
<DesignerTabs activeTab={designerTab} onChange={onSetDesignerTab} />
|
||||
|
||||
|
|
@ -176,7 +176,10 @@ function DesignerToolbar({
|
|||
<div className="flex flex-wrap justify-end gap-2">
|
||||
<button
|
||||
type="button"
|
||||
className={classNames(designerButtonClass, 'border-gray-300 bg-white text-slate-700')}
|
||||
className={classNames(
|
||||
designerButtonClass,
|
||||
'border-gray-300 bg-white text-slate-700 hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700',
|
||||
)}
|
||||
disabled={busy}
|
||||
title="Demo akışı yükle"
|
||||
onClick={onResetDemo}
|
||||
|
|
@ -186,7 +189,10 @@ function DesignerToolbar({
|
|||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className={classNames(designerButtonClass, 'border-blue-600 bg-white text-blue-600')}
|
||||
className={classNames(
|
||||
designerButtonClass,
|
||||
'border-blue-600 bg-white text-blue-600 hover:bg-blue-50 dark:border-blue-500 dark:bg-gray-800 dark:text-blue-300 dark:hover:bg-blue-900/30',
|
||||
)}
|
||||
disabled={busy || currentCriteria.length === 0}
|
||||
title="Düğümleri okunabilir şekilde yerleştir"
|
||||
onClick={onFitLayout}
|
||||
|
|
@ -196,7 +202,10 @@ function DesignerToolbar({
|
|||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className={classNames(designerIconButtonClass, 'border-blue-600 bg-white text-blue-600')}
|
||||
className={classNames(
|
||||
designerIconButtonClass,
|
||||
'border-blue-600 bg-white text-blue-600 hover:bg-blue-50 dark:border-blue-500 dark:bg-gray-800 dark:text-blue-300 dark:hover:bg-blue-900/30',
|
||||
)}
|
||||
title="Yakınlaştır"
|
||||
onClick={onZoomIn}
|
||||
>
|
||||
|
|
@ -204,13 +213,16 @@ function DesignerToolbar({
|
|||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className={classNames(designerIconButtonClass, 'border-blue-600 bg-white text-blue-600')}
|
||||
className={classNames(
|
||||
designerIconButtonClass,
|
||||
'border-blue-600 bg-white text-blue-600 hover:bg-blue-50 dark:border-blue-500 dark:bg-gray-800 dark:text-blue-300 dark:hover:bg-blue-900/30',
|
||||
)}
|
||||
title="Uzaklaştır"
|
||||
onClick={onZoomOut}
|
||||
>
|
||||
<FiZoomOut />
|
||||
</button>
|
||||
<span className="inline-flex min-w-12 items-center justify-center text-[13px] font-bold text-slate-500">
|
||||
<span className="inline-flex min-w-12 items-center justify-center text-[13px] font-bold text-slate-500 dark:text-gray-400">
|
||||
{Math.round(zoom * 100)}%
|
||||
</span>
|
||||
{kindOptions.map((option) => {
|
||||
|
|
@ -219,7 +231,10 @@ function DesignerToolbar({
|
|||
<button
|
||||
key={option.value}
|
||||
type="button"
|
||||
className={classNames(designerButtonClass, 'border-blue-600 bg-white text-blue-600')}
|
||||
className={classNames(
|
||||
designerButtonClass,
|
||||
'border-blue-600 bg-white text-blue-600 hover:bg-blue-50 dark:border-blue-500 dark:bg-gray-800 dark:text-blue-300 dark:hover:bg-blue-900/30',
|
||||
)}
|
||||
disabled={busy}
|
||||
onClick={() => onAddCriteria(option.value)}
|
||||
>
|
||||
|
|
@ -249,8 +264,8 @@ function DesignerTabs({
|
|||
className={classNames(
|
||||
designerTabClass,
|
||||
activeTab === 'flow'
|
||||
? 'border-blue-700 bg-blue-700 text-white shadow-sm'
|
||||
: 'border-gray-200 bg-white text-slate-600',
|
||||
? 'border-blue-700 bg-blue-700 text-white shadow-sm dark:border-blue-500 dark:bg-blue-600'
|
||||
: 'border-gray-200 bg-white text-slate-600 hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700',
|
||||
)}
|
||||
onClick={() => onChange('flow')}
|
||||
>
|
||||
|
|
@ -262,8 +277,8 @@ function DesignerTabs({
|
|||
className={classNames(
|
||||
designerTabClass,
|
||||
activeTab === 'criteria'
|
||||
? 'border-blue-700 bg-blue-700 text-white shadow-sm'
|
||||
: 'border-gray-200 bg-white text-slate-600',
|
||||
? 'border-blue-700 bg-blue-700 text-white shadow-sm dark:border-blue-500 dark:bg-blue-600'
|
||||
: 'border-gray-200 bg-white text-slate-600 hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700',
|
||||
)}
|
||||
onClick={() => onChange('criteria')}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -30,13 +30,13 @@ const Dashboard: React.FC = () => {
|
|||
title={translate('::' + 'App.Videoroom.Dashboard')}
|
||||
defaultTitle="Erp Platform"
|
||||
></Helmet>
|
||||
<div className="flex items-center justify-center p-4 bg-white dark:bg-gray-900 min-h-screen">
|
||||
<div className="flex items-center justify-center mt-36 bg-white dark:bg-gray-900">
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
className="text-center w-full max-w-4xl"
|
||||
>
|
||||
<p className="text-lg sm:text-xl text-gray-600 dark:text-gray-300 mb-8 sm:mb-12">
|
||||
<p className="text-lg sm:text-xl text-gray-600 dark:text-gray-300 mb-4 sm:mb-12">
|
||||
{translate('::' + 'App.Videoroom.RoleSelector')}
|
||||
</p>
|
||||
|
||||
|
|
|
|||
|
|
@ -288,11 +288,11 @@ const useGridData = (props: {
|
|||
})
|
||||
.filter((a: any) => {
|
||||
if (mode === 'view') {
|
||||
return a.canRead && a.allowEditing
|
||||
return a.canRead
|
||||
} else if (mode === 'new') {
|
||||
return (a.canCreate || a.canRead) && a.allowAdding
|
||||
return a.canCreate && a.allowAdding
|
||||
} else if (mode === 'edit') {
|
||||
return (a.canUpdate || a.canRead) && a.allowEditing
|
||||
return a.canUpdate && a.allowEditing
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ const Log = ({ version, date, children }: { version: string; date: string; child
|
|||
<time className="sm:absolute left-0 translate-y-0.5 inline-flex items-center justify-center text-xs font-semibold uppercase w-20 h-6 mb-3 sm:mb-0 text-emerald-600 bg-emerald-100 rounded-full">
|
||||
{date}
|
||||
</time>
|
||||
<div className="flex items-center text-xl font-bold text-gray-900">
|
||||
<div className="flex items-center text-xl font-bold text-gray-900 dark:text-white">
|
||||
<FaTag className="mr-2 text-indigo-500" />
|
||||
v{version}
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Reference in a new issue