diff --git a/changelog.md b/changelog.md index 176e6deff5..7c6f724255 100644 --- a/changelog.md +++ b/changelog.md @@ -1,11 +1,21 @@ # Changelog -## 0.6.31 (upcoming) +## 0.6.32 (upcoming) + +## 0.6.31 Core: - Fix password change settings - Fix settings collapse +- Allow to add multiple enum values +- Fix password change issues +- Fix minxin query + +HR: + +- Talant with Active/Inactive Application filter +- Improve PTO table statistics ## 0.6.30 diff --git a/models/hr/src/index.ts b/models/hr/src/index.ts index 77762ccf2f..903a9cc023 100644 --- a/models/hr/src/index.ts +++ b/models/hr/src/index.ts @@ -14,8 +14,8 @@ // import { Employee } from '@anticrm/contact' -import { Arr, Class, Domain, DOMAIN_MODEL, IndexKind, Markup, Ref, Timestamp } from '@anticrm/core' -import { Department, DepartmentMember, hrId, Request, RequestType, Staff } from '@anticrm/hr' +import { Arr, Class, Domain, DOMAIN_MODEL, IndexKind, Markup, Ref, Type } from '@anticrm/core' +import { Department, DepartmentMember, hrId, Request, RequestType, Staff, TzDate } from '@anticrm/hr' import { ArrOf, Builder, @@ -25,7 +25,6 @@ import { Mixin, Model, Prop, - TypeDate, TypeIntlString, TypeMarkup, TypeRef, @@ -36,8 +35,8 @@ import attachment from '@anticrm/model-attachment' import calendar from '@anticrm/model-calendar' import chunter from '@anticrm/model-chunter' import contact, { TEmployee, TEmployeeAccount } from '@anticrm/model-contact' -import core, { TAttachedDoc, TDoc, TSpace } from '@anticrm/model-core' -import view, { createAction } from '@anticrm/model-view' +import core, { TAttachedDoc, TDoc, TSpace, TType } from '@anticrm/model-core' +import view, { classPresenter, createAction } from '@anticrm/model-view' import workbench from '@anticrm/model-workbench' import { Asset, IntlString } from '@anticrm/platform' import hr from './plugin' @@ -95,6 +94,22 @@ export class TRequestType extends TDoc implements RequestType { color!: number } +@Model(hr.class.TzDate, core.class.Type) +@UX(core.string.Timestamp) +export class TTzDate extends TType { + year!: number + month!: number + day!: number + offset!: number +} + +/** + * @public + */ +export function TypeTzDate (): Type { + return { _class: hr.class.TzDate, label: core.string.Timestamp } +} + @Model(hr.class.Request, core.class.AttachedDoc, DOMAIN_HR) @UX(hr.string.Request, hr.icon.PTO) export class TRequest extends TAttachedDoc implements Request { @@ -123,18 +138,15 @@ export class TRequest extends TAttachedDoc implements Request { @Index(IndexKind.FullText) description!: Markup - @Prop(TypeDate(false), calendar.string.Date) - date!: Timestamp + @Prop(TypeTzDate(), calendar.string.Date) + tzDate!: TzDate - @Prop(TypeDate(false), calendar.string.DueTo) - dueDate!: Timestamp - - // @Prop(TypeNumber(), calendar.string.Date) - timezoneOffset!: number + @Prop(TypeTzDate(), calendar.string.DueTo) + tzDueDate!: TzDate } export function createModel (builder: Builder): void { - builder.createModel(TDepartment, TDepartmentMember, TRequest, TRequestType, TStaff) + builder.createModel(TDepartment, TDepartmentMember, TRequest, TRequestType, TStaff, TTzDate) builder.createDoc( workbench.class.Application, @@ -183,6 +195,8 @@ export function createModel (builder: Builder): void { editor: hr.component.DepartmentStaff }) + classPresenter(builder, hr.class.TzDate, hr.component.TzDatePresenter, hr.component.TzDateEditor) + builder.createDoc( hr.class.RequestType, core.space.Model, @@ -337,6 +351,18 @@ export function createModel (builder: Builder): void { hr.viewlet.TableMember ) + builder.createDoc( + view.class.Viewlet, + core.space.Model, + { + attachTo: hr.mixin.Staff, + descriptor: view.viewlet.Table, + config: [''], + hiddenKeys: [] + }, + hr.viewlet.StaffStats + ) + createAction(builder, { action: view.actionImpl.ValueSelector, actionPopup: view.component.ValueSelector, @@ -359,6 +385,10 @@ export function createModel (builder: Builder): void { group: 'associate' } }) + + builder.mixin(hr.class.Request, core.class.Class, view.mixin.AttributePresenter, { + presenter: hr.component.RequestPresenter + }) } export { hrOperation } from './migration' diff --git a/models/hr/src/migration.ts b/models/hr/src/migration.ts index a873b1e31f..d7bb1ab16d 100644 --- a/models/hr/src/migration.ts +++ b/models/hr/src/migration.ts @@ -13,8 +13,9 @@ // limitations under the License. // -import { DOMAIN_TX, SortingOrder, TxCreateDoc, TxOperations, TxUpdateDoc } from '@anticrm/core' -import { Request } from '@anticrm/hr' +import { Employee } from '@anticrm/contact' +import { DOMAIN_TX, TxCollectionCUD, TxCreateDoc, TxOperations, TxUpdateDoc } from '@anticrm/core' +import { Request, TzDate } from '@anticrm/hr' import { MigrateOperation, MigrationClient, MigrationUpgradeClient } from '@anticrm/model' import core from '@anticrm/model-core' import hr, { DOMAIN_HR } from './index' @@ -40,102 +41,72 @@ async function createSpace (tx: TxOperations): Promise { } } -function toUTC (date: Date | number): number { +function toTzDate (date: number): TzDate { const res = new Date(date) - if (res.getUTCFullYear() !== res.getFullYear()) { - res.setUTCFullYear(res.getFullYear()) + return { + year: res.getFullYear(), + month: res.getMonth(), + day: res.getDate(), + offset: res.getTimezoneOffset() } - if (res.getUTCMonth() !== res.getMonth()) { - res.setUTCMonth(res.getMonth()) - } - if (res.getUTCDate() !== res.getDate()) { - res.setUTCDate(res.getDate()) - } - return res.setUTCHours(12, 0, 0, 0) -} - -function isDefault (date: number, due: number): boolean { - const start = new Date(date) - const end = new Date(due) - if (start.getDate() === end.getDate() && end.getHours() - start.getHours() === 12) { - return true - } - if (start.getDate() + 1 === end.getDate() && end.getHours() === start.getHours()) { - return true - } - return false } async function migrateRequestTime (client: MigrationClient, request: Request): Promise { - const date = toUTC(request.date) - const dueDate = isDefault(request.date, request.dueDate) ? date : toUTC(request.dueDate) + const date = toTzDate((request as any).date as unknown as number) + const dueDate = toTzDate((request as any).dueDate as unknown as number) await client.update( DOMAIN_HR, { _id: request._id }, { - date, - dueDate + tzDate: date, + tzDueDate: dueDate } ) - const updateDateTx = ( - await client.find>( - DOMAIN_TX, - { _class: core.class.TxUpdateDoc, objectId: request._id, 'operations.date': { $exists: true } }, - { sort: { modifiedOn: SortingOrder.Descending } } - ) - )[0] - if (updateDateTx !== undefined) { - const operations = updateDateTx.operations - operations.dueDate = date - await client.update( - DOMAIN_TX, - { _id: updateDateTx._id }, - { - operations - } - ) - } - const updateDueTx = ( - await client.find>( - DOMAIN_TX, - { _class: core.class.TxUpdateDoc, objectId: request._id, 'operations.dueDate': { $exists: true } }, - { sort: { modifiedOn: SortingOrder.Descending } } - ) - )[0] - if (updateDueTx !== undefined) { - const operations = updateDueTx.operations - operations.dueDate = dueDate - await client.update( - DOMAIN_TX, - { _id: updateDateTx._id }, - { - operations - } - ) - } + const txes = await client.find>(DOMAIN_TX, { + 'tx._class': { $in: [core.class.TxCreateDoc, core.class.TxUpdateDoc] }, + 'tx.objectId': request._id + }) - if (updateDueTx === undefined || updateDateTx === undefined) { - const createTx = ( - await client.find>( + for (const utx of txes) { + if (utx.tx._class === core.class.TxCreateDoc) { + const ctx = utx.tx as TxCreateDoc + const { date, dueDate, ...attributes } = ctx.attributes as any + await client.update( DOMAIN_TX, - { _class: core.class.TxCreateDoc, objectId: request._id }, - { sort: { modifiedOn: SortingOrder.Descending } } + { _id: utx._id }, + { + tx: { + ...ctx, + attributes: { + ...attributes, + tzDate: toTzDate(date as unknown as number), + tzDueDate: toTzDate((dueDate ?? date) as unknown as number) + } + } + } ) - )[0] - if (createTx !== undefined) { - const attributes = createTx.attributes - if (updateDateTx === undefined) { - attributes.date = date + } + if (utx.tx._class === core.class.TxUpdateDoc) { + const ctx = utx.tx as TxUpdateDoc + const { date, dueDate, ...operations } = ctx.operations as any + const ops: any = { + ...operations } - if (updateDueTx === undefined) { - attributes.dueDate = dueDate + if (date !== undefined) { + ops.tzDate = toTzDate(date as unknown as number) + } + if (dueDate !== undefined) { + ops.tzDueDate = toTzDate(dueDate as unknown as number) } await client.update( DOMAIN_TX, - { _id: createTx._id }, + { _id: utx._id }, { - attributes + tx: { + ...ctx, + operations: ops + } } ) } @@ -143,7 +114,34 @@ async function migrateRequestTime (client: MigrationClient, request: Request): P } async function migrateTime (client: MigrationClient): Promise { - const requests = await client.find(DOMAIN_HR, { _class: hr.class.Request }) + const createTxes = await client.find>(DOMAIN_TX, { + _class: core.class.TxCreateDoc, + objectClass: hr.class.Request + }) + for (const tx of createTxes) { + await client.update( + DOMAIN_TX, + { _id: tx._id }, + { + _class: core.class.TxCollectionCUD, + tx: tx, + collection: tx.attributes.collection, + objectId: tx.attributes.attachedTo, + objectClass: tx.attributes.attachedToClass + } + ) + await client.update( + DOMAIN_TX, + { _id: tx._id }, + { + $unset: { + attributes: '' + } + } + ) + } + + const requests = await client.find(DOMAIN_HR, { _class: hr.class.Request, tzDate: { $exists: false } }) for (const request of requests) { await migrateRequestTime(client, request) } diff --git a/models/hr/src/plugin.ts b/models/hr/src/plugin.ts index 39f07c5821..3248b33135 100644 --- a/models/hr/src/plugin.ts +++ b/models/hr/src/plugin.ts @@ -39,7 +39,10 @@ export default mergeIds(hrId, hr, { DepartmentStaff: '' as AnyComponent, DepartmentEditor: '' as AnyComponent, Schedule: '' as AnyComponent, - EditRequest: '' as AnyComponent + EditRequest: '' as AnyComponent, + TzDatePresenter: '' as AnyComponent, + TzDateEditor: '' as AnyComponent, + RequestPresenter: '' as AnyComponent }, category: { HR: '' as Ref diff --git a/packages/model/src/migration.ts b/packages/model/src/migration.ts index 7c09eeea8e..1f8aad02a3 100644 --- a/packages/model/src/migration.ts +++ b/packages/model/src/migration.ts @@ -1,4 +1,5 @@ import { + ArrayAsElementPosition, Client, Doc, DocumentQuery, @@ -6,16 +7,25 @@ import { FindOptions, IncOptions, ObjQueryType, + OmitNever, PushOptions, Ref } from '@anticrm/core' +/** + * @public + */ +export interface UnsetOptions { + $unset?: Partial>>> +} + /** * @public */ export type MigrateUpdate = Partial & Omit, '$move'> & -IncOptions & { +IncOptions & +UnsetOptions & { // For any other mongo stuff [key: string]: any } diff --git a/packages/ui/src/components/Component.svelte b/packages/ui/src/components/Component.svelte index 9d5200630d..7e3953a897 100644 --- a/packages/ui/src/components/Component.svelte +++ b/packages/ui/src/components/Component.svelte @@ -23,13 +23,16 @@ export let is: AnyComponent export let props = {} export let shrink: boolean = false + export let showLoading = true $: component = is != null ? getResource(is) : Promise.reject(new Error('is not defined')) {#if is} {#await component} - + {#if showLoading} + + {/if} {:then Ctor} diff --git a/plugins/hr-resources/src/components/CreateRequest.svelte b/plugins/hr-resources/src/components/CreateRequest.svelte index bb5a9e169f..f27e49253b 100644 --- a/plugins/hr-resources/src/components/CreateRequest.svelte +++ b/plugins/hr-resources/src/components/CreateRequest.svelte @@ -22,7 +22,7 @@ import ui, { Button, DateRangePresenter, DropdownLabelsIntl, IconAttachment } from '@anticrm/ui' import { createEventDispatcher } from 'svelte' import hr from '../plugin' - import { toUTC } from '../utils' + import { toTzDate } from '../utils' export let staff: Staff export let date: Date @@ -59,15 +59,11 @@ if (value != null) date = value if (date === undefined) return if (type === undefined) return - await client.createDoc(hr.class.Request, staff.department, { - attachedTo: staff._id, - attachedToClass: staff._class, + await client.addCollection(hr.class.Request, staff.department, staff._id, staff._class, 'requests', { type: type._id, - date: toUTC(date), - dueDate: toUTC(dueDate), - description, - collection: 'requests', - timezoneOffset: new Date(date).getTimezoneOffset() + tzDate: toTzDate(new Date(date)), + tzDueDate: toTzDate(new Date(dueDate)), + description }) await descriptionBox.createAttachments() } diff --git a/plugins/hr-resources/src/components/RequestPresenter.svelte b/plugins/hr-resources/src/components/RequestPresenter.svelte new file mode 100644 index 0000000000..fc91943302 --- /dev/null +++ b/plugins/hr-resources/src/components/RequestPresenter.svelte @@ -0,0 +1,44 @@ + + + +{#if type && value != null} +
+
+
+ {#if value.tzDate && tzDateEqual(value.tzDate, value.tzDueDate)} + + {:else if value.tzDate} + + {#if value.tzDueDate} + + {/if} + {/if} +
+{/if} diff --git a/plugins/hr-resources/src/components/RequestsPopup.svelte b/plugins/hr-resources/src/components/RequestsPopup.svelte index 3b01d511c6..3db1660b6a 100644 --- a/plugins/hr-resources/src/components/RequestsPopup.svelte +++ b/plugins/hr-resources/src/components/RequestsPopup.svelte @@ -14,21 +14,17 @@ --> diff --git a/plugins/hr-resources/src/components/Schedule.svelte b/plugins/hr-resources/src/components/Schedule.svelte index cbaff39b3f..035fe0336c 100644 --- a/plugins/hr-resources/src/components/Schedule.svelte +++ b/plugins/hr-resources/src/components/Schedule.svelte @@ -17,12 +17,10 @@ import calendar from '@anticrm/calendar-resources/src/plugin' import { Ref } from '@anticrm/core' import { Department } from '@anticrm/hr' - import { getEmbeddedLabel } from '@anticrm/platform' import { createQuery, SpaceSelector } from '@anticrm/presentation' import { Button, Icon, IconBack, IconForward, Label } from '@anticrm/ui' import view from '@anticrm/view' import hr from '../plugin' - import { tableToCSV } from '../utils' import ScheduleMonthView from './ScheduleView.svelte' let department = hr.ids.Head @@ -140,23 +138,6 @@ }} /> - {#if display === 'stats'} -
it._id) } }} - {config} - {options} - /> + {#if descr} + {#if loading} + + {:else} +
+
+ +
+
+
it._id) } }} + config={createConfig(descr, preference)} + options={descr.options} + /> + {/if} + {/if} {:else} diff --git a/plugins/hr-resources/src/components/schedule/MonthView.svelte b/plugins/hr-resources/src/components/schedule/MonthView.svelte index c622e026c0..55c6acd26d 100644 --- a/plugins/hr-resources/src/components/schedule/MonthView.svelte +++ b/plugins/hr-resources/src/components/schedule/MonthView.svelte @@ -32,20 +32,20 @@ tooltip } from '@anticrm/ui' import hr from '../../plugin' + import { fromTzDate, getTotal } from '../../utils' import CreateRequest from '../CreateRequest.svelte' import RequestsPopup from '../RequestsPopup.svelte' import ScheduleRequests from '../ScheduleRequests.svelte' export let currentDate: Date = new Date() - export let startDate: number - export let endDate: number + export let startDate: Date export let departmentStaff: Staff[] - export let types: Map, RequestType> export let employeeRequests: Map, Request[]> export let teamLead: Ref | undefined + export let types: Map, RequestType> const todayDate = new Date() @@ -56,7 +56,7 @@ const time = date.getTime() const endTime = getEndDate(date) for (const request of requests) { - if (request.date <= endTime && request.dueDate > time) { + if (fromTzDate(request.tzDate) <= endTime && fromTzDate(request.tzDueDate) > time) { res.push(request) } } @@ -85,15 +85,14 @@ } function getEndDate (date: Date): number { - return new Date(date).setDate(date.getDate() + 1) - 1 + return new Date(date).setDate(date.getDate() + 1) } - function getTooltip (requests: Request[], employee: Staff, date: Date): LabelAndProps | undefined { + function getTooltip (requests: Request[]): LabelAndProps | undefined { if (requests.length === 0) return - const endDate = getEndDate(date) return { component: RequestsPopup, - props: { date, endDate, employee: employee._id } + props: { requests: requests.map((it) => it._id) } } } @@ -110,8 +109,9 @@ + {#each values as value, i} - {@const day = getDay(new Date(startDate), value)} + {@const day = getDay(startDate, value)} {#each departmentStaff as employee, row} + {@const requests = employeeRequests.get(employee._id) ?? []} + {#each values as value, i} - {@const date = getDay(new Date(startDate), value)} + {@const date = getDay(startDate, value)} {@const requests = getRequests(employee._id, date)} {@const editable = isEditable(employee)} - {@const tooltipValue = getTooltip(requests, employee, date)} + {@const tooltipValue = getTooltip(requests)} {#key [tooltipValue, editable]}
#
+ {getTotal(requests, types)} + , Request[]> export let display: (requests: Request[]) => number | string export let month: Date - - function getEndDate (date: Date): number { - return new Date(date).setMonth(date.getMonth() + 1) - } - - function getRequests (employee: Ref, date: Date): Request[] { - const requests = employeeRequests.get(employee) - if (requests === undefined) return [] - const res: Request[] = [] - const time = date.getTime() - const endTime = getEndDate(date) - for (const request of requests) { - if (request.date <= endTime && request.dueDate > time) { - res.push(request) - } - } - return res - } + export let getRequests: (employee: Ref, date: Date) => Request[] $: reqs = getRequests(value._id, month) $: _value = display(reqs) diff --git a/plugins/hr-resources/src/components/schedule/YearView.svelte b/plugins/hr-resources/src/components/schedule/YearView.svelte index 5b314f558f..7ea6b2214a 100644 --- a/plugins/hr-resources/src/components/schedule/YearView.svelte +++ b/plugins/hr-resources/src/components/schedule/YearView.svelte @@ -19,7 +19,7 @@ import type { Request, RequestType, Staff } from '@anticrm/hr' import { Label, LabelAndProps, Scroller, tooltip } from '@anticrm/ui' import hr from '../../plugin' - import { getMonth, getTotal, weekDays } from '../../utils' + import { fromTzDate, getMonth, getTotal, weekDays } from '../../utils' import RequestsPopup from '../RequestsPopup.svelte' export let currentDate: Date = new Date() @@ -38,7 +38,7 @@ const time = date.getTime() const endTime = getEndDate(date) for (const request of requests) { - if (request.date <= endTime && request.dueDate > time) { + if (fromTzDate(request.tzDate) <= endTime && fromTzDate(request.tzDueDate) > time) { res.push(request) } } @@ -49,12 +49,11 @@ return new Date(date).setMonth(date.getMonth() + 1) } - function getTooltip (requests: Request[], employee: Staff, date: Date): LabelAndProps | undefined { + function getTooltip (requests: Request[]): LabelAndProps | undefined { if (requests.length === 0) return - const endDate = getEndDate(date) return { component: RequestsPopup, - props: { date, endDate, employee: employee._id } + props: { requests: requests.map((it) => it._id) } } } @@ -119,7 +118,7 @@ {#each values as value, i} {@const month = getMonth(currentDate, value)} {@const requests = getRequests(employeeRequests, employee._id, month)} - {@const tooltipValue = getTooltip(requests, employee, month)} + {@const tooltipValue = getTooltip(requests)} {#key tooltipValue} => ({ component: { @@ -28,6 +31,9 @@ export default async (): Promise => ({ DepartmentStaff, DepartmentEditor, Schedule, - EditRequest + EditRequest, + TzDatePresenter, + TzDateEditor, + RequestPresenter } }) diff --git a/plugins/hr-resources/src/utils.ts b/plugins/hr-resources/src/utils.ts index 868dde6341..2ad1bb17d7 100644 --- a/plugins/hr-resources/src/utils.ts +++ b/plugins/hr-resources/src/utils.ts @@ -1,6 +1,6 @@ import { Employee, formatName } from '@anticrm/contact' import { Ref, TxOperations } from '@anticrm/core' -import { Department, Request, RequestType } from '@anticrm/hr' +import { Department, Request, RequestType, TzDate } from '@anticrm/hr' import { MessageBox } from '@anticrm/presentation' import { showPopup } from '@anticrm/ui' import hr from './plugin' @@ -56,18 +56,27 @@ export async function addMember (client: TxOperations, employee?: Employee, valu /** * @public */ -export function toUTC (date: Date | number, hours = 12, mins = 0, sec = 0): number { - const res = new Date(date) - if (res.getUTCFullYear() !== res.getFullYear()) { - res.setUTCFullYear(res.getFullYear()) +export function toTzDate (date: Date): TzDate { + return { + year: date.getFullYear(), + month: date.getMonth(), + day: date.getDate(), + offset: date.getTimezoneOffset() } - if (res.getUTCMonth() !== res.getMonth()) { - res.setUTCMonth(res.getMonth()) - } - if (res.getUTCDate() !== res.getDate()) { - res.setUTCDate(res.getDate()) - } - return res.setUTCHours(hours, mins, sec, 0) +} + +/** + * @public + */ +export function fromTzDate (tzDate: TzDate): number { + return new Date().setFullYear(tzDate?.year ?? 0, tzDate.month, tzDate.day) +} + +/** + * @public + */ +export function tzDateEqual (tzDate: TzDate, tzDate2: TzDate): boolean { + return tzDate.year === tzDate2.year && tzDate.month === tzDate2.month && tzDate.day === tzDate2.day } /** @@ -97,11 +106,9 @@ export function getTotal ( let total = 0 for (const request of requests) { const type = types.get(request.type) - let days = Math.abs((request.dueDate - request.date) / 1000 / 60 / 60 / 24) - if (days === 0) { - days = 1 - } - const stDate = new Date(request.date) + const days = + Math.floor(Math.abs((1 + fromTzDate(request.tzDueDate) - fromTzDate(request.tzDate)) / 1000 / 60 / 60 / 24)) + 1 + const stDate = new Date(fromTzDate(request.tzDate)) const stDateDate = stDate.getDate() let ds = Array.from(Array(days).keys()).map((it) => stDateDate + it) if ((type?.value ?? -1) < 0) { diff --git a/plugins/hr/src/index.ts b/plugins/hr/src/index.ts index d8598fb871..e9ffa03da9 100644 --- a/plugins/hr/src/index.ts +++ b/plugins/hr/src/index.ts @@ -14,7 +14,7 @@ // import type { Employee, EmployeeAccount } from '@anticrm/contact' -import type { Arr, AttachedDoc, Class, Doc, Markup, Mixin, Ref, Space, Timestamp } from '@anticrm/core' +import type { Arr, AttachedDoc, Class, Doc, Markup, Mixin, Ref, Space, Type } from '@anticrm/core' import type { Asset, IntlString, Plugin } from '@anticrm/platform' import { plugin } from '@anticrm/platform' import { Viewlet } from '@anticrm/view' @@ -54,6 +54,16 @@ export interface RequestType extends Doc { color: number } +/** + * @public + */ +export interface TzDate { + year: number + month: number + day: number + offset: number +} + /** * @public */ @@ -71,11 +81,8 @@ export interface Request extends AttachedDoc { attachments?: number // Date always in UTC - date: Timestamp - dueDate: Timestamp - - // Timezone offset in minutes. - timezoneOffset: number + tzDate: TzDate + tzDueDate: TzDate } /** @@ -94,7 +101,8 @@ const hr = plugin(hrId, { Department: '' as Ref>, DepartmentMember: '' as Ref>, Request: '' as Ref>, - RequestType: '' as Ref> + RequestType: '' as Ref>, + TzDate: '' as Ref>> }, mixin: { Staff: '' as Ref> @@ -121,7 +129,8 @@ const hr = plugin(hrId, { Overtime2: '' as Ref }, viewlet: { - TableMember: '' as Ref + TableMember: '' as Ref, + StaffStats: '' as Ref } }) diff --git a/plugins/tracker-resources/src/components/ProjectSelector.svelte b/plugins/tracker-resources/src/components/ProjectSelector.svelte index e9fe226952..c634548efa 100644 --- a/plugins/tracker-resources/src/components/ProjectSelector.svelte +++ b/plugins/tracker-resources/src/components/ProjectSelector.svelte @@ -14,7 +14,7 @@ --> -{#if onlyIcon} - -{/if} +