forked from wts/wts
修改JWT在构建时的行为,尝试减少错误的出现
This commit is contained in:
@@ -30,20 +30,7 @@ export function CheckAndGetJWT(tx: 'raw'): string | null;
|
|||||||
|
|
||||||
export function CheckAndGetJWT(tx: 'raw' | 'parsed'): WtsJWT | string | null {
|
export function CheckAndGetJWT(tx: 'raw' | 'parsed'): WtsJWT | string | null {
|
||||||
if (!browser) {
|
if (!browser) {
|
||||||
if (tx === 'parsed') {
|
return null;
|
||||||
return {
|
|
||||||
openid: '',
|
|
||||||
access: 'unregistered',
|
|
||||||
sid: '',
|
|
||||||
username: '',
|
|
||||||
avatar: '',
|
|
||||||
name: '',
|
|
||||||
|
|
||||||
} as WtsJWT;
|
|
||||||
}
|
|
||||||
if (tx === 'raw') {
|
|
||||||
return "aaaaa";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
let token: string;
|
let token: string;
|
||||||
token = localStorage.getItem('jwt');
|
token = localStorage.getItem('jwt');
|
||||||
@@ -105,6 +92,10 @@ export function Guard(a: (subject: WtsAccess) => boolean) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!a(jwt.access)) {
|
if (!a(jwt.access)) {
|
||||||
|
if(jwt.access === "unregistered"){
|
||||||
|
goto('/register');
|
||||||
|
return;
|
||||||
|
}
|
||||||
console.log('Guard():权限不足,跳转到首页');
|
console.log('Guard():权限不足,跳转到首页');
|
||||||
goto('/forbidden');
|
goto('/forbidden');
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { PageProps } from './$types';
|
import type {PageProps} from './$types';
|
||||||
|
|
||||||
let { data }: PageProps = $props();
|
let {data}: PageProps = $props();
|
||||||
|
|
||||||
import { CheckAndGetJWT, Guard } from '$lib/jwt';
|
import {CheckAndGetJWT, Guard} from '$lib/jwt';
|
||||||
import { IsAdmin, IsOperator, PriorityMap, CategoryMap, ISPMap } from '$lib/types/enum';
|
import {IsAdmin, IsOperator, PriorityMap, CategoryMap, ISPMap} from '$lib/types/enum';
|
||||||
import { onMount } from 'svelte';
|
import {onMount} from 'svelte';
|
||||||
import {
|
import {
|
||||||
RadioButtonGroup,
|
RadioButtonGroup,
|
||||||
RadioButton,
|
RadioButton,
|
||||||
@@ -22,16 +22,21 @@
|
|||||||
NotificationQueue,
|
NotificationQueue,
|
||||||
Toggle
|
Toggle
|
||||||
} from 'carbon-components-svelte';
|
} from 'carbon-components-svelte';
|
||||||
import type { FilterTicketsReq } from '$lib/types/apiRequest';
|
import type {FilterTicketsReq} from '$lib/types/apiRequest';
|
||||||
import { ZoneMap, ZoneToBlock, StatusMap, type WtsZone } from '$lib/types/enum';
|
import {ZoneMap, ZoneToBlock, StatusMap, type WtsZone} from '$lib/types/enum';
|
||||||
import { RFC3339 } from '$lib/types/RFC3339';
|
import {RFC3339} from '$lib/types/RFC3339';
|
||||||
import { startOfDay, endOfDay } from 'date-fns';
|
import {startOfDay, endOfDay} from 'date-fns';
|
||||||
import { criteria } from '$lib/states/ticketCriteriaSearch.svelte';
|
import {criteria} from '$lib/states/ticketCriteriaSearch.svelte';
|
||||||
import { goto } from '$app/navigation';
|
import {goto} from '$app/navigation';
|
||||||
import type { WtsStatus, WtsPriority, WtsCategory, WtsISP } from '$lib/types/enum';
|
import type {WtsStatus, WtsPriority, WtsCategory, WtsISP} from '$lib/types/enum';
|
||||||
|
import {WtsJWT} from '$lib/jwt'
|
||||||
|
|
||||||
onMount(() => Guard(IsOperator));
|
onMount(() => Guard(IsOperator));
|
||||||
|
|
||||||
|
let token: WtsJWT = $state({} as WtsJWT);
|
||||||
|
|
||||||
|
onMount(()=>{token =CheckAndGetJWT('parsed');})
|
||||||
|
|
||||||
let req = $state(criteria.r as FilterTicketsReq);
|
let req = $state(criteria.r as FilterTicketsReq);
|
||||||
|
|
||||||
let zoneSelected: WtsZone[] = $state(criteria._blocks_in_zone ?? []);
|
let zoneSelected: WtsZone[] = $state(criteria._blocks_in_zone ?? []);
|
||||||
@@ -50,7 +55,7 @@
|
|||||||
// });
|
// });
|
||||||
|
|
||||||
let onDateChange = (which: 'newer' | 'older') => (event: CustomEvent) => {
|
let onDateChange = (which: 'newer' | 'older') => (event: CustomEvent) => {
|
||||||
const { dateStr } = event.detail;
|
const {dateStr} = event.detail;
|
||||||
if (dateStr) {
|
if (dateStr) {
|
||||||
const date = new Date(dateStr);
|
const date = new Date(dateStr);
|
||||||
const adjustedDate = which === 'newer' ? startOfDay(date) : endOfDay(date);
|
const adjustedDate = which === 'newer' ? startOfDay(date) : endOfDay(date);
|
||||||
@@ -77,7 +82,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
const allZones = Object.keys(ZoneMap) as WtsZone[];
|
const allZones = Object.keys(ZoneMap) as WtsZone[];
|
||||||
const allStatuses = IsAdmin(CheckAndGetJWT('parsed').access)
|
const allStatuses = IsAdmin(token.access)
|
||||||
? (Object.keys(StatusMap) as WtsStatus[])
|
? (Object.keys(StatusMap) as WtsStatus[])
|
||||||
: (Object.keys(StatusMap).filter(
|
: (Object.keys(StatusMap).filter(
|
||||||
(status) => status !== 'solved' && status !== 'canceled'
|
(status) => status !== 'solved' && status !== 'canceled'
|
||||||
@@ -111,7 +116,7 @@
|
|||||||
'delay',
|
'delay',
|
||||||
'escalated'
|
'escalated'
|
||||||
] as const satisfies readonly WtsStatus[];
|
] as const satisfies readonly WtsStatus[];
|
||||||
const statusOptions: readonly WtsStatus[] = IsAdmin(CheckAndGetJWT('parsed').access)
|
const statusOptions: readonly WtsStatus[] = IsAdmin(token.access)
|
||||||
? statusOptionsAdmin
|
? statusOptionsAdmin
|
||||||
: statusOptionsUser;
|
: statusOptionsUser;
|
||||||
|
|
||||||
@@ -179,7 +184,7 @@
|
|||||||
if (!sameArray(req.isp, nextIsp)) req.isp = nextIsp;
|
if (!sameArray(req.isp, nextIsp)) req.isp = nextIsp;
|
||||||
});
|
});
|
||||||
|
|
||||||
$effect(() =>{
|
$effect(() => {
|
||||||
isScheduledSelected = req.status?.includes('scheduled') ?? false;
|
isScheduledSelected = req.status?.includes('scheduled') ?? false;
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
@@ -190,12 +195,12 @@
|
|||||||
<br />
|
<br />
|
||||||
<p>选择您需要检索报修工单的条件</p>
|
<p>选择您需要检索报修工单的条件</p>
|
||||||
|
|
||||||
{#if IsAdmin(CheckAndGetJWT('parsed').access)}
|
{#if IsAdmin(token.access)}
|
||||||
<br />
|
<br />
|
||||||
<RadioButtonGroup id="scope" legendText="范围" bind:selected={req.scope} required={true}>
|
<RadioButtonGroup id="scope" legendText="范围" bind:selected={req.scope} required={true}>
|
||||||
<RadioButton labelText="只看活跃的" value="active" />
|
<RadioButton labelText="只看活跃的" value="active" />
|
||||||
<RadioButton labelText="所有报修单" value="all" />
|
<RadioButton labelText="所有报修单" value="all" />
|
||||||
</RadioButtonGroup>
|
</RadioButtonGroup>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
@@ -213,22 +218,35 @@
|
|||||||
<CheckboxGroup legendText="片区" id="block" bind:selected={zoneSelected} required={true}>
|
<CheckboxGroup legendText="片区" id="block" bind:selected={zoneSelected} required={true}>
|
||||||
<Grid narrow>
|
<Grid narrow>
|
||||||
<Row>
|
<Row>
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="FX" labelText={ZoneMap['FX']} /></Column>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="BM" labelText={ZoneMap['BM']} /></Column>
|
<Checkbox value="FX" labelText={ZoneMap['FX']} />
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="DM" labelText={ZoneMap['DM']} /></Column>
|
</Column>
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="QT" labelText={ZoneMap['QT']} /></Column>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="XHAB" labelText={ZoneMap['XHAB']} /></Column>
|
<Checkbox value="BM" labelText={ZoneMap['BM']} />
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="XHCD" labelText={ZoneMap['XHCD']} /></Column>
|
</Column>
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="ZH" labelText={ZoneMap['ZH']} /></Column>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="other" labelText={ZoneMap['other']} /></Column>
|
<Checkbox value="DM" labelText={ZoneMap['DM']} />
|
||||||
|
</Column>
|
||||||
|
<Column sm={2} md={2} lg={4}>
|
||||||
|
<Checkbox value="QT" labelText={ZoneMap['QT']} />
|
||||||
|
</Column>
|
||||||
|
<Column sm={2} md={2} lg={4}>
|
||||||
|
<Checkbox value="XHAB" labelText={ZoneMap['XHAB']} />
|
||||||
|
</Column>
|
||||||
|
<Column sm={2} md={2} lg={4}>
|
||||||
|
<Checkbox value="XHCD" labelText={ZoneMap['XHCD']} />
|
||||||
|
</Column>
|
||||||
|
<Column sm={2} md={2} lg={4}>
|
||||||
|
<Checkbox value="ZH" labelText={ZoneMap['ZH']} />
|
||||||
|
</Column>
|
||||||
|
<Column sm={2} md={2} lg={4}>
|
||||||
|
<Checkbox value="other" labelText={ZoneMap['other']} />
|
||||||
|
</Column>
|
||||||
</Row>
|
</Row>
|
||||||
</Grid>
|
</Grid>
|
||||||
</CheckboxGroup>
|
</CheckboxGroup>
|
||||||
<div class="toggle">
|
<div class="toggle">
|
||||||
<Toggle
|
<Toggle size="sm" toggled={allSelected(zoneSelected, zoneOptions)} on:toggle={(e)=> {
|
||||||
size="sm"
|
|
||||||
toggled={allSelected(zoneSelected, zoneOptions)}
|
|
||||||
on:toggle={(e) => {
|
|
||||||
const { toggled } = e.detail as { toggled: boolean };
|
const { toggled } = e.detail as { toggled: boolean };
|
||||||
zoneSelected = toggled ? [...zoneOptions] : [];
|
zoneSelected = toggled ? [...zoneOptions] : [];
|
||||||
}}
|
}}
|
||||||
@@ -243,32 +261,31 @@
|
|||||||
<CheckboxGroup legendText="状态" id="status" bind:selected={req.status} required={true}>
|
<CheckboxGroup legendText="状态" id="status" bind:selected={req.status} required={true}>
|
||||||
<Grid narrow>
|
<Grid narrow>
|
||||||
<Row>
|
<Row>
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="fresh" labelText={StatusMap['fresh']} /></Column
|
<Column sm={2} md={2} lg={4}>
|
||||||
>
|
<Checkbox value="fresh" labelText={StatusMap['fresh']} />
|
||||||
<Column sm={2} md={2} lg={4}
|
</Column>
|
||||||
><Checkbox value="scheduled" labelText={StatusMap['scheduled']} /></Column
|
<Column sm={2} md={2} lg={4}>
|
||||||
>
|
<Checkbox value="scheduled" labelText={StatusMap['scheduled']} />
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="delay" labelText={StatusMap['delay']} /></Column
|
</Column>
|
||||||
>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Checkbox value="delay" labelText={StatusMap['delay']} />
|
||||||
><Checkbox value="escalated" labelText={StatusMap['escalated']} /></Column
|
</Column>
|
||||||
>
|
<Column sm={2} md={2} lg={4}>
|
||||||
{#if IsAdmin(CheckAndGetJWT('parsed').access)}
|
<Checkbox value="escalated" labelText={StatusMap['escalated']} />
|
||||||
<Column sm={2} md={2} lg={4}
|
</Column>
|
||||||
><Checkbox value="solved" labelText={StatusMap['solved']} /></Column
|
{#if IsAdmin(token.access)}
|
||||||
>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Checkbox value="solved" labelText={StatusMap['solved']} />
|
||||||
><Checkbox value="canceled" labelText={StatusMap['canceled']} /></Column
|
</Column>
|
||||||
>
|
<Column sm={2} md={2} lg={4}>
|
||||||
|
<Checkbox value="canceled" labelText={StatusMap['canceled']} />
|
||||||
|
</Column>
|
||||||
{/if}
|
{/if}
|
||||||
</Row>
|
</Row>
|
||||||
</Grid>
|
</Grid>
|
||||||
</CheckboxGroup>
|
</CheckboxGroup>
|
||||||
<div class="toggle">
|
<div class="toggle">
|
||||||
<Toggle
|
<Toggle size="sm" toggled={allSelected(req.status, statusOptions)} on:toggle={(e)=> {
|
||||||
size="sm"
|
|
||||||
toggled={allSelected(req.status, statusOptions)}
|
|
||||||
on:toggle={(e) => {
|
|
||||||
const { toggled } = e.detail as { toggled: boolean };
|
const { toggled } = e.detail as { toggled: boolean };
|
||||||
req.status = toggled ? [...statusOptions] : [];
|
req.status = toggled ? [...statusOptions] : [];
|
||||||
}}
|
}}
|
||||||
@@ -283,30 +300,29 @@
|
|||||||
<CheckboxGroup legendText="优先级" id="priority" bind:selected={req.priority} required={true}>
|
<CheckboxGroup legendText="优先级" id="priority" bind:selected={req.priority} required={true}>
|
||||||
<Grid narrow>
|
<Grid narrow>
|
||||||
<Row>
|
<Row>
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="highest" labelText="最高" /></Column>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Checkbox value="highest" labelText="最高" />
|
||||||
><Checkbox value="assigned" labelText={PriorityMap['assigned']} /></Column
|
</Column>
|
||||||
>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Checkbox value="assigned" labelText={PriorityMap['assigned']} />
|
||||||
><Checkbox value="mainline" labelText={PriorityMap['mainline']} /></Column
|
</Column>
|
||||||
>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Checkbox value="mainline" labelText={PriorityMap['mainline']} />
|
||||||
><Checkbox value="normal" labelText={PriorityMap['normal']} /></Column
|
</Column>
|
||||||
>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Checkbox value="normal" labelText={PriorityMap['normal']} />
|
||||||
><Checkbox value="in-passing" labelText={PriorityMap['in-passing']} /></Column
|
</Column>
|
||||||
>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Checkbox value="in-passing" labelText={PriorityMap['in-passing']} />
|
||||||
><Checkbox value="least" labelText={PriorityMap['least']} /></Column
|
</Column>
|
||||||
>
|
<Column sm={2} md={2} lg={4}>
|
||||||
|
<Checkbox value="least" labelText={PriorityMap['least']} />
|
||||||
|
</Column>
|
||||||
</Row>
|
</Row>
|
||||||
</Grid>
|
</Grid>
|
||||||
</CheckboxGroup>
|
</CheckboxGroup>
|
||||||
<div class="toggle">
|
<div class="toggle">
|
||||||
<Toggle
|
<Toggle size="sm" toggled={allSelected(req.priority, priorityOptions)} on:toggle={(e)=> {
|
||||||
size="sm"
|
|
||||||
toggled={allSelected(req.priority, priorityOptions)}
|
|
||||||
on:toggle={(e) => {
|
|
||||||
const { toggled } = e.detail as { toggled: boolean };
|
const { toggled } = e.detail as { toggled: boolean };
|
||||||
req.priority = toggled ? [...priorityOptions] : [];
|
req.priority = toggled ? [...priorityOptions] : [];
|
||||||
}}
|
}}
|
||||||
@@ -320,29 +336,26 @@
|
|||||||
<CheckboxGroup legendText="类型" id="category" bind:selected={req.category} required={true}>
|
<CheckboxGroup legendText="类型" id="category" bind:selected={req.category} required={true}>
|
||||||
<Grid narrow>
|
<Grid narrow>
|
||||||
<Row>
|
<Row>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Column sm={2} md={2} lg={4}>
|
||||||
><Checkbox value="first-install" labelText={CategoryMap['first-install']} /></Column
|
<Checkbox value="first-install" labelText={CategoryMap['first-install']} />
|
||||||
>
|
</Column>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Column sm={2} md={2} lg={4}>
|
||||||
><Checkbox value="client-or-account" labelText={CategoryMap['client-or-account']} /></Column
|
<Checkbox value="client-or-account" labelText={CategoryMap['client-or-account']} />
|
||||||
>
|
</Column>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Column sm={2} md={2} lg={4}>
|
||||||
><Checkbox value="ip-or-device" labelText={CategoryMap['ip-or-device']} /></Column
|
<Checkbox value="ip-or-device" labelText={CategoryMap['ip-or-device']} />
|
||||||
>
|
</Column>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Column sm={2} md={2} lg={4}>
|
||||||
><Checkbox value="low-speed" labelText={CategoryMap['low-speed']} /></Column
|
<Checkbox value="low-speed" labelText={CategoryMap['low-speed']} />
|
||||||
>
|
</Column>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Column sm={2} md={2} lg={4}>
|
||||||
><Checkbox value="others" labelText={CategoryMap['others']} /></Column
|
<Checkbox value="others" labelText={CategoryMap['others']} />
|
||||||
>
|
</Column>
|
||||||
</Row>
|
</Row>
|
||||||
</Grid>
|
</Grid>
|
||||||
</CheckboxGroup>
|
</CheckboxGroup>
|
||||||
<div class="toggle">
|
<div class="toggle">
|
||||||
<Toggle
|
<Toggle size="sm" toggled={allSelected(req.category, categoryOptions)} on:toggle={(e)=> {
|
||||||
size="sm"
|
|
||||||
toggled={allSelected(req.category, categoryOptions)}
|
|
||||||
on:toggle={(e) => {
|
|
||||||
const { toggled } = e.detail as { toggled: boolean };
|
const { toggled } = e.detail as { toggled: boolean };
|
||||||
req.category = toggled ? [...categoryOptions] : [];
|
req.category = toggled ? [...categoryOptions] : [];
|
||||||
}}
|
}}
|
||||||
@@ -357,24 +370,27 @@
|
|||||||
<CheckboxGroup legendText="运营商" id="isp" bind:selected={req.isp} required={true}>
|
<CheckboxGroup legendText="运营商" id="isp" bind:selected={req.isp} required={true}>
|
||||||
<Grid narrow>
|
<Grid narrow>
|
||||||
<Row>
|
<Row>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Column sm={2} md={2} lg={4}>
|
||||||
><Checkbox value="telecom" labelText={ISPMap['telecom']} /></Column
|
<Checkbox value="telecom" labelText={ISPMap['telecom']} />
|
||||||
>
|
</Column>
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="unicom" labelText={ISPMap['unicom']} /></Column>
|
<Column sm={2} md={2} lg={4}>
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="mobile" labelText={ISPMap['mobile']} /></Column>
|
<Checkbox value="unicom" labelText={ISPMap['unicom']} />
|
||||||
<Column sm={2} md={2} lg={4}><Checkbox value="others" labelText={ISPMap['others']} /></Column>
|
</Column>
|
||||||
<Column sm={2} md={2} lg={4}
|
<Column sm={2} md={2} lg={4}>
|
||||||
><Checkbox value="broadnet" labelText={ISPMap['broadnet']} hidden /></Column
|
<Checkbox value="mobile" labelText={ISPMap['mobile']} />
|
||||||
>
|
</Column>
|
||||||
|
<Column sm={2} md={2} lg={4}>
|
||||||
|
<Checkbox value="others" labelText={ISPMap['others']} />
|
||||||
|
</Column>
|
||||||
|
<Column sm={2} md={2} lg={4}>
|
||||||
|
<Checkbox value="broadnet" labelText={ISPMap['broadnet']} hidden />
|
||||||
|
</Column>
|
||||||
<!--暂时藏起来-->
|
<!--暂时藏起来-->
|
||||||
</Row>
|
</Row>
|
||||||
</Grid>
|
</Grid>
|
||||||
</CheckboxGroup>
|
</CheckboxGroup>
|
||||||
<div class="toggle">
|
<div class="toggle">
|
||||||
<Toggle
|
<Toggle size="sm" toggled={allSelected(req.isp, ispOptions)} on:toggle={(e)=> {
|
||||||
size="sm"
|
|
||||||
toggled={allSelected(req.isp, ispOptions)}
|
|
||||||
on:toggle={(e) => {
|
|
||||||
const { toggled } = e.detail as { toggled: boolean };
|
const { toggled } = e.detail as { toggled: boolean };
|
||||||
req.isp = toggled ? [...ispOptions] : [];
|
req.isp = toggled ? [...ispOptions] : [];
|
||||||
}}
|
}}
|
||||||
@@ -396,19 +412,12 @@
|
|||||||
|
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<NumberInput
|
<NumberInput min={1} max={20} step={1} bind:value={floor} allowEmpty={true} allowDecimal={false}
|
||||||
min={1}
|
labelText="只看如下楼层(不填代表查看全部楼层)" />
|
||||||
max={20}
|
|
||||||
step={1}
|
|
||||||
bind:value={floor}
|
|
||||||
allowEmpty={true}
|
|
||||||
allowDecimal={false}
|
|
||||||
labelText="只看如下楼层(不填代表查看全部楼层)"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<Toggle labelText="只显示预约在今天的预约单" bind:toggled={viewTodayScheduled} disabled={!isScheduledSelected}/>
|
<Toggle labelText="只显示预约在今天的预约单" bind:toggled={viewTodayScheduled} disabled={!isScheduledSelected} />
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<Button on:click={search}>搜索</Button>
|
<Button on:click={search}>搜索</Button>
|
||||||
|
|||||||
Reference in New Issue
Block a user