35 lines
1.4 KiB
TypeScript
35 lines
1.4 KiB
TypeScript
|
|
import { type InjectionKey, type Ref, inject, provide, ref } from 'vue';
|
|||
|
|
|
|||
|
|
interface WorkbenchWorklogSignal {
|
|||
|
|
/** 递增版本号:工时类 widget watch 它触发重拉 */
|
|||
|
|
revision: Ref<number>;
|
|||
|
|
/** 任一 widget 内联填报/修改工时后调用,广播给同一工作台内的工时类 widget */
|
|||
|
|
notify: () => void;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const WORKBENCH_WORKLOG_SIGNAL: InjectionKey<WorkbenchWorklogSignal> = Symbol('workbench-worklog-signal');
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 工作台内联填报工时的跨 widget 刷新信号。
|
|||
|
|
*
|
|||
|
|
* todo 面板等 widget 可在工作台路由内弹层填报工时,不触发工作台 keepAlive 的 onActivated,
|
|||
|
|
* 「我的工时」widget 因此停在旧数据。用 provide/inject 在工作台根广播一个版本号,
|
|||
|
|
* 填报方 notify、展示方 watch revision 重拉,作用域限定在工作台子树、不进全局 store。
|
|||
|
|
*/
|
|||
|
|
export function provideWorkbenchWorklogSignal(): WorkbenchWorklogSignal {
|
|||
|
|
const revision = ref(0);
|
|||
|
|
const signal: WorkbenchWorklogSignal = {
|
|||
|
|
revision,
|
|||
|
|
notify: () => {
|
|||
|
|
revision.value += 1;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
provide(WORKBENCH_WORKLOG_SIGNAL, signal);
|
|||
|
|
return signal;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/** widget 内消费:notify 上报变更、revision 供 watch 重拉;脱离工作台根时退化为无操作 */
|
|||
|
|
export function useWorkbenchWorklogSignal(): WorkbenchWorklogSignal {
|
|||
|
|
return inject(WORKBENCH_WORKLOG_SIGNAL, { revision: ref(0), notify: () => {} });
|
|||
|
|
}
|